diff --git a/dist/diff2html.css b/dist/diff2html.css index 58e0b56..b4bf366 100644 --- a/dist/diff2html.css +++ b/dist/diff2html.css @@ -93,7 +93,6 @@ .d2h-code-line { display: block; - white-space: pre; padding: 0 10px; height: 18px; line-height: 18px; diff --git a/package.json b/package.json index 116b4fb..57b0243 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,8 @@ "jscs": "^2.9.0", "mocha": "^2.4.5", "uglifyjs": "^2.4.10", - "webpack": "^1.12.13" + "webpack": "^1.12.9", + "nunjucks": "^2.3.0" }, "license": "MIT", "files": [ diff --git a/src/line-by-line-printer.js b/src/line-by-line-printer.js index e464bb4..b575a0e 100644 --- a/src/line-by-line-printer.js +++ b/src/line-by-line-printer.js @@ -11,34 +11,18 @@ var printerUtils = require('./printer-utils.js').PrinterUtils; var utils = require('./utils.js').Utils; var Rematch = require('./rematch.js').Rematch; + var nunjucks = require('nunjucks'); + var nunjucksEnv = nunjucks.configure(__dirname + '/templates/line-by-line/') + .addGlobal('printerUtils', printerUtils) + .addGlobal('utils', utils) + .addGlobal('diffParser', diffParser); function LineByLinePrinter(config) { this.config = config; } LineByLinePrinter.prototype.makeFileDiffHtml = function(file, diffs) { - return '
\n' + - '
\n' + - '
\n' + - ' ' + - ' +' + file.addedLines + '\n' + - ' \n' + - ' ' + - ' -' + file.deletedLines + '\n' + - ' \n' + - '
\n' + - '
' + printerUtils.getDiffName(file) + '
\n' + - '
\n' + - '
\n' + - '
\n' + - ' \n' + - ' \n' + - ' ' + diffs + - ' \n' + - '
\n' + - '
\n' + - '
\n' + - '
\n'; + return nunjucksEnv.render('file-diff.html', {'file': file, 'diffs': diffs}); }; LineByLinePrinter.prototype.generateLineByLineJsonHtml = function(diffFiles) { @@ -64,12 +48,7 @@ }); LineByLinePrinter.prototype.makeColumnLineNumberHtml = function(block) { - return '\n' + - ' \n' + - ' ' + - '
' + utils.escape(block.header) + '
' + - ' \n' + - '\n'; + return nunjucksEnv.render('column-line-number.html', {block: block}); }; LineByLinePrinter.prototype._generateFileHtml = function(file) { @@ -115,10 +94,10 @@ var diff = printerUtils.diffHighlight(oldLine.content, newLine.content, that.config); processedOldLines += - that._generateLineHtml(deleteType, oldLine.oldNumber, oldLine.newNumber, + that.makeLineHtml(deleteType, oldLine.oldNumber, oldLine.newNumber, diff.first.line, diff.first.prefix); processedNewLines += - that._generateLineHtml(insertType, newLine.oldNumber, newLine.newNumber, + that.makeLineHtml(insertType, newLine.oldNumber, newLine.newNumber, diff.second.line, diff.second.prefix); } @@ -140,9 +119,9 @@ } if (line.type === diffParser.LINE_TYPE.CONTEXT) { - lines += that._generateLineHtml(line.type, line.oldNumber, line.newNumber, escapedLine); + lines += that.makeLineHtml(line.type, line.oldNumber, line.newNumber, escapedLine); } else if (line.type === diffParser.LINE_TYPE.INSERTS && !oldLines.length) { - lines += that._generateLineHtml(line.type, line.oldNumber, line.newNumber, escapedLine); + lines += that.makeLineHtml(line.type, line.oldNumber, line.newNumber, escapedLine); } else if (line.type === diffParser.LINE_TYPE.DELETES) { oldLines.push(line); } else if (line.type === diffParser.LINE_TYPE.INSERTS && Boolean(oldLines.length)) { @@ -165,52 +144,29 @@ for (var i = 0; i < oldLines.length; i++) { var oldLine = oldLines[i]; var oldEscapedLine = utils.escape(oldLine.content); - lines += this._generateLineHtml(oldLine.type, oldLine.oldNumber, oldLine.newNumber, oldEscapedLine); + lines += this.makeLineHtml(oldLine.type, oldLine.oldNumber, oldLine.newNumber, oldEscapedLine); } for (var j = 0; j < newLines.length; j++) { var newLine = newLines[j]; var newEscapedLine = utils.escape(newLine.content); - lines += this._generateLineHtml(newLine.type, newLine.oldNumber, newLine.newNumber, newEscapedLine); + lines += this.makeLineHtml(newLine.type, newLine.oldNumber, newLine.newNumber, newEscapedLine); } return lines; }; - LineByLinePrinter.prototype.makeLineHtml = function(type, oldNumber, newNumber, htmlPrefix, htmlContent) { - return '\n' + - ' ' + - '
' + utils.valueOrEmpty(oldNumber) + '
' + - '
' + utils.valueOrEmpty(newNumber) + '
' + - ' \n' + - ' ' + - '
' + htmlPrefix + htmlContent + '
' + - ' \n' + - '\n'; - }; - - LineByLinePrinter.prototype._generateLineHtml = function(type, oldNumber, newNumber, content, prefix) { - var htmlPrefix = ''; - if (prefix) { - htmlPrefix = '' + prefix + ''; - } - - var htmlContent = ''; - if (content) { - htmlContent = '' + content + ''; - } - - return this.makeLineHtml(type, oldNumber, newNumber, htmlPrefix, htmlContent); + LineByLinePrinter.prototype.makeLineHtml = function(type, oldNumber, newNumber, content, prefix) { + return nunjucksEnv.render('line.html', + {type: type, + oldNumber: oldNumber, + newNumber: newNumber, + prefix: prefix, + content: content}); }; LineByLinePrinter.prototype._generateEmptyDiff = function() { - return '\n' + - ' ' + - '
' + - 'File without changes' + - '
' + - ' \n' + - '\n'; + return nunjucksEnv.render('empty-diff.html', {}); }; module.exports.LineByLinePrinter = LineByLinePrinter; diff --git a/src/templates/line-by-line/column-line-number.html b/src/templates/line-by-line/column-line-number.html new file mode 100644 index 0000000..cd80c40 --- /dev/null +++ b/src/templates/line-by-line/column-line-number.html @@ -0,0 +1,6 @@ + + + +
{{ utils.escape(block.header) }}
+ + diff --git a/src/templates/line-by-line/empty-diff.html b/src/templates/line-by-line/empty-diff.html new file mode 100644 index 0000000..737bef5 --- /dev/null +++ b/src/templates/line-by-line/empty-diff.html @@ -0,0 +1,7 @@ + + +
+ File without changes +
+ + diff --git a/src/templates/line-by-line/file-diff.html b/src/templates/line-by-line/file-diff.html new file mode 100644 index 0000000..d0d2d8f --- /dev/null +++ b/src/templates/line-by-line/file-diff.html @@ -0,0 +1,22 @@ +
+
+
+ + +{{ file.addedLines }} + + + -{{ file.deletedLines }} + +
+
 {{ printerUtils.getDiffName(file) }}
+
+
+
+ + + {{ diffs | safe}} + +
+
+
+
diff --git a/src/templates/line-by-line/line.html b/src/templates/line-by-line/line.html new file mode 100644 index 0000000..cd67adc --- /dev/null +++ b/src/templates/line-by-line/line.html @@ -0,0 +1,16 @@ + + +
{{ utils.valueOrEmpty(oldNumber) | safe }}
+
{{ utils.valueOrEmpty(newNumber) | safe }}
+ + +
+{% if prefix %} + {{ utils.convertWhiteSpaceToNonBreakingSpace(prefix) | safe }} +{% endif %} +{% if content %} + {{ utils.convertWhiteSpaceToNonBreakingSpace(content) | safe }} +{% endif %} +
+ + diff --git a/src/utils.js b/src/utils.js index a1f0009..18728ce 100644 --- a/src/utils.js +++ b/src/utils.js @@ -10,6 +10,10 @@ function Utils() { } + Utils.prototype.convertWhiteSpaceToNonBreakingSpace = function(str) { + return str.slice(0).replace(/ /g, ' '); + }; + Utils.prototype.escape = function(str) { return str.slice(0) .replace(/&/g, '&') diff --git a/test/line-by-line-tests.js b/test/line-by-line-tests.js index f30defa..01b7b29 100644 --- a/test/line-by-line-tests.js +++ b/test/line-by-line-tests.js @@ -9,32 +9,34 @@ describe('LineByLinePrinter', function() { var lineByLinePrinter = new LineByLinePrinter({}); var fileHtml = lineByLinePrinter._generateEmptyDiff(); var expected = '\n' + - ' ' + - '
' + - 'File without changes' + - '
' + + ' \n' + + '
\n' + + ' File without changes\n' + + '
\n' + ' \n' + '\n'; assert.equal(expected, fileHtml); }); }); - describe('_generateLineHtml', function() { + describe('makeLineHtml', function() { it('should work for insertions', function() { var diffParser = require('../src/diff-parser.js').DiffParser; var lineByLinePrinter = new LineByLinePrinter({}); - var fileHtml = lineByLinePrinter._generateLineHtml( + var fileHtml = lineByLinePrinter.makeLineHtml( diffParser.LINE_TYPE.INSERTS, '', 30, '+', 'test'); + fileHtml = fileHtml.replace(/\n\n+/g, '\n'); var expected = '\n' + - ' ' + - '
' + - '
30
' + + ' \n' + + '
\n' + + '
30
\n' + ' \n' + - ' ' + - '
' + - 'test' + - '+
' + + ' \n' + + '
\n' + + ' test\n' + + ' +\n' + + '
\n' + ' \n' + '\n'; @@ -44,17 +46,19 @@ describe('LineByLinePrinter', function() { var diffParser = require('../src/diff-parser.js').DiffParser; var lineByLinePrinter = new LineByLinePrinter({}); - var fileHtml = lineByLinePrinter._generateLineHtml( + var fileHtml = lineByLinePrinter.makeLineHtml( diffParser.LINE_TYPE.DELETES, 30, '', '-', 'test'); + fileHtml = fileHtml.replace(/\n\n+/g, '\n'); var expected = '\n' + - ' ' + - '
30
' + - '
' + + ' \n' + + '
30
\n' + + '
\n' + ' \n' + - ' ' + - '
' + - 'test' + - '-
' + + ' \n' + + '
\n' + + ' test\n' + + ' -\n' + + '
\n' + ' \n' + '\n';