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' +
- '
\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 @@
+
+
+
+
+
+
+ {{ 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';