Как заставить Google Diff Match Patch выбрать изменения в конце строки?

Я использую метод diff_main библиотеки DiffMatchPatch Google для получения различий, которые затем я использую в своем приложении. Рассмотрим этот случай:

Старая строка:

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

Дополнение diff я получаю:

;
};

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

Я создал JSFiddle на основе автора библиотеки example страница (предполагая, что вам нужна версия 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 в тексте 1 не имеет возврата каретки после нее.
  • Последняя }; функции changed в тексте 2 возвращает карету после нее.
  • Конечная }; функции autorun в тексте 2 не имеет возврата каретки после нее.

Итак, алгоритм, который вычисляет diff, будет соответствовать 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]

Обратите внимание, что если вы используете только этот текст, алгоритм будет работать правильно (как я показал в своем оригинальном ответе). Это после того, как вы добавите еще какой-нибудь текст, когда эта конфуция начнет происходить, не зная почему.