如何使Google差异匹配补丁更喜欢字符串末尾的更改?

时间:2016-02-03 18:06:49

标签: javascript google-diff-match-patch

我正在使用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/

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;
};

让我们注意这一点:

  1. Text 1 上的changed函数的最终}; 后面没有回车符。
  2. Text 2 上的changed函数的最终}; 后面有回车符。
  3. Text 2 上的autorun函数的最终}; 后面没有回车符。
  4. 因此,计算差异的算法将13匹配,将2作为添加的文本。这就是tou获得输出的原因。

    现在,为了获得所需的输出,您需要将12匹配。这意味着在文本1 的末尾添加一个新的空行,您可以在巡视更新 JSFIddle 上看到:

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

    请注意,如果您只使用此文本,算法将正常工作(正如我在原始答案中所示)。这是在你开始发生这种混乱时添加更多文本之后,不确定原因。