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

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

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


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

Неужели это майкрософт взломан? оригинальный? : D

Ahmed Khalaf 01.10.2009 13:48

Похоже на этот вопрос: stackoverflow.com/questions/1061468/html-compare

rjmunro 17.11.2011 15:39

Старый нить, но решил, что отдам свои 2 цента. В последнее время я много с этим сталкивался и нашел кучу библиотек: web.onassar.com/blog/2012/11/21/htmldiff-software-discoverie‌ s

onassar 23.02.2013 10:04

@Haacked, когда-нибудь найти удовлетворительное решение?

DG. 27.03.2014 11:06

@Haacked Нашли рабочее решение? Я пробовал prettydiff.com, но похоже, что он сломан.

coding_idiot 17.05.2019 07:46
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
86
5
33 348
12
Перейти к ответу Данный вопрос помечен как решенный

Ответы 12

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

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

Lasse V. Karlsen 15.09.2008 23:42

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

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

и

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

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

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

Ответ принят как подходящий

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

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

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

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

Если это XHTML (который предполагает многое с моей стороны), поможет ли Xml Diff Patch Toolkit? http://msdn.microsoft.com/en-us/library/aa302294.aspx

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

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

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

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

HTH

daisydiff кажется милым

coding_idiot 17.05.2019 07:58

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

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

Compares and describes all the differences between two XML documents. The document comparison does not stop once the first unrecoverable difference is found, unlike the Diff class.

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

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

http://prettydiff.com/

Поддерживает ли он визуализированные различия? Я не могу найти вариант.

Joel Peltonen 10.12.2012 17:57

Проголосовали против, так как я не смог найти отрендеренную разницу.

Tiago Cardoso 25.11.2013 15:33

Насчет DaisyDiff (доступны версии Ява и PHP).

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

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

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

Обновлено: Эта библиотека перемещена в GitHub.

Алгоритм HTMLDiff был перенесен на JavaScript (CoffeeScript), здесь.

Florian Parain 15.11.2012 12:59

Привет @pate, я считаю, что эти ссылки больше не работают ...

Tiago Cardoso 25.11.2013 15:32

@TiagoCardoso удалил мой датированный комментарий.

Petrus Theron 25.11.2013 16:43

@Rohland Замечательная библиотека! Действительно спасла мне день :)

Sirar Salih 22.09.2015 11:31

Я пробовал версию js, в большинстве случаев она работает достаточно хорошо, но она не может правильно определить разницу в тегах html при одинаковом содержании, т.е. abc меняется на abc

Bill Yang 07.10.2015 17:34

@ Флориан Параин: Спасибо, что поделились ссылкой на github.com/tnwinc/htmldiff.js, он отлично работает! Совет для тех, кто хочет версию JS, просто установите с помощью «npm install htmldiff», а затем используйте htmldiff.js в каталоге «src».

Elijah Lofgren 09.02.2016 23:26

Другие вопросы по теме