Skip to content

Commit 9969bb7

Browse files
committed
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!
1 parent c6614d9 commit 9969bb7

File tree

2 files changed

+21
-1
lines changed

2 files changed

+21
-1
lines changed

diff.js

+14-1
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,20 @@ var JsDiff = (function() {
165165

166166
var LineDiff = new Diff();
167167
LineDiff.tokenize = function(value) {
168-
return value.split(/^/m);
168+
var retLines = [];
169+
var lines = value.split(/^/m);
170+
171+
for(var i = 0; i < lines.length; i++) {
172+
var line = lines[i];
173+
var lastLine = lines[i - 1];
174+
175+
if(line == '\n' && lastLine && lastLine.indexOf('\r') == lastLine.length - 1)
176+
retLines[retLines.length - 1] += '\n';
177+
else if(line)
178+
retLines.push(line);
179+
}
180+
181+
return retLines;
169182
};
170183

171184
return {

test/diffTest.js

+7
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,13 @@ describe('#diffLines', function() {
103103
'line\nvalue\nline');
104104
diff.convertChangesToXML(diffResult).should.equal('line\n<ins>value\n</ins><del>value \n</del>line');
105105
});
106+
107+
it('should handle windows line endings', function() {
108+
var diffResult = diff.diffLines(
109+
'line\r\nold value \r\nline',
110+
'line\r\nnew value\r\nline');
111+
diff.convertChangesToXML(diffResult).should.equal('line\r\n<ins>new value\r\n</ins><del>old value \r\n</del>line');
112+
});
106113
});
107114

108115
describe('convertToDMP', function() {

0 commit comments

Comments
 (0)