diff --git a/src/file-list-printer.js b/src/file-list-printer.js index c7a36fb..18ccbbe 100644 --- a/src/file-list-printer.js +++ b/src/file-list-printer.js @@ -9,34 +9,34 @@ var printerUtils = require('./printer-utils.js').PrinterUtils; + var hoganUtils = require('./hoganjs-utils.js').HoganJsUtils; + var baseTemplatesPath = 'file-summary'; + var iconsBaseTemplatesPath = 'icon'; + function FileListPrinter() { } FileListPrinter.prototype.generateFileList = function(diffFiles) { - return '
\n' + - '
\n' + - ' Files changed (' + diffFiles.length + ')  \n' + - ' hide\n' + - ' show\n' + - '
\n' + - ' \n' + + var lineTemplate = hoganUtils.template(baseTemplatesPath, 'line'); - diffFiles.map(function(file) { - return ' \n' + - ' \n' + - ' \n' + - ' \n' + - ' \n'; - }).join('\n') + - '
\n' + - ' +' + file.addedLines + '\n' + - ' \n' + - ' -' + file.deletedLines + '\n' + - ' \n' + - ' ' + - ' ' + printerUtils.getDiffName(file) + - ' \n' + - '
\n'; + var files = diffFiles.map(function(file) { + var fileTypeName = printerUtils.getFileTypeIcon(file); + var iconTemplate = hoganUtils.template(iconsBaseTemplatesPath, fileTypeName); + + return lineTemplate.render({ + fileHtmlId: printerUtils.getHtmlId(file), + fileName: printerUtils.getDiffName(file), + deletedLines: '-' + file.deletedLines, + addedLines: '+' + file.addedLines + }, { + fileIcon: iconTemplate + }); + }).join('\n'); + + return hoganUtils.render(baseTemplatesPath, 'wrapper', { + filesNumber: diffFiles.length, + files: files + }); }; module.exports.FileListPrinter = new FileListPrinter(); diff --git a/src/hoganjs-utils.js b/src/hoganjs-utils.js index 0f050d7..70a5d12 100644 --- a/src/hoganjs-utils.js +++ b/src/hoganjs-utils.js @@ -20,10 +20,7 @@ } HoganJsUtils.prototype.render = function(namespace, view, params, configuration) { - var config = configuration || {}; - var templateKey = this._templateKey(namespace, view); - - var template = this._getTemplate(templateKey, config); + var template = this.template(namespace, view, configuration); if (template) { return template.render(params); } @@ -31,6 +28,13 @@ return null; }; + HoganJsUtils.prototype.template = function(namespace, view, configuration) { + var config = configuration || {}; + var templateKey = this._templateKey(namespace, view); + + return this._getTemplate(templateKey, config); + }; + HoganJsUtils.prototype._getTemplate = function(templateKey, config) { var template; diff --git a/src/line-by-line-printer.js b/src/line-by-line-printer.js index 401cb22..6e7e4e6 100644 --- a/src/line-by-line-printer.js +++ b/src/line-by-line-printer.js @@ -13,23 +13,36 @@ var Rematch = require('./rematch.js').Rematch; var hoganUtils = require('./hoganjs-utils.js').HoganJsUtils; + var genericTemplatesPath = 'generic'; var baseTemplatesPath = 'line-by-line'; + var iconsBaseTemplatesPath = 'icon'; + var tagsBaseTemplatesPath = 'tag'; function LineByLinePrinter(config) { this.config = config; } LineByLinePrinter.prototype.makeFileDiffHtml = function(file, diffs) { - return hoganUtils.render(baseTemplatesPath, 'file-diff', { + var fileDiffTemplate = hoganUtils.template(baseTemplatesPath, 'file-diff'); + var filePathTemplate = hoganUtils.template(genericTemplatesPath, 'file-path'); + var fileIconTemplate = hoganUtils.template(iconsBaseTemplatesPath, 'file'); + var fileTagTemplate = hoganUtils.template(tagsBaseTemplatesPath, printerUtils.getFileTypeIcon(file)); + + return fileDiffTemplate.render({ file: file, - fileDiffName: printerUtils.getDiffName(file), fileHtmlId: printerUtils.getHtmlId(file), - diffs: diffs + diffs: diffs, + filePath: filePathTemplate.render({ + fileDiffName: printerUtils.getDiffName(file) + }, { + fileIcon: fileIconTemplate, + fileTag: fileTagTemplate + }) }); }; LineByLinePrinter.prototype.makeLineByLineHtmlWrapper = function(content) { - return hoganUtils.render(baseTemplatesPath, 'wrapper', {'content': content}); + return hoganUtils.render(genericTemplatesPath, 'wrapper', {'content': content}); }; LineByLinePrinter.prototype.generateLineByLineJsonHtml = function(diffFiles) { @@ -55,9 +68,11 @@ }); LineByLinePrinter.prototype.makeColumnLineNumberHtml = function(block) { - return hoganUtils.render(baseTemplatesPath, 'column-line-number', { + return hoganUtils.render(genericTemplatesPath, 'column-line-number', { diffParser: diffParser, - block: utils.escape(block.header) + blockHeader: block.header, + lineClass: 'd2h-code-linenumber', + contentClass: 'd2h-code-line' }); }; @@ -170,18 +185,25 @@ }; LineByLinePrinter.prototype.makeLineHtml = function(type, oldNumber, newNumber, content, prefix) { - return hoganUtils.render(baseTemplatesPath, 'line', + var lineNumberTemplate = hoganUtils.render(baseTemplatesPath, 'numbers', { + oldNumber: utils.valueOrEmpty(oldNumber), + newNumber: utils.valueOrEmpty(newNumber) + }); + + return hoganUtils.render(genericTemplatesPath, 'line', { type: type, - oldNumber: utils.valueOrEmpty(oldNumber), - newNumber: utils.valueOrEmpty(newNumber), + lineClass: 'd2h-code-linenumber', + contentClass: 'd2h-code-line', prefix: prefix && utils.convertWhiteSpaceToNonBreakingSpace(prefix), - content: content && utils.convertWhiteSpaceToNonBreakingSpace(content) + content: content && utils.convertWhiteSpaceToNonBreakingSpace(content), + lineNumber: lineNumberTemplate }); }; LineByLinePrinter.prototype._generateEmptyDiff = function() { - return hoganUtils.render(baseTemplatesPath, 'empty-diff', { + return hoganUtils.render(genericTemplatesPath, 'empty-diff', { + contentClass: 'd2h-code-line', diffParser: diffParser }); }; diff --git a/src/printer-utils.js b/src/printer-utils.js index adf879e..1add31c 100644 --- a/src/printer-utils.js +++ b/src/printer-utils.js @@ -95,6 +95,25 @@ return 'unknown/file/path'; }; + PrinterUtils.prototype.getFileTypeIcon = function(file) { + var templateName = 'file-changed'; + + if (file.isRename) { + templateName = 'file-renamed'; + } else if (file.isCopy) { + templateName = 'file-renamed'; + } else if (file.isNew) { + templateName = 'file-added'; + } else if (file.isDeleted) { + templateName = 'file-deleted'; + } else if (file.newName !== file.oldName) { + // If file is not Added, not Deleted and the names changed it must be a rename :) + templateName = 'file-renamed'; + } + + return templateName; + }; + PrinterUtils.prototype.diffHighlight = function(diffLine1, diffLine2, config) { var linePrefix1, linePrefix2, unprefixedLine1, unprefixedLine2; diff --git a/src/side-by-side-printer.js b/src/side-by-side-printer.js index fbf2360..c990842 100644 --- a/src/side-by-side-printer.js +++ b/src/side-by-side-printer.js @@ -12,6 +12,12 @@ var utils = require('./utils.js').Utils; var Rematch = require('./rematch.js').Rematch; + var hoganUtils = require('./hoganjs-utils.js').HoganJsUtils; + var genericTemplatesPath = 'generic'; + var baseTemplatesPath = 'side-by-side'; + var iconsBaseTemplatesPath = 'icon'; + var tagsBaseTemplatesPath = 'tag'; + var matcher = Rematch.rematch(function(a, b) { var amod = a.content.substr(1); var bmod = b.content.substr(1); @@ -24,67 +30,48 @@ } SideBySidePrinter.prototype.makeDiffHtml = function(file, diffs) { - return '
\n' + - '
\n' + - ' \n' + - ' \n' + - ' +' + file.addedLines + '\n' + - ' \n' + - ' \n' + - ' -' + file.deletedLines + '\n' + - ' \n' + - ' \n' + - ' \n' + - ' ' + printerUtils.getDiffName(file) + '\n' + - ' \n' + - '
\n' + - '
\n' + - '
\n' + - '
\n' + - ' \n' + - ' \n' + - ' ' + diffs.left + - ' \n' + - '
\n' + - '
\n' + - '
\n' + - '
\n' + - '
\n' + - ' \n' + - ' \n' + - ' ' + diffs.right + - ' \n' + - '
\n' + - '
\n' + - '
\n' + - '
\n' + - '
\n'; + var fileDiffTemplate = hoganUtils.template(baseTemplatesPath, 'file-diff'); + var filePathTemplate = hoganUtils.template(genericTemplatesPath, 'file-path'); + var fileIconTemplate = hoganUtils.template(iconsBaseTemplatesPath, 'file'); + var fileTagTemplate = hoganUtils.template(tagsBaseTemplatesPath, printerUtils.getFileTypeIcon(file)); + + return fileDiffTemplate.render({ + file: file, + fileHtmlId: printerUtils.getHtmlId(file), + diffs: diffs, + filePath: filePathTemplate.render({ + fileDiffName: printerUtils.getDiffName(file) + }, { + fileIcon: fileIconTemplate, + fileTag: fileTagTemplate + }) + }); }; SideBySidePrinter.prototype.generateSideBySideJsonHtml = function(diffFiles) { var that = this; - return '
\n' + - diffFiles.map(function(file) { - var diffs; - if (file.blocks.length) { - diffs = that.generateSideBySideFileHtml(file); - } else { - diffs = that.generateEmptyDiff(); - } + var content = diffFiles.map(function(file) { + var diffs; + if (file.blocks.length) { + diffs = that.generateSideBySideFileHtml(file); + } else { + diffs = that.generateEmptyDiff(); + } - return that.makeDiffHtml(file, diffs); - }).join('\n') + - '
\n'; + return that.makeDiffHtml(file, diffs); + }).join('\n'); + + return hoganUtils.render(genericTemplatesPath, 'wrapper', {'content': content}); }; SideBySidePrinter.prototype.makeSideHtml = function(blockHeader) { - return '\n' + - ' \n' + - ' \n' + - '
' + blockHeader + '
\n' + - ' \n' + - '\n'; + return hoganUtils.render(genericTemplatesPath, 'column-line-number', { + diffParser: diffParser, + blockHeader: blockHeader, + lineClass: 'd2h-code-side-linenumber', + contentClass: 'd2h-code-side-line' + }); }; SideBySidePrinter.prototype.generateSideBySideFileHtml = function(file) { @@ -95,7 +82,7 @@ file.blocks.forEach(function(block) { - fileHtml.left += that.makeSideHtml(utils.escape(block.header)); + fileHtml.left += that.makeSideHtml(block.header); fileHtml.right += that.makeSideHtml(''); var oldLines = []; @@ -109,7 +96,7 @@ var comparisons = oldLines.length * newLines.length; var maxComparisons = that.config.matchingMaxComparisons || 2500; var doMatching = comparisons < maxComparisons && (that.config.matching === 'lines' || - that.config.matching === 'words'); + that.config.matching === 'words'); if (doMatching) { matches = matcher(oldLines, newLines); @@ -232,40 +219,26 @@ return fileHtml; }; - SideBySidePrinter.prototype.makeSingleLineHtml = function(type, number, htmlContent, htmlPrefix) { - return '\n' + - ' ' + number + '\n' + - ' ' + - '
' + htmlPrefix + htmlContent + '
' + - ' \n' + - ' \n'; - }; - SideBySidePrinter.prototype.generateSingleLineHtml = function(type, number, content, prefix) { - var htmlPrefix = ''; - if (prefix) { - htmlPrefix = '' + prefix + ''; - } - - var htmlContent = ''; - if (content) { - htmlContent = '' + content + ''; - } - - return this.makeSingleLineHtml(type, number, htmlContent, htmlPrefix); + return hoganUtils.render(genericTemplatesPath, 'line', + { + type: type, + lineClass: 'd2h-code-side-linenumber', + contentClass: 'd2h-code-side-line', + prefix: prefix && utils.convertWhiteSpaceToNonBreakingSpace(prefix), + content: content && utils.convertWhiteSpaceToNonBreakingSpace(content), + lineNumber: number + }); }; SideBySidePrinter.prototype.generateEmptyDiff = function() { var fileHtml = {}; fileHtml.right = ''; - fileHtml.left = '\n' + - ' ' + - '
' + - 'File without changes' + - '
' + - ' \n' + - '\n'; + fileHtml.left = hoganUtils.render(genericTemplatesPath, 'empty-diff', { + contentClass: 'd2h-code-side-line', + diffParser: diffParser + }); return fileHtml; }; diff --git a/src/templates/diff2html-templates.js b/src/templates/diff2html-templates.js index 02c0991..05d9ba8 100644 --- a/src/templates/diff2html-templates.js +++ b/src/templates/diff2html-templates.js @@ -1,9 +1,23 @@ (function() { if (!!!global.browserTemplates) global.browserTemplates = {}; -var Hogan = require("hogan.js");global.browserTemplates["line-by-line-column-line-number"] = new Hogan.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b("
");t.b(t.t(t.f("blockHeader",c,p,0)));t.b("
");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b("");return t.fl(); },partials: {}, subs: { }}); -global.browserTemplates["line-by-line-empty-diff"] = new Hogan.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b("
");t.b("\n" + i);t.b(" File without changes");t.b("\n" + i);t.b("
");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b("");return t.fl(); },partials: {}, subs: { }}); -global.browserTemplates["line-by-line-file-diff"] = new Hogan.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("
");t.b("\n" + i);t.b("
");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b(" +");t.b(t.v(t.d("file.addedLines",c,p,0)));t.b("");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b(" -");t.b(t.v(t.d("file.deletedLines",c,p,0)));t.b("");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b("  ");t.b(t.v(t.f("fileDiffName",c,p,0)));t.b("");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b("
");t.b("\n" + i);t.b("
");t.b("\n" + i);t.b("
");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b(" ");t.b(t.t(t.f("diffs",c,p,0)));t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b("
");t.b("\n" + i);t.b("
");t.b("\n" + i);t.b("
");t.b("\n" + i);t.b("
");return t.fl(); },partials: {}, subs: { }}); -global.browserTemplates["line-by-line-line"] = new Hogan.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b("
");t.b(t.v(t.f("oldNumber",c,p,0)));t.b("
");t.b("\n" + i);t.b("
");t.b(t.v(t.f("newNumber",c,p,0)));t.b("
");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b("
");t.b("\n" + i);if(t.s(t.f("prefix",c,p,1),c,p,0,253,329,"{{ }}")){t.rs(c,p,function(c,p,t){t.b(" ");t.b(t.t(t.f("prefix",c,p,0)));t.b("");t.b("\n" + i);});c.pop();}if(t.s(t.f("content",c,p,1),c,p,0,361,435,"{{ }}")){t.rs(c,p,function(c,p,t){t.b(" ");t.b(t.t(t.f("content",c,p,0)));t.b("");t.b("\n" + i);});c.pop();}t.b("
");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b("");return t.fl(); },partials: {}, subs: { }}); -global.browserTemplates["line-by-line-wrapper"] = new Hogan.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("
");t.b("\n" + i);t.b(" ");t.b(t.t(t.f("content",c,p,0)));t.b("\n" + i);t.b("
");return t.fl(); },partials: {}, subs: { }}); +var Hogan = require("hogan.js");global.browserTemplates["file-summary-line"] = new Hogan.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("
  • ");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b(" ");t.b(t.rp("");t.b("\n" + i);t.b(" ");t.b(t.v(t.f("fileName",c,p,0)));t.b("");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b(" ");t.b(t.v(t.f("addedLines",c,p,0)));t.b("");t.b("\n" + i);t.b(" ");t.b(t.v(t.f("deletedLines",c,p,0)));t.b("");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b("
  • ");return t.fl(); },partials: {"");t.b("\n" + i);t.b("
    ");t.b("\n" + i);t.b(" Files changed (");t.b(t.v(t.f("filesNumber",c,p,0)));t.b(")");t.b("\n" + i);t.b(" hide");t.b("\n" + i);t.b(" show");t.b("\n" + i);t.b("
    ");t.b("\n" + i);t.b("
      ");t.b("\n" + i);t.b(" ");t.b(t.t(t.f("files",c,p,0)));t.b("\n" + i);t.b("
    ");t.b("\n" + i);t.b("");return t.fl(); },partials: {}, subs: { }}); +global.browserTemplates["generic-column-line-number"] = new Hogan.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b("
    ");t.b(t.t(t.f("blockHeader",c,p,0)));t.b("
    ");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b("");return t.fl(); },partials: {}, subs: { }}); +global.browserTemplates["generic-empty-diff"] = new Hogan.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b("
    ");t.b("\n" + i);t.b(" File without changes");t.b("\n" + i);t.b("
    ");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b("");return t.fl(); },partials: {}, subs: { }}); +global.browserTemplates["generic-file-path"] = new Hogan.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("");t.b("\n" + i);t.b(" ");t.b(t.rp("");t.b("\n" + i);t.b(" ");t.b(t.v(t.f("fileDiffName",c,p,0)));t.b("");t.b("\n" + i);t.b(t.rp("");return t.fl(); },partials: {"");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b(" ");t.b(t.t(t.f("lineNumber",c,p,0)));t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b("
    ");t.b("\n" + i);if(t.s(t.f("prefix",c,p,1),c,p,0,171,247,"{{ }}")){t.rs(c,p,function(c,p,t){t.b(" ");t.b(t.t(t.f("prefix",c,p,0)));t.b("");t.b("\n" + i);});c.pop();}if(t.s(t.f("content",c,p,1),c,p,0,279,353,"{{ }}")){t.rs(c,p,function(c,p,t){t.b(" ");t.b(t.t(t.f("content",c,p,0)));t.b("");t.b("\n" + i);});c.pop();}t.b("
    ");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b("");return t.fl(); },partials: {}, subs: { }}); +global.browserTemplates["generic-wrapper"] = new Hogan.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("
    ");t.b("\n" + i);t.b(" ");t.b(t.t(t.f("content",c,p,0)));t.b("\n" + i);t.b("
    ");return t.fl(); },partials: {}, subs: { }}); +global.browserTemplates["icon-file-added"] = new Hogan.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b("");return t.fl(); },partials: {}, subs: { }}); +global.browserTemplates["icon-file-changed"] = new Hogan.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b("");return t.fl(); },partials: {}, subs: { }}); +global.browserTemplates["icon-file-deleted"] = new Hogan.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b("");return t.fl(); },partials: {}, subs: { }}); +global.browserTemplates["icon-file-renamed"] = new Hogan.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b("");return t.fl(); },partials: {}, subs: { }}); +global.browserTemplates["icon-file"] = new Hogan.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b("");return t.fl(); },partials: {}, subs: { }}); +global.browserTemplates["line-by-line-file-diff"] = new Hogan.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("
    ");t.b("\n" + i);t.b("
    ");t.b("\n" + i);t.b(" ");t.b(t.t(t.f("filePath",c,p,0)));t.b("\n" + i);t.b("
    ");t.b("\n" + i);t.b("
    ");t.b("\n" + i);t.b("
    ");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b(" ");t.b(t.t(t.f("diffs",c,p,0)));t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b("
    ");t.b("\n" + i);t.b("
    ");t.b("\n" + i);t.b("
    ");t.b("\n" + i);t.b("
    ");return t.fl(); },partials: {}, subs: { }}); +global.browserTemplates["line-by-line-numbers"] = new Hogan.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("
    ");t.b(t.v(t.f("oldNumber",c,p,0)));t.b("
    ");t.b("\n" + i);t.b("
    ");t.b(t.v(t.f("newNumber",c,p,0)));t.b("
    ");return t.fl(); },partials: {}, subs: { }}); +global.browserTemplates["side-by-side-file-diff"] = new Hogan.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("
    ");t.b("\n" + i);t.b("
    ");t.b("\n" + i);t.b(" ");t.b(t.t(t.f("filePath",c,p,0)));t.b("\n" + i);t.b("
    ");t.b("\n" + i);t.b("
    ");t.b("\n" + i);t.b("
    ");t.b("\n" + i);t.b("
    ");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b(" ");t.b(t.t(t.d("diffs.left",c,p,0)));t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b("
    ");t.b("\n" + i);t.b("
    ");t.b("\n" + i);t.b("
    ");t.b("\n" + i);t.b("
    ");t.b("\n" + i);t.b("
    ");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b(" ");t.b(t.t(t.d("diffs.right",c,p,0)));t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b("
    ");t.b("\n" + i);t.b("
    ");t.b("\n" + i);t.b("
    ");t.b("\n" + i);t.b("
    ");t.b("\n" + i);t.b("
    ");return t.fl(); },partials: {}, subs: { }}); +global.browserTemplates["tag-file-added"] = new Hogan.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("ADDED");return t.fl(); },partials: {}, subs: { }}); +global.browserTemplates["tag-file-changed"] = new Hogan.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("CHANGED");return t.fl(); },partials: {}, subs: { }}); +global.browserTemplates["tag-file-deleted"] = new Hogan.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("DELETED");return t.fl(); },partials: {}, subs: { }}); +global.browserTemplates["tag-file-renamed"] = new Hogan.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("RENAMED");return t.fl(); },partials: {}, subs: { }}); module.exports = global.browserTemplates; })(); diff --git a/src/templates/file-summary-line.mustache b/src/templates/file-summary-line.mustache new file mode 100644 index 0000000..27d373b --- /dev/null +++ b/src/templates/file-summary-line.mustache @@ -0,0 +1,10 @@ +
  • + + {{>fileIcon}} + {{fileName}} + + {{addedLines}} + {{deletedLines}} + + +
  • diff --git a/src/templates/file-summary-wrapper.mustache b/src/templates/file-summary-wrapper.mustache new file mode 100644 index 0000000..126854c --- /dev/null +++ b/src/templates/file-summary-wrapper.mustache @@ -0,0 +1,10 @@ +
    +
    + Files changed ({{filesNumber}}) + hide + show +
    +
      + {{{files}}} +
    +
    diff --git a/src/templates/generic-column-line-number.mustache b/src/templates/generic-column-line-number.mustache new file mode 100644 index 0000000..181d651 --- /dev/null +++ b/src/templates/generic-column-line-number.mustache @@ -0,0 +1,6 @@ + + + +
    {{{blockHeader}}}
    + + diff --git a/src/templates/line-by-line-empty-diff.mustache b/src/templates/generic-empty-diff.mustache similarity index 62% rename from src/templates/line-by-line-empty-diff.mustache rename to src/templates/generic-empty-diff.mustache index c9907a3..c6b1abd 100644 --- a/src/templates/line-by-line-empty-diff.mustache +++ b/src/templates/generic-empty-diff.mustache @@ -1,6 +1,6 @@ -
    +
    File without changes
    diff --git a/src/templates/generic-file-path.mustache b/src/templates/generic-file-path.mustache new file mode 100644 index 0000000..cc71b18 --- /dev/null +++ b/src/templates/generic-file-path.mustache @@ -0,0 +1,5 @@ + + {{>fileIcon}} + {{fileDiffName}} + {{>fileTag}} + diff --git a/src/templates/line-by-line-line.mustache b/src/templates/generic-line.mustache similarity index 59% rename from src/templates/line-by-line-line.mustache rename to src/templates/generic-line.mustache index 1893a24..901c655 100644 --- a/src/templates/line-by-line-line.mustache +++ b/src/templates/generic-line.mustache @@ -1,10 +1,9 @@ - -
    {{oldNumber}}
    -
    {{newNumber}}
    + + {{{lineNumber}}} -
    +
    {{#prefix}} {{{prefix}}} {{/prefix}} diff --git a/src/templates/line-by-line-wrapper.mustache b/src/templates/generic-wrapper.mustache similarity index 100% rename from src/templates/line-by-line-wrapper.mustache rename to src/templates/generic-wrapper.mustache diff --git a/src/templates/icon-file-added.mustache b/src/templates/icon-file-added.mustache new file mode 100644 index 0000000..cf855b9 --- /dev/null +++ b/src/templates/icon-file-added.mustache @@ -0,0 +1,4 @@ + diff --git a/src/templates/icon-file-changed.mustache b/src/templates/icon-file-changed.mustache new file mode 100644 index 0000000..19a150e --- /dev/null +++ b/src/templates/icon-file-changed.mustache @@ -0,0 +1,4 @@ + diff --git a/src/templates/icon-file-deleted.mustache b/src/templates/icon-file-deleted.mustache new file mode 100644 index 0000000..fc3b8f4 --- /dev/null +++ b/src/templates/icon-file-deleted.mustache @@ -0,0 +1,4 @@ + diff --git a/src/templates/icon-file-renamed.mustache b/src/templates/icon-file-renamed.mustache new file mode 100644 index 0000000..1bf266d --- /dev/null +++ b/src/templates/icon-file-renamed.mustache @@ -0,0 +1,4 @@ + diff --git a/src/templates/icon-file.mustache b/src/templates/icon-file.mustache new file mode 100644 index 0000000..514972c --- /dev/null +++ b/src/templates/icon-file.mustache @@ -0,0 +1,3 @@ + diff --git a/src/templates/line-by-line-column-line-number.mustache b/src/templates/line-by-line-column-line-number.mustache deleted file mode 100644 index 72825ed..0000000 --- a/src/templates/line-by-line-column-line-number.mustache +++ /dev/null @@ -1,6 +0,0 @@ - - - -
    {{{blockHeader}}}
    - - diff --git a/src/templates/line-by-line-file-diff.mustache b/src/templates/line-by-line-file-diff.mustache index 7789fda..8af1ccd 100644 --- a/src/templates/line-by-line-file-diff.mustache +++ b/src/templates/line-by-line-file-diff.mustache @@ -1,16 +1,6 @@
    - - - +{{file.addedLines}} - - - -{{file.deletedLines}} - - - -  {{fileDiffName}} - + {{{filePath}}}
    diff --git a/src/templates/line-by-line-numbers.mustache b/src/templates/line-by-line-numbers.mustache new file mode 100644 index 0000000..c0ef8c6 --- /dev/null +++ b/src/templates/line-by-line-numbers.mustache @@ -0,0 +1,2 @@ +
    {{oldNumber}}
    +
    {{newNumber}}
    diff --git a/src/templates/side-by-side-file-diff.mustache b/src/templates/side-by-side-file-diff.mustache new file mode 100644 index 0000000..3f3e5d3 --- /dev/null +++ b/src/templates/side-by-side-file-diff.mustache @@ -0,0 +1,25 @@ +
    +
    + {{{filePath}}} +
    +
    +
    +
    + + + {{{diffs.left}}} + +
    +
    +
    +
    +
    + + + {{{diffs.right}}} + +
    +
    +
    +
    +
    diff --git a/src/templates/tag-file-added.mustache b/src/templates/tag-file-added.mustache new file mode 100644 index 0000000..3c32eb0 --- /dev/null +++ b/src/templates/tag-file-added.mustache @@ -0,0 +1 @@ +ADDED diff --git a/src/templates/tag-file-changed.mustache b/src/templates/tag-file-changed.mustache new file mode 100644 index 0000000..5e83001 --- /dev/null +++ b/src/templates/tag-file-changed.mustache @@ -0,0 +1 @@ +CHANGED diff --git a/src/templates/tag-file-deleted.mustache b/src/templates/tag-file-deleted.mustache new file mode 100644 index 0000000..f1aed8b --- /dev/null +++ b/src/templates/tag-file-deleted.mustache @@ -0,0 +1 @@ +DELETED diff --git a/src/templates/tag-file-renamed.mustache b/src/templates/tag-file-renamed.mustache new file mode 100644 index 0000000..9a67397 --- /dev/null +++ b/src/templates/tag-file-renamed.mustache @@ -0,0 +1 @@ +RENAMED diff --git a/src/ui/css/diff2html.css b/src/ui/css/diff2html.css index a6a6bf4..9d4096d 100644 --- a/src/ui/css/diff2html.css +++ b/src/ui/css/diff2html.css @@ -16,39 +16,37 @@ } .d2h-file-stats { - display: inline; - text-align: center; + display: flex; + margin-left: auto; + font-size: 14px; } .d2h-lines-added { text-align: right; -} - -.d2h-lines-added > * { - background-color: #ceffce; border: 1px solid #b4e2b4; - color: #399839; border-radius: 5px 0 0 5px; + color: #399839; padding: 2px; + vertical-align: middle; } .d2h-lines-deleted { text-align: left; -} - -.d2h-lines-deleted > * { - background-color: #f7c8c8; border: 1px solid #e9aeae; - color: #c33; border-radius: 0 5px 5px 0; + color: #c33; padding: 2px; + vertical-align: middle; + margin-left: 1px; } .d2h-file-name-wrapper { - display: inline-flex; - width: 90%; + display: flex; + align-items: center; + width: 100%; font-family: "Source Sans Pro", "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 15px; + line-height: 15px; } .d2h-file-name { @@ -102,16 +100,11 @@ .d2h-code-side-line { display: block; - white-space: pre; + white-space: nowrap; padding: 0 10px; height: 18px; line-height: 18px; margin-left: 50px; - /* Override HighlightJS */ - /*color: inherit;*/ - /*overflow-x: inherit;*/ - /*background: none;*/ - /* ******************** */ } .d2h-code-line del, @@ -249,6 +242,7 @@ } .d2h-file-list-line { + display: flex; text-align: left; } @@ -258,6 +252,19 @@ .d2h-file-list { display: block; + list-style: none; + padding: 0; + margin: 0; +} + +.d2h-file-list > li { + border-bottom: #ddd solid 1px; + padding: 5px 10px; + margin: 0; +} + +.d2h-file-list > li:last-child { + border-bottom: none; } .d2h-file-switch { @@ -266,6 +273,56 @@ cursor: pointer; } +.d2h-icon-wrapper { + line-height: 31px; +} + +.d2h-icon { + vertical-align: middle; + margin-right: 10px; + fill: currentColor; +} + +.d2h-deleted { + color: #c33; +} + +.d2h-added { + color: #399839; +} + +.d2h-changed { + color: #d0b44c; +} + +.d2h-moved { + color: #3572b0; +} + +.d2h-tag { + display: flex; + font-size: 10px; + margin-left: 5px; + padding: 0 2px; + background-color: #fff; +} + +.d2h-deleted-tag { + border: #c33 1px solid; +} + +.d2h-added-tag { + border: #399839 1px solid; +} + +.d2h-changed-tag { + border: #d0b44c 1px solid; +} + +.d2h-moved-tag { + border: #3572b0 1px solid; +} + /* * Selection util. */ diff --git a/test/diff2html-tests.js b/test/diff2html-tests.js index ef87ef5..99649d0 100644 --- a/test/diff2html-tests.js +++ b/test/diff2html-tests.js @@ -43,40 +43,39 @@ var jsonExample1 = var filesExample1 = '
    \n' + - '
    \n' + - ' Files changed (1)  \n' + - ' hide\n' + - ' show\n' + - '
    \n' + - ' \n' + - ' \n' + - ' \n' + - ' \n' + - ' \n' + - ' \n' + - '
    \n' + - ' +1\n' + - ' \n' + - ' -1\n' + - ' \n' + - '  sample \n' + - '
    \n'; + '
    \n' + + ' Files changed (1)\n' + + ' hide\n' + + ' show\n' + + '
    \n' + + '
      \n' + + '
    1. \n' + + ' \n' + + ' \n' + + ' sample\n' + + ' \n' + + ' +1\n' + + ' -1\n' + + ' \n' + + ' \n' + + '
    2. \n' + + '
    \n' + + '
    '; + var htmlLineExample1 = '
    \n' + '
    \n' + '
    \n' + - ' \n' + - ' \n' + - ' +1\n' + - ' \n' + - ' \n' + - ' -1\n' + - ' \n' + - ' \n' + ' \n' + - '  sample\n' + - ' \n' + + ' \n' + + ' sample\n' + + ' CHANGED\n' + '
    \n' + '
    \n' + '
    \n' + @@ -85,12 +84,12 @@ var htmlLineExample1 = ' \n' + ' \n' + ' \n' + - '
    \n' + + '
    @@ -1 +1 @@
    \n' + ' \n' + '\n' + ' \n' + - '
    1
    \n' + - '
    \n' + + '
    1
    \n' + + '
    \n' + ' \n' + ' \n' + '
    \n' + @@ -100,8 +99,8 @@ var htmlLineExample1 = ' \n' + '\n' + ' \n' + - '
    \n' + - '
    1
    \n' + + '
    \n' + + '
    1
    \n' + ' \n' + ' \n' + '
    \n' + @@ -121,60 +120,67 @@ var htmlLineExample1WithFilesSummary = filesExample1 + htmlLineExample1; var htmlSideExample1 = '
    \n' + - '
    \n' + - '
    \n' + - ' \n' + - ' \n' + - ' +1\n' + - ' \n' + - ' \n' + - ' -1\n' + - ' \n' + - ' \n' + - ' \n' + - ' sample\n' + - ' \n' + - '
    \n' + - '
    \n' + - '
    \n' + - '
    \n' + - ' \n' + - ' \n' + - ' \n' + - ' \n' + - ' \n' + + '
    \n' + + '
    \n' + + ' \n' + + ' \n' + + ' sample\n' + + ' CHANGED\n' + + '
    \n' + + '
    \n' + + '
    \n' + + '
    \n' + + '
    \n' + - '
    @@ -1 +1 @@
    \n' + - '
    \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + '\n' + + ' \n' + + ' \n' + '\n' + - '\n' + - ' \n' + - ' \n' + - ' \n' + - ' \n' + - '
    \n' + + '
    @@ -1 +1 @@
    \n' + + '
    \n' + + ' 1\n' + + ' \n' + + '
    \n' + + ' -\n' + + ' test\n' + + '
    \n' + + '
    1
    -test
    \n' + - '
    \n' + - '
    \n' + - '
    \n' + - '
    \n' + - ' \n' + - ' \n' + - ' \n' + - ' \n' + - ' \n' + + ' \n' + + '
    \n' + - '
    \n' + - '
    \n' + + '
    \n' + + '
    \n' + + '
    \n' + + '
    \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + '\n' + + ' \n' + + ' \n' + '\n' + - '\n' + - ' \n' + - ' \n' + - ' \n' + - ' \n' + - '
    \n' + + '
    \n' + + '
    \n' + + ' 1\n' + + ' \n' + + '
    \n' + + ' +\n' + + ' test1\n' + + '
    \n' + + '
    1
    +test1
    \n' + - '
    \n' + - '
    \n' + - '
    \n' + - '
    \n' + - '
    \n'; + ' \n' + + ' \n' + + '
    \n' + + '
    \n' + + '
    \n' + + '
    \n' + + '
    '; var htmlSideExample1WithFilesSummary = filesExample1 + htmlSideExample1; diff --git a/test/file-list-printer-tests.js b/test/file-list-printer-tests.js new file mode 100644 index 0000000..89e9dc1 --- /dev/null +++ b/test/file-list-printer-tests.js @@ -0,0 +1,105 @@ +var assert = require('assert'); + +var fileListPrinter = require('../src/file-list-printer.js').FileListPrinter; + +describe('FileListPrinter', function() { + describe('generateFileList', function() { + it('should work for all kinds of files', function() { + + var files = [{ + addedLines: 12, + deletedLines: 41, + language: 'js', + oldName: 'my/file/name.js', + newName: 'my/file/name.js' + }, { + addedLines: 12, + deletedLines: 41, + language: 'js', + oldName: 'my/file/name1.js', + newName: 'my/file/name2.js' + }, { + addedLines: 12, + deletedLines: 0, + language: 'js', + oldName: 'dev/null', + newName: 'my/file/name.js', + isNew: true + }, { + addedLines: 0, + deletedLines: 41, + language: 'js', + oldName: 'my/file/name.js', + newName: 'dev/null', + isDeleted: true + }]; + + var fileHtml = fileListPrinter.generateFileList(files); + + var expected = + '
    \n' + + '
    \n' + + ' Files changed (4)\n' + + ' hide\n' + + ' show\n' + + '
    \n' + + '
      \n' + + '
    1. \n' + + ' \n' + + ' \n' + + ' my/file/name.js\n' + + ' \n' + + ' +12\n' + + ' -41\n' + + ' \n' + + ' \n' + + '
    2. \n' + + '
    3. \n' + + ' \n' + + ' \n' + + ' my/file/{name1.js → name2.js}\n' + + ' \n' + + ' +12\n' + + ' -41\n' + + ' \n' + + ' \n' + + '
    4. \n' + + '
    5. \n' + + ' \n' + + ' \n' + + ' my/file/name.js\n' + + ' \n' + + ' +12\n' + + ' -0\n' + + ' \n' + + ' \n' + + '
    6. \n' + + '
    7. \n' + + ' \n' + + ' \n' + + ' my/file/name.js\n' + + ' \n' + + ' +0\n' + + ' -41\n' + + ' \n' + + ' \n' + + '
    8. \n' + + '
    \n' + + '
    '; + + assert.equal(expected, fileHtml); + }); + }); +}); diff --git a/test/hogan-cache-tests.js b/test/hogan-cache-tests.js index c5f65ce..190bf6f 100644 --- a/test/hogan-cache-tests.js +++ b/test/hogan-cache-tests.js @@ -1,28 +1,35 @@ var assert = require('assert'); var HoganJsUtils = require('../src/hoganjs-utils.js').HoganJsUtils; +var diffParser = require('../src/diff-parser.js').DiffParser; describe('HoganJsUtils', function() { describe('render', function() { var emptyDiffHtml = '\n' + - ' \n' + - '
    \n' + + ' \n' + + '
    \n' + ' File without changes\n' + '
    \n' + ' \n' + ''; it('should render view', function() { - var result = HoganJsUtils.render('line-by-line', 'empty-diff', {}); + var result = HoganJsUtils.render('generic', 'empty-diff', { + contentClass: 'd2h-code-line', + diffParser: diffParser + }); assert.equal(emptyDiffHtml, result); }); it('should render view without cache', function() { - var result = HoganJsUtils.render('line-by-line', 'empty-diff', {}, {noCache: true}); + var result = HoganJsUtils.render('generic', 'empty-diff', { + contentClass: 'd2h-code-line', + diffParser: diffParser + }, {noCache: true}); assert.equal(emptyDiffHtml + '\n', result); }); it('should return null if template is missing', function() { - var result = HoganJsUtils.render('line-by-line', 'missing-template', {}, {noCache: true}); + var result = HoganJsUtils.render('generic', 'missing-template', {}, {noCache: true}); assert.equal(null, result); }); }); diff --git a/test/line-by-line-tests.js b/test/line-by-line-tests.js index 16dabbf..a0ba661 100644 --- a/test/line-by-line-tests.js +++ b/test/line-by-line-tests.js @@ -31,8 +31,8 @@ describe('LineByLinePrinter', function() { fileHtml = fileHtml.replace(/\n\n+/g, '\n'); var expected = '\n' + ' \n' + - '
    \n' + - '
    30
    \n' + + '
    \n' + + '
    30
    \n' + ' \n' + ' \n' + '
    \n' + @@ -53,8 +53,8 @@ describe('LineByLinePrinter', function() { fileHtml = fileHtml.replace(/\n\n+/g, '\n'); var expected = '\n' + ' \n' + - '
    30
    \n' + - '
    \n' + + '
    30
    \n' + + '
    \n' + ' \n' + ' \n' + '
    \n' + @@ -75,8 +75,8 @@ describe('LineByLinePrinter', function() { fileHtml = fileHtml.replace(/\n\n+/g, '\n'); var expected = '\n' + ' \n' + - '
    \n' + - '
    30
    \n' + + '
    \n' + + '
    30
    \n' + ' \n' + ' \n' + '
    \n' + @@ -97,8 +97,8 @@ describe('LineByLinePrinter', function() { fileHtml = fileHtml.replace(/\n\n+/g, '\n'); var expected = '\n' + ' \n' + - '
    \n' + - '
    30
    \n' + + '
    \n' + + '
    30
    \n' + ' \n' + ' \n' + '
    \n' + @@ -119,8 +119,9 @@ describe('LineByLinePrinter', function() { fileHtml = fileHtml.replace(/\n\n+/g, '\n'); var expected = '\n' + ' \n' + - '
    \n' + - '
    30
    \n' + + '
    \n' + + '' + + '
    30
    \n' + ' \n' + ' \n' + '
    \n' + @@ -149,19 +150,129 @@ describe('LineByLinePrinter', function() { var fileHtml = lineByLinePrinter.makeFileDiffHtml(file, diffs); - var expected = '
    \n' + + var expected = + '
    \n' + '
    \n' + - ' \n' + - ' \n' + - ' +12\n' + - ' \n' + - ' \n' + - ' -41\n' + - ' \n' + - ' \n' + ' \n' + - '  my/file/name.js\n' + - ' \n' + + ' \n' + + ' my/file/name.js\n' + + ' CHANGED\n' + + '
    \n' + + '
    \n' + + '
    \n' + + ' \n' + + ' \n' + + ' Random Html\n' + + ' \n' + + '
    \n' + + '
    \n' + + '
    \n' + + '
    '; + + assert.equal(expected, fileHtml); + }); + it('should work for simple added file', function() { + var lineByLinePrinter = new LineByLinePrinter({}); + + var file = { + addedLines: 12, + deletedLines: 0, + language: 'js', + oldName: 'dev/null', + newName: 'my/file/name.js', + isNew: true + }; + var diffs = 'Random Html'; + + var fileHtml = lineByLinePrinter.makeFileDiffHtml(file, diffs); + + var expected = + '
    \n' + + '
    \n' + + ' \n' + + ' \n' + + ' my/file/name.js\n' + + ' ADDED\n' + + '
    \n' + + '
    \n' + + '
    \n' + + ' \n' + + ' \n' + + ' Random Html\n' + + ' \n' + + '
    \n' + + '
    \n' + + '
    \n' + + '
    '; + + assert.equal(expected, fileHtml); + }); + it('should work for simple deleted file', function() { + var lineByLinePrinter = new LineByLinePrinter({}); + + var file = { + addedLines: 0, + deletedLines: 41, + language: 'js', + oldName: 'my/file/name.js', + newName: 'dev/null', + isDeleted: true + }; + var diffs = 'Random Html'; + + var fileHtml = lineByLinePrinter.makeFileDiffHtml(file, diffs); + + var expected = + '
    \n' + + '
    \n' + + ' \n' + + ' \n' + + ' my/file/name.js\n' + + ' DELETED\n' + + '
    \n' + + '
    \n' + + '
    \n' + + ' \n' + + ' \n' + + ' Random Html\n' + + ' \n' + + '
    \n' + + '
    \n' + + '
    \n' + + '
    '; + + assert.equal(expected, fileHtml); + }); + it('should work for simple renamed file', function() { + var lineByLinePrinter = new LineByLinePrinter({}); + + var file = { + addedLines: 12, + deletedLines: 41, + language: 'js', + oldName: 'my/file/name1.js', + newName: 'my/file/name2.js', + isRename: true + }; + var diffs = 'Random Html'; + + var fileHtml = lineByLinePrinter.makeFileDiffHtml(file, diffs); + + var expected = + '
    \n' + + '
    \n' + + ' \n' + + ' \n' + + ' my/file/{name1.js → name2.js}\n' + + ' RENAMED\n' + '
    \n' + '
    \n' + '
    \n' + @@ -229,17 +340,12 @@ describe('LineByLinePrinter', function() { '
    \n' + '
    \n' + '
    \n' + - ' \n' + - ' \n' + - ' +1\n' + - ' \n' + - ' \n' + - ' -1\n' + - ' \n' + - ' \n' + ' \n' + - '  sample\n' + - ' \n' + + ' \n' + + ' sample\n' + + ' CHANGED\n' + '
    \n' + '
    \n' + '
    \n' + @@ -248,12 +354,12 @@ describe('LineByLinePrinter', function() { ' \n' + ' \n' + ' \n' + - '
    \n' + + '
    @@ -1 +1 @@
    \n' + ' \n' + '\n' + ' \n' + - '
    1
    \n' + - '
    \n' + + '
    1
    \n' + + '
    \n' + ' \n' + ' \n' + '
    \n' + @@ -263,8 +369,8 @@ describe('LineByLinePrinter', function() { ' \n' + '\n' + ' \n' + - '
    \n' + - '
    1
    \n' + + '
    \n' + + '
    1
    \n' + ' \n' + ' \n' + '
    \n' + @@ -300,17 +406,12 @@ describe('LineByLinePrinter', function() { '
    \n' + '
    \n' + '
    \n' + - ' \n' + - ' \n' + - ' +0\n' + - ' \n' + - ' \n' + - ' -0\n' + - ' \n' + - ' \n' + ' \n' + - '  sample\n' + - ' \n' + + ' \n' + + ' sample\n' + + ' CHANGED\n' + '
    \n' + '
    \n' + '
    \n' + @@ -356,8 +457,8 @@ describe('LineByLinePrinter', function() { var expected = '\n' + ' \n' + - '
    1
    \n' + - '
    \n' + + '
    1
    \n' + + '
    \n' + ' \n' + ' \n' + '
    \n' + @@ -366,8 +467,8 @@ describe('LineByLinePrinter', function() { ' \n' + '\n' + ' \n' + - '
    \n' + - '
    1
    \n' + + '
    \n' + + '
    1
    \n' + ' \n' + ' \n' + '
    \n' + @@ -430,12 +531,12 @@ describe('LineByLinePrinter', function() { '\n' + ' \n' + ' \n' + - '
    \n' + + '
    @@ -1 +1 @@
    \n' + ' \n' + '\n' + ' \n' + - '
    1
    \n' + - '
    1
    \n' + + '
    1
    \n' + + '
    1
    \n' + ' \n' + ' \n' + '
    \n' + @@ -444,8 +545,8 @@ describe('LineByLinePrinter', function() { ' \n' + '\n' + ' \n' + - '
    2
    \n' + - '
    \n' + + '
    2
    \n' + + '
    \n' + ' \n' + ' \n' + '
    \n' + @@ -455,8 +556,8 @@ describe('LineByLinePrinter', function() { ' \n' + '\n' + ' \n' + - '
    \n' + - '
    2
    \n' + + '
    \n' + + '
    2
    \n' + ' \n' + ' \n' + '
    \n' + @@ -466,8 +567,8 @@ describe('LineByLinePrinter', function() { ' \n' + '\n' + ' \n' + - '
    \n' + - '
    3
    \n' + + '
    \n' + + '
    3
    \n' + ' \n' + ' \n' + '
    \n' + diff --git a/test/side-by-side-printer-tests.js b/test/side-by-side-printer-tests.js index e2e2286..b90e2c2 100644 --- a/test/side-by-side-printer-tests.js +++ b/test/side-by-side-printer-tests.js @@ -10,11 +10,11 @@ describe('SideBySidePrinter', function() { var fileHtml = sideBySidePrinter.generateEmptyDiff(); var expectedRight = ''; var expectedLeft = '\n' + - ' ' + - '
    ' + - 'File without changes' + - '
    ' + - ' \n' + + ' \n' + + '
    \n' + + ' File without changes\n' + + '
    \n' + + ' \n' + '\n'; assert.equal(expectedRight, fileHtml.right); @@ -73,43 +73,78 @@ describe('SideBySidePrinter', function() { var expectedLeft = '\n' + - ' \n' + - ' \n' + - '
    @@ -19,7 +19,7 @@
    \n' + - ' \n' + - '\n' + - '\n' + - ' 19\n' + - '
    context
    \n' + - ' \n' + - '\n' + - ' 20\n' + - '
    -removed
    \n' + - ' \n' + - '\n' + - ' \n' + - '
    \n' + - ' \n'; + ' \n' + + ' \n' + + '
    @@ -19,7 +19,7 @@
    \n' + + ' \n' + + '\n' + + ' \n' + + ' 19\n' + + ' \n' + + ' \n' + + '
    \n' + + '  \n' + + ' context\n' + + '
    \n' + + ' \n' + + '\n' + + ' \n' + + ' 20\n' + + ' \n' + + ' \n' + + '
    \n' + + ' -\n' + + ' removed\n' + + '
    \n' + + ' \n' + + '\n' + + ' \n' + + ' ' + + '\n' + + ' \n' + + ' \n' + + '
    \n' + + '
    \n' + + ' \n' + + ''; var expectedRight = '\n' + - ' \n' + - ' \n' + - '
    \n' + - ' \n' + - '\n' + - '\n' + - ' 19\n' + - '
    context
    \n' + - ' \n' + - '\n' + - ' 20\n' + - '
    +added
    \n' + - ' \n' + - '\n' + - ' 21\n' + - '
    +another added
    \n' + - ' \n'; + ' \n' + + ' \n' + + '
    \n' + + ' \n' + + '\n' + + ' \n' + + ' 19\n' + + ' \n' + + ' \n' + + '
    \n' + + '  \n' + + ' context\n' + + '
    \n' + + ' \n' + + '\n' + + ' \n' + + ' 20\n' + + ' \n' + + ' \n' + + '
    \n' + + ' +\n' + + ' added\n' + + '
    \n' + + ' \n' + + '\n' + + ' \n' + + ' 21\n' + + ' \n' + + ' \n' + + '
    \n' + + ' +\n' + + ' another added\n' + + '
    \n' + + ' \n' + + ''; assert.equal(expectedLeft, fileHtml.left); assert.equal(expectedRight, fileHtml.right); @@ -124,11 +159,16 @@ describe('SideBySidePrinter', function() { var fileHtml = sideBySidePrinter.generateSingleLineHtml( diffParser.LINE_TYPE.INSERTS, 30, 'test', '+'); var expected = '\n' + - ' 30\n' + - ' ' + - '
    +test
    ' + + ' \n' + + ' 30\n' + ' \n' + - ' \n'; + ' \n' + + '
    \n' + + ' +\n' + + ' test\n' + + '
    \n' + + ' \n' + + ''; assert.equal(expected, fileHtml); }); @@ -139,11 +179,16 @@ describe('SideBySidePrinter', function() { var fileHtml = sideBySidePrinter.generateSingleLineHtml( diffParser.LINE_TYPE.DELETES, 30, 'test', '-'); var expected = '\n' + - ' 30\n' + - ' ' + - '
    -test
    ' + + ' \n' + + ' 30\n' + ' \n' + - ' \n'; + ' \n' + + '
    \n' + + ' -\n' + + ' test\n' + + '
    \n' + + ' \n' + + ''; assert.equal(expected, fileHtml); }); @@ -184,60 +229,67 @@ describe('SideBySidePrinter', function() { var html = sideBySidePrinter.generateSideBySideJsonHtml(exampleJson); var expected = '
    \n' + - '
    \n' + - '
    \n' + - ' \n' + - ' \n' + - ' +1\n' + - ' \n' + - ' \n' + - ' -1\n' + - ' \n' + - ' \n' + - ' \n' + - ' sample\n' + - ' \n' + - '
    \n' + - '
    \n' + - '
    \n' + - '
    \n' + - ' \n' + - ' \n' + - ' \n' + - ' \n' + - ' \n' + + '
    \n' + + '
    \n' + + ' \n' + + ' \n' + + ' sample\n' + + ' CHANGED\n' + + '
    \n' + + '
    \n' + + '
    \n' + + '
    \n' + + '
    \n' + - '
    @@ -1 +1 @@
    \n' + - '
    \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + '\n' + + ' \n' + + ' \n' + '\n' + - '\n' + - ' \n' + - ' \n' + - ' \n' + - ' \n' + - '
    \n' + + '
    @@ -1 +1 @@
    \n' + + '
    \n' + + ' 1\n' + + ' \n' + + '
    \n' + + ' -\n' + + ' test\n' + + '
    \n' + + '
    1
    -test
    \n' + - '
    \n' + - '
    \n' + - '
    \n' + - '
    \n' + - ' \n' + - ' \n' + - ' \n' + - ' \n' + - ' \n' + + ' \n' + + '
    \n' + - '
    \n' + - '
    \n' + + '
    \n' + + '
    \n' + + '
    \n' + + '
    \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + '\n' + + ' \n' + + ' \n' + '\n' + - '\n' + - ' \n' + - ' \n' + - ' \n' + - ' \n' + - '
    \n' + + '
    \n' + + '
    \n' + + ' 1\n' + + ' \n' + + '
    \n' + + ' +\n' + + ' test1r\n' + + '
    \n' + + '
    1
    +test1r
    \n' + - '
    \n' + - '
    \n' + - '
    \n' + - '
    \n' + - '
    \n'; + ' \n' + + ' \n' + + '
    \n' + + '
    \n' + + '
    \n' + + '
    \n' + + '
    '; assert.equal(expected, html); }); @@ -254,43 +306,44 @@ describe('SideBySidePrinter', function() { var html = sideBySidePrinter.generateSideBySideJsonHtml(exampleJson); var expected = '
    \n' + - '
    \n' + - '
    \n' + - ' \n' + - ' \n' + - ' +undefined\n' + - ' \n' + - ' \n' + - ' -undefined\n' + - ' \n' + - ' \n' + - ' \n' + - ' sample\n' + - ' \n' + - '
    \n' + - '
    \n' + - '
    \n' + - '
    \n' + - ' \n' + - ' \n' + - ' \n' + - ' \n' + + '
    \n' + + '
    \n' + + ' \n' + + ' \n' + + ' sample\n' + + ' CHANGED\n' + + '
    \n' + + '
    \n' + + '
    \n' + + '
    \n' + + '
    File without changes
    \n' + + ' \n' + + ' \n' + + ' \n' + '\n' + - ' \n' + - '
    \n' + + '
    \n' + + ' File without changes\n' + + '
    \n' + + '
    \n' + - '
    \n' + - '
    \n' + - '
    \n' + - '
    \n' + - ' \n' + - ' \n' + - ' \n' + - '
    \n' + - '
    \n' + - '
    \n' + - '
    \n' + - '
    \n' + - '
    \n'; + '\n' + + ' \n' + + ' \n' + + '
    \n' + + '
    \n' + + '
    \n' + + '
    \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + '
    \n' + + '
    \n' + + '
    \n' + + '
    \n' + + '
    \n' + + '
    '; assert.equal(expected, html); }); @@ -316,24 +369,29 @@ describe('SideBySidePrinter', function() { var html = sideBySidePrinter.processLines(oldLines, newLines); var expectedLeft = '\n' + - ' 1\n' + - ' ' + - '
    ' + - '-' + - 'test
    ' + + ' \n' + + ' 1\n' + ' \n' + - ' \n'; + ' \n' + + '
    \n' + + ' -\n' + + ' test\n' + + '
    \n' + + ' \n' + + ''; var expectedRight = '\n' + - ' 1\n' + - ' ' + - '
    ' + - '+' + - 'test1r' + - '
    ' + + ' \n' + + ' 1\n' + ' \n' + - ' \n'; + ' \n' + + '
    \n' + + ' +\n' + + ' test1r\n' + + '
    \n' + + ' \n' + + ''; assert.equal(expectedLeft, html.left); assert.equal(expectedRight, html.right);