У кого-нибудь есть алгоритм сравнения для визуализированного HTML? [закрыто]

85

Мне интересно увидеть хороший алгоритм сравнения, возможно, в Javascript, для рендеринга параллельного сравнения двух страниц HTML. Идея заключалась бы в том, что разница будет показывать различия отрисованного HTML.

Чтобы уточнить, я хочу иметь возможность видеть параллельные различия как визуализированный результат. Так что, если я удалю абзац, горизонтальный вид будет правильно расставлять элементы.


@ Джош точно. Хотя, возможно, он покажет удаленный текст красным или что-то в этом роде. Идея состоит в том, что если я использую WYSIWYG-редактор для своего HTML-контента, мне не нужно переключаться на HTML для выполнения различий. Я хочу сделать это, возможно, с двумя редакторами WYSIWYG бок о бок. Или, по крайней мере, отображать различия бок о бок в удобном для конечного пользователя вопросе.

Haacked
источник
1
Неужели это майкрософт взломан? оригинальный? : D
Ахмед Халаф
1
Похоже на этот вопрос: stackoverflow.com/questions/1061468/html-compare
rjmunro
2
Старый нить, но решил, что отдам свои 2 цента. В последнее время я много с этим сталкивался и нашел кучу библиотек
onassar
2
@Haacked, когда-нибудь находили удовлетворительное решение?
ДГ.
@Haacked Нашли рабочее решение? Я пробовал, prettydiff.comно похоже, что он сломан.
coding_idiot

Ответы:

17

Есть еще один приятный прием, который можно использовать, чтобы значительно улучшить внешний вид визуализированного HTML-кода. Хотя это не решает полностью исходную проблему, это существенно повлияет на внешний вид визуализированных HTML-различий.

HTML-код, отображаемый бок о бок, очень затруднит выравнивание вашего diff по вертикали. Вертикальное выравнивание имеет решающее значение для сравнения горизонтальных дифференциалов. Чтобы улучшить вертикальное выравнивание параллельного сравнения, вы можете вставить невидимые элементы HTML в каждую версию сравнения в «контрольных точках», где разница должна быть выровнена по вертикали. Затем вы можете использовать немного клиентского JavaScript, чтобы добавить вертикальный интервал вокруг контрольной точки, пока стороны не выровняются по вертикали.

Объясняется немного подробнее:

Если вы хотите использовать эту технику, запустите свой алгоритм сравнения и вставьте кучу visibility:hidden <span>s или tiny <div>s там, где ваши параллельные версии должны совпадать, в соответствии с diff. Затем запустите JavaScript, который находит каждую контрольную точку (и ее соседа рядом) и добавляет вертикальный интервал к контрольной точке, которая находится выше (мельче) на странице. Теперь визуализированный HTML-код будет выровнен по вертикали до этой контрольной точки, и вы можете продолжить восстановление вертикального выравнивания по остальной части вашей параллельной страницы.

Каменс
источник
17

На выходных я опубликовал новый проект на codeplex, который реализует алгоритм HTML diff на C #. Исходный алгоритм был написан на Ruby. Я понимаю, что вы искали реализацию JavaScript, возможно, наличие такой реализации на C # с исходным кодом может помочь вам перенести алгоритм. Вот ссылка, если вам интересно: htmldiff.codeplex.com . Вы можете прочитать об этом здесь .

ОБНОВЛЕНИЕ: эта библиотека перенесена на GitHub .

Роланд
источник
4
Алгоритм HTMLDiff был перенесен на JavaScript (CoffeeScript) здесь .
Флориан Параин
Привет, @pate, я считаю, что эти ссылки больше не работают ...
Тьяго Кардосо
@TiagoCardoso удалил мой датированный комментарий.
Петрус Терон
@Rohland Замечательная библиотека! Действительно спас мне день :)
Сирар Салих
2
@Florian Parain: Спасибо, что поделились ссылкой на github.com/tnwinc/htmldiff.js, отлично работает! Совет для тех, кто хочет версию JS, просто установите с помощью «npm install htmldiff», а затем используйте htmldiff.js в каталоге «src».
Элайджа Лофгрен
4

