1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
|
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
Diff.Diff = {
/**
* @param {string} text1
* @param {string} text2
* @return {!Array.<!{0: number, 1: string}>}
*/
charDiff: function(text1, text2) {
var differ = new diff_match_patch();
return differ.diff_main(text1, text2);
},
/**
* @param {!Array.<string>} lines1
* @param {!Array.<string>} lines2
* @return {!Array.<!{0: number, 1: !Array.<string>}>}
*/
lineDiff: function(lines1, lines2) {
/** @type {!Common.CharacterIdMap<string>} */
var idMap = new Common.CharacterIdMap();
var text1 = lines1.map(line => idMap.toChar(line)).join('');
var text2 = lines2.map(line => idMap.toChar(line)).join('');
var diff = Diff.Diff.charDiff(text1, text2);
var lineDiff = [];
for (var i = 0; i < diff.length; i++) {
var lines = [];
for (var j = 0; j < diff[i][1].length; j++)
lines.push(idMap.fromChar(diff[i][1][j]));
lineDiff.push({0: diff[i][0], 1: lines});
}
return lineDiff;
},
/**
* @param {!Array.<!{0: number, 1: !Array.<string>}>} diff
* @return {!Array<!Array<number>>}
*/
convertToEditDiff: function(diff) {
var normalized = [];
var added = 0;
var removed = 0;
for (var i = 0; i < diff.length; ++i) {
var token = diff[i];
if (token[0] === Diff.Diff.Operation.Equal) {
flush();
normalized.push([Diff.Diff.Operation.Equal, token[1].length]);
} else if (token[0] === Diff.Diff.Operation.Delete) {
removed += token[1].length;
} else {
added += token[1].length;
}
}
flush();
return normalized;
function flush() {
if (added && removed) {
var min = Math.min(added, removed);
normalized.push([Diff.Diff.Operation.Edit, min]);
added -= min;
removed -= min;
}
if (added || removed) {
var balance = added - removed;
var type = balance < 0 ? Diff.Diff.Operation.Delete : Diff.Diff.Operation.Insert;
normalized.push([type, Math.abs(balance)]);
added = 0;
removed = 0;
}
}
}
};
Diff.Diff.Operation = {
Equal: 0,
Insert: 1,
Delete: -1,
Edit: 2
};
|