我正在使用Google的DiffMatchPatch库的diff_main
方法来获取我在应用中使用的差异。考虑这种情况:
旧字符串:
Tracker.Dependency.prototype.changed = function () {
for (var id in this._dependentsById)
this._dependentsById[id]._compute();
};
新字符串:
Tracker.Dependency.prototype.changed = function () {
for (var id in this._dependentsById)
this._dependentsById[id]._compute();
};
Tracker.autorun = function (f) {
constructingComputation = true;
var c = new Tracker.Computation(f);
return c;
};
我得到的加法差异是:
;
};
Tracker.autorun = function (f) {
constructingComputation = true;
var c = new Tracker.Computation(f);
return c
然而,对于人类消费来说,似乎更合理的差异是:
Tracker.autorun = function (f) {
constructingComputation = true;
var c = new Tracker.Computation(f);
return c;
};
有什么方法可以让DiffMatchPatch产生第二个结果而不是第一个?
您可以在此处查看示例:https://jsfiddle.net/puje78vL/1/
答案 0 :(得分:8)
我已根据库的作者JSFiddle创建了一个example page(假设您需要基于问号标签的Javascript版本)。
使用此代码可以满足您的期望:
var dmp = new diff_match_patch();
function launch() {
var text1 = document.getElementById('text1').value;
var text2 = document.getElementById('text2').value;
var d = dmp.diff_main(text1, text2);
var ds = dmp.diff_prettyHtml(d);
document.getElementById('outputdiv').innerHTML = ds;
}
您还可以查看控制台并查看原始答案(数组),您还可以看到diff_main
正在返回您期望的内容。你在做一些不同的事吗?如果是这样,请分享您的代码。
新信息
现在你提供了全文我可以给你一个更好的答案:你看到的结果还可以,这就是算法的工作方式
我会尝试向您解释发生了什么以及如何解决这个问题。让我们来看看每个文本的最后部分:
文字1
Tracker.Dependency.prototype.changed = function () {
for (var id in this._dependentsById)
this._dependentsById[id]._compute();
};
文字2
Tracker.Dependency.prototype.changed = function () {
for (var id in this._dependentsById)
this._dependentsById[id]._compute();
};
Tracker.autorun = function (f) {
constructingComputation = true;
var c = new Tracker.Computation(f);
return c;
};
让我们注意这一点:
changed
函数的最终}; 后面没有回车符。changed
函数的最终}; 后面有回车符。 autorun
函数的最终}; 后面没有回车符。 因此,计算差异的算法将1
与3
匹配,将2
作为添加的文本。这就是tou获得输出的原因。
现在,为了获得所需的输出,您需要将1
与2
匹配。这意味着在文本1 的末尾添加一个新的空行,您可以在巡视更新 JSFIddle 上看到:
Tracker.Dependency.prototype.changed = function () {
for (var id in this._dependentsById)
this._dependentsById[id]._compute();
};[PRESS ENTER HERE TO ADD NEW LINE]
请注意,如果您只使用此文本,算法将正常工作(正如我在原始答案中所示)。这是在你开始发生这种混乱时添加更多文本之后,不确定原因。