diff --git a/jsdiff.js b/jsdiff.js
deleted file mode 100644
index 1175278..0000000
--- a/jsdiff.js
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Javascript Diff Algorithm
- * By John Resig (http://ejohn.org/)
- * Modified by Chu Alan "sprite"
- * Modified by Rodrigo Fernandes "rtfpessoa"
- *
- * Released under the MIT license.
- *
- * More Info:
- * http://ejohn.org/projects/javascript-diff-algorithm/
- */
-
-function JsDiff(o, n) {
- o = o.replace(/\s+$/, '');
- n = n.replace(/\s+$/, '');
-
- var out = diff(o == "" ? [] : o.split(/\s+/), n == "" ? [] : n.split(/\s+/));
- var str = "";
-
- var oSpace = o.match(/\s+/g);
- if (oSpace == null) {
- oSpace = ["\n"];
- } else {
- oSpace.push("\n");
- }
- var nSpace = n.match(/\s+/g);
- if (nSpace == null) {
- nSpace = ["\n"];
- } else {
- nSpace.push("\n");
- }
-
- if (out.n.length == 0) {
- for (var i = 0; i < out.o.length; i++) {
- str += '' + out.o[i] + oSpace[i] + "";
- }
- } else {
- if (out.n[0].text == null) {
- for (n = 0; n < out.o.length && out.o[n].text == null; n++) {
- str += '' + out.o[n] + oSpace[n] + "";
- }
- }
-
- for (var i = 0; i < out.n.length; i++) {
- if (out.n[i].text == null) {
- str += '' + out.n[i] + nSpace[i] + "";
- } else {
- var pre = "";
-
- for (n = out.n[i].row + 1; n < out.o.length && out.o[n].text == null; n++) {
- pre += '' + out.o[n] + oSpace[n] + "";
- }
- str += " " + out.n[i].text + nSpace[i] + pre;
- }
- }
- }
-
- return str;
-}
-
-function diff(o, n) {
- var ns = new Object();
- var os = new Object();
-
- for (var i = 0; i < n.length; i++) {
- if (ns[n[i]] == null)
- ns[n[i]] = {rows: new Array(), o: null};
- ns[n[i]].rows.push(i);
- }
-
- for (var i = 0; i < o.length; i++) {
- if (os[o[i]] == null)
- os[o[i]] = {rows: new Array(), n: null};
- os[o[i]].rows.push(i);
- }
-
- for (var i in ns) {
- if (ns[i].rows.length == 1 && typeof(os[i]) != "undefined" && os[i].rows.length == 1) {
- n[ns[i].rows[0]] = {text: n[ns[i].rows[0]], row: os[i].rows[0]};
- o[os[i].rows[0]] = {text: o[os[i].rows[0]], row: ns[i].rows[0]};
- }
- }
-
- for (var i = 0; i < n.length - 1; i++) {
- if (n[i].text != null && n[i + 1].text == null && n[i].row + 1 < o.length && o[n[i].row + 1].text == null &&
- n[i + 1] == o[n[i].row + 1]) {
- n[i + 1] = {text: n[i + 1], row: n[i].row + 1};
- o[n[i].row + 1] = {text: o[n[i].row + 1], row: i + 1};
- }
- }
-
- for (var i = n.length - 1; i > 0; i--) {
- if (n[i].text != null && n[i - 1].text == null && n[i].row > 0 && o[n[i].row - 1].text == null &&
- n[i - 1] == o[n[i].row - 1]) {
- n[i - 1] = {text: n[i - 1], row: n[i].row - 1};
- o[n[i].row - 1] = {text: o[n[i].row - 1], row: i - 1};
- }
- }
-
- return {o: o, n: n};
-}
diff --git a/src/diff-parser.js b/src/diff-parser.js
index bbe3c92..43fb396 100644
--- a/src/diff-parser.js
+++ b/src/diff-parser.js
@@ -64,12 +64,12 @@
var values;
if (values = /^@@ -(\d+),\d+ \+(\d+),\d+ @@.*/.exec(line)) {
- currentFile.isTripleDiff = false;
+ currentFile.isCombined = false;
} else if (values = /^@@@ -(\d+),\d+ -\d+,\d+ \+(\d+),\d+ @@@.*/.exec(line)) {
- currentFile.isTripleDiff = true;
+ currentFile.isCombined = true;
} else {
values = [0, 0];
- currentFile.isTripleDiff = false;
+ currentFile.isCombined = false;
}
oldLine = values[1];
@@ -120,23 +120,82 @@
// Unmerged paths, and possibly other non-diffable files
// https://github.com/scottgonzalez/pretty-diff/issues/11
// Also, remove some useless lines
- if (!line || utils.startsWith(line, "*") ||
- utils.startsWith(line, "new") || utils.startsWith(line, "index")) {
+ if (!line || utils.startsWith(line, "*")) {
+ //|| utils.startsWith(line, "new") || utils.startsWith(line, "index")
return;
}
+ /* Diff */
+ var oldMode = /old mode (\d{6})/;
+ var newMode = /new mode (\d{6})/;
+ var deletedFileMode = /deleted file mode (\d{6})/;
+ var newFileMode = /new file mode (\d{6})/;
+
+ var copyFrom = /copy from (.+)/;
+ var copyTo = /copy to (.+)/;
+
+ var renameFrom = /rename from (.+)/;
+ var renameTo = /rename to (.+)/;
+
+ var similarityIndex = /similarity index (\d+)%/;
+ var dissimilarityIndex = /dissimilarity index (\d+)%/;
+ var index = /index ([0-9a-z]+)..([0-9a-z]+) (\d{6})?/;
+
+ /* Combined Diff */
+ var combinedIndex = /index ([0-9a-z]+),([0-9a-z]+)..([0-9a-z]+)/;
+ var combinedMode = /mode (\d{6}),(\d{6})..(\d{6})/;
+ var combinedNewFile = /new file mode (\d{6})/;
+ var combinedDeletedFile = /deleted file mode (\d{6}),(\d{6})/;
+
var values = [];
if (utils.startsWith(line, "diff")) {
startFile();
} else if (currentFile && !currentFile.oldName && (values = /^--- a\/(\S+).*$/.exec(line))) {
currentFile.oldName = values[1];
+ currentFile.language = getExtension(currentFile.oldName, currentFile.language);
} else if (currentFile && !currentFile.newName && (values = /^\+\+\+ [b]?\/(\S+).*$/.exec(line))) {
currentFile.newName = values[1];
-
- var fileSplit = currentFile.newName.split(".");
- currentFile.language = fileSplit[fileSplit.length - 1];
+ currentFile.language = getExtension(currentFile.newName, currentFile.language);
} else if (currentFile && utils.startsWith(line, "@@")) {
startBlock(line);
+ } else if ((values = oldMode.exec(line))) {
+ currentFile.oldMode = values[1];
+ } else if ((values = newMode.exec(line))) {
+ currentFile.newMode = values[1];
+ } else if ((values = deletedFileMode.exec(line))) {
+ currentFile.deletedFileMode = values[1];
+ } else if ((values = newFileMode.exec(line))) {
+ currentFile.newFileMode = values[1];
+ } else if ((values = copyFrom.exec(line))) {
+ currentFile.oldName = values[1];
+ currentFile.isCopy = true;
+ } else if ((values = copyTo.exec(line))) {
+ currentFile.newName = values[1];
+ currentFile.isCopy = true;
+ } else if ((values = renameFrom.exec(line))) {
+ currentFile.oldName = values[1];
+ currentFile.isRename = true;
+ } else if ((values = renameTo.exec(line))) {
+ currentFile.newName = values[1];
+ currentFile.isRename = true;
+ } else if ((values = similarityIndex.exec(line))) {
+ currentFile.unchangedPercentage = values[1];
+ } else if ((values = dissimilarityIndex.exec(line))) {
+ currentFile.changedPercentage = values[1];
+ } else if ((values = index.exec(line))) {
+ currentFile.checksumBefore = values[1];
+ currentFile.checksumAfter = values[2];
+ values[2] && (currentFile.mode = values[3]);
+ } else if ((values = combinedIndex.exec(line))) {
+ currentFile.checksumBefore = [values[2], values[3]];
+ currentFile.checksumAfter = values[1];
+ } else if ((values = combinedMode.exec(line))) {
+ currentFile.oldMode = [values[2], values[3]];
+ currentFile.newMode = values[1];
+ } else if ((values = combinedNewFile.exec(line))) {
+ currentFile.newFileMode = values[1];
+ } else if ((values = combinedDeletedFile.exec(line))) {
+ currentFile.deletedFileMode = values[1];
} else if (currentBlock) {
createLine(line);
}
@@ -148,6 +207,12 @@
return files;
};
+ function getExtension(filename, language) {
+ var nameSplit = filename.split(".");
+ if (nameSplit.length > 1) return nameSplit[nameSplit.length - 1];
+ else return language;
+ }
+
if (typeof module !== 'undefined' && module.exports) {
module.exports.DiffParser = new DiffParser();
} else if (typeof global.DiffParser === 'undefined') {
diff --git a/src/diff2html.js b/src/diff2html.js
index ad5664f..5d769d3 100644
--- a/src/diff2html.js
+++ b/src/diff2html.js
@@ -30,7 +30,6 @@
*/
Diff2Html.prototype.getPrettyHtmlFromDiff = function (diffInput, config) {
var diffJson = diffParser.generateDiffJson(diffInput);
-
var configOrEmpty = config || {};
return htmlPrinter.generateLineByLineJsonHtml(diffJson, configOrEmpty);
};
diff --git a/src/line-by-line-printer.js b/src/line-by-line-printer.js
index 20b040d..578662b 100644
--- a/src/line-by-line-printer.js
+++ b/src/line-by-line-printer.js
@@ -17,19 +17,24 @@
LineByLinePrinter.prototype.generateLineByLineJsonHtml = function (diffFiles, config) {
return "