【问题标题】:How to make Google Diff Match Patch prefer changes at the end of a string?如何使 Google Diff Match Patch 更喜欢字符串末尾的更改?
【发布时间】:2016-02-03 18:06:49
【问题描述】:

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

【问题讨论】:

  • 想分享一把小提琴吗?
  • 抱歉大家没有及时更新更多细节。我病得很重,直到现在才拿起我的笔记本电脑。

标签: javascript google-diff-match-patch


【解决方案1】:

我根据库的作者example page创建了一个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 1changed函数的最后一个};后面没有回车。
  2. Text 2changed 函数的最后一个}; 后面有回车符。
  3. Text 2autorun 函数的最后一个}; 后面没有回车。

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

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

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

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

【讨论】:

  • 是的,当我对这样一个孤立的测试用例进行处理时,它运行良好。我必须再看一下代码,但最近几天我病得很重:(
  • 那你就需要提供你的代码、环境等,否则我们无能为力了。
  • 我添加了一个演示示例的小提琴。
  • 感谢您的研究。告诉我的用户“在您的代码的先前版本中添加新行”有点令人不满意。听起来就像说“这不是错误,而是一项功能”一样好。
  • 如果以编程方式将行添加到第一个文本会怎样?最终用户不会注意到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-16
  • 1970-01-01
  • 2020-12-13
  • 1970-01-01
  • 1970-01-01
  • 2018-04-05
  • 1970-01-01
相关资源
最近更新 更多