From 9969bb7b245bf191b8d7568e9baca61ccb88557e Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Wed, 11 Dec 2013 16:50:14 -0800 Subject: [PATCH] Handle windows newlines on non windows machines. `value.split(/^/m)` splits the `some\r\ntext` into 3 different elements: ``` ['some\r', '\n', 'text'] ``` Not good for diffing! --- diff.js | 15 ++++++++++++++- test/diffTest.js | 7 +++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/diff.js b/diff.js index a34c22a04..efab725ee 100644 --- a/diff.js +++ b/diff.js @@ -165,7 +165,20 @@ var JsDiff = (function() { var LineDiff = new Diff(); LineDiff.tokenize = function(value) { - return value.split(/^/m); + var retLines = []; + var lines = value.split(/^/m); + + for(var i = 0; i < lines.length; i++) { + var line = lines[i]; + var lastLine = lines[i - 1]; + + if(line == '\n' && lastLine && lastLine.indexOf('\r') == lastLine.length - 1) + retLines[retLines.length - 1] += '\n'; + else if(line) + retLines.push(line); + } + + return retLines; }; return { diff --git a/test/diffTest.js b/test/diffTest.js index 91dafe1c4..e2aa8eabb 100644 --- a/test/diffTest.js +++ b/test/diffTest.js @@ -103,6 +103,13 @@ describe('#diffLines', function() { 'line\nvalue\nline'); diff.convertChangesToXML(diffResult).should.equal('line\nvalue\nvalue \nline'); }); + + it('should handle windows line endings', function() { + var diffResult = diff.diffLines( + 'line\r\nold value \r\nline', + 'line\r\nnew value\r\nline'); + diff.convertChangesToXML(diffResult).should.equal('line\r\nnew value\r\nold value \r\nline'); + }); }); describe('convertToDMP', function() {