Некоторое время назад мне понадобилось нечто подобное. Чтобы выровнять HTML бок о бок, вы можете использовать два iFrames, но тогда вам придется связать их прокрутку вместе с помощью javascript при прокрутке (если вы разрешаете прокрутку).

Однако, чтобы увидеть разницу, вы, скорее всего, захотите использовать чужую библиотеку. Я использовал DaisyDiff , библиотеку Java, для аналогичного проекта, в котором мой клиент был доволен тем, что увидел один HTML-рендеринг контента с разметкой, подобной «отслеживанию изменений» в MS Word.

HTH

Kooshmoose
источник
daisydiff кажется хорошим
coding_idiot
4

Рассмотрите возможность использования вывода ссылок или lynx для рендеринга текстовой версии html, а затем сравните ее.

Арафангион
источник
2

А как насчет DaisyDiff ( доступны версии Java и PHP ).

Следующие функции действительно хороши:

  • Работает с плохо сформированным HTML, который можно найти «в природе».
  • Различия более специализированы на HTML, чем на XML-дереве. Изменение части текстового узла не приведет к изменению всего узла.
  • В дополнение к визуальному различию по умолчанию, исходный HTML-код может быть согласован.
  • Предоставляет понятные описания изменений.
  • Графический интерфейс пользователя по умолчанию позволяет легко просматривать изменения с помощью сочетаний клавиш и ссылок.
Эльхоим
источник
1

Итак, вы ожидаете

<font face="Arial">Hi Mom</font>

а также

<span style="font-family:Arial;">Hi Mom</span>

считаться таким же?

Результат очень сильно зависит от User Agent. Как предлагает Ионут Ангелковичи , создайте имидж. Сделайте по одному для каждого интересующего вас браузера.

Джош
источник
1

Используйте режим разметки Pretty Diff для HTML. Он полностью написан на JavaScript.

http://prettydiff.com/

Остинчени
источник
1
Поддерживает ли он визуализированные различия? Я не могу найти вариант.
Joel Peltonen
2
Проголосовали против, так как я не смог найти визуализированную разницу.
Tiago Cardoso
0

Для меньших различий вы могли бы сделать обычное text-diff, а затем проанализировать отсутствующие или вставленные части, чтобы увидеть, как их решить, но для любых больших различий вам будет очень сложно это сделать.

Например, как вы обнаружите и покажете, что изображение, выровненное по левому краю (плавающее слева от абзаца текста), внезапно стало выровненным по правому краю?

Лассе В. Карлсен
источник
0

Использование различий в тексте приведет к поломке в нетривиальных документах. В зависимости от того, что вы считаете интуитивно понятным, разные XML, вероятно, будут генерировать различия, которые не очень подходят для текста с разметкой. AFAIK , DaisyDiff - единственная библиотека, специализирующаяся на HTML. Он отлично подходит для подмножества HTML.


источник
0

Если вы работали с Java и XHTML, XMLUnit позволяет сравнивать два XML-документа через класс org.custommonkey.xmlunit.DetailedDiff :

Сравнивает и описывает все различия между двумя XML-документами. В отличие от класса Diff сравнение документов не прекращается после обнаружения первого неисправимого различия.

Атес Горал
источник
-5

Я считаю, что хороший способ сделать это - преобразовать HTML в изображение, а затем использовать какой-нибудь инструмент сравнения, который может сравнивать изображения, чтобы определить различия.


источник
Любое несовпадение в этих двух изображениях, конечно же, приведет к огромным различиям, где фактическая разница будет минимальной, например, если таблица на один пиксель выше на одной из двух страниц.
Лассе В. Карлсен,