16

我正在使用diff_mainGoogle 的 DiffMatchPatch 库的方法来获取差异,然后在我的应用程序中使用这些差异。考虑这种情况:

旧字符串:

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/

4

1 回答 1

8

我创建了一个JSFiddle基于库的作者示例页面(假设您想要基于问题标签的 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;
};

让我们注意到这一点:

  1. 最后的}; Text 1上的changed函数的后面没有回车。
  2. 最后的}; Text 2上的changed函数的后面有回车符。
  3. 最后的}; Text 2上的autorun函数的后面没有回车。

因此计算差异的算法将与 匹配13留下2添加的文本。这就是为什么你得到那个输出。

现在,为了获得所需的输出,您需要匹配1. 这意味着在Text 12的末尾添加一个新的空行,正如您在 tour updated 中看到的那样:JSFIddle

Tracker.Dependency.prototype.changed = function () {
  for (var id in this._dependentsById)
    this._dependentsById[id]._compute();
};[PRESS ENTER HERE TO ADD NEW LINE]

请注意,如果您仅使用此文本,算法将正常工作(如我在原始答案中所示)。当这种混乱开始发生时,它是在您添加更多文本之后,不知道为什么。

于 2016-02-05T21:16:03.403 回答