任何人都有渲染HTML的diff算法?

时间:2008-08-28 06:33:38

标签: javascript html diff

我有兴趣看到一个很好的差异算法,可能在Javascript中,用于渲染两个HTML页面的并排差异。我们的想法是差异将显示呈现的 HTML的差异。

为了澄清,我希望能够看到并排差异渲染输出。因此,如果我删除一个段落,并排视图就会知道正确的空格。


完全是@Josh。虽然它可能会显示删除的文本为红色或其他东西。我的想法是,如果我为我的HTML内容使用WYSIWYG编辑器,我不希望必须切换到HTML来做差异。我希望与两个WYSIWYG编辑并排。或者至少在最终用户友好的事情中并排显示差异。

12 个答案:

答案 0 :(得分:17)

还有一个很好的技巧可以用来显着改善渲染的HTML差异的外观。虽然这并没有完全解决最初的问题,但它会对渲染的HTML差异的外观产生重大影响。

并排渲染的HTML会使你的差异难以垂直排列。垂直对齐对于比较并排差异至关重要。为了改善并排差异的垂直对齐,您可以在差异应该垂直对齐的“检查点”的每个版本的差异中插入不可见的HTML元素。然后,您可以使用一些客户端JavaScript在检查点周围添加垂直间距,直到两边垂直排列。

更详细地解释:

如果你想使用这种技术,运行你的差异算法,并在你的并排版本匹配的任何地方插入一堆visibility:hidden <span>或小<div> s根据差异。然后运行JavaScript,找到每个检查点(及其并排的邻居),并将垂直间距添加到页面上较高(较浅)的检查点。现在,渲染的HTML差异将垂直对齐到该检查点,您可以继续修复并排页面的其余部分的垂直对齐。

答案 1 :(得分:16)

上周末,我在codeplex上发布了一个新项目,该项目在C#中实现了HTML diff算法。原始算法是用Ruby编写的。我知道您正在寻找一个JavaScript实现,也许在C#中有一个可用的源代码可以帮助您移植算法。如果您有兴趣,请点击以下链接:htmldiff.codeplex.com。您可以阅读更多相关信息here

更新:此库已移至GitHub

答案 2 :(得分:4)

我最后还需要类似的东西。为了让HTML排列在一起,您可以使用两个iFrame,但是当您滚动时,您必须通过javascript将它们的滚动绑定在一起(如果您允许滚动)。

但是,要查看差异,您很可能想要使用其他人的库。我使用了DaisyDiff,一个Java库,用于类似的项目,我的客户很高兴看到内容的单个HTML呈现与MS Word“跟踪更改”一样的标记。

HTH

答案 3 :(得分:4)

考虑使用链接或lynx的输出来呈现html的纯文本版本,然后对其进行差异化。

答案 4 :(得分:2)

DaisyDiffJavaPHP可用的部队怎么样?

以下功能非常好:

  • 使用格式错误的HTML,可以“在野外”找到。
  • HTML中的差异比XML树更加专业化。更改文本节点的一部分不会导致整个节点发生更改。
  • 除了默认的视觉差异外,还可以连贯地扩展HTML源代码。
  • 提供易于理解的更改说明。
  • 默认GUI允许通过键盘快捷键和链接轻松浏览修改。

答案 5 :(得分:1)

所以,你期待

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

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

被认为是一样的吗?

输出很大程度上取决于用户代理。与Ionut Anghelcovici suggests一样,制作图片。为您关心的每个浏览器做一个。

答案 6 :(得分:1)

使用Pretty Diff for HTML的标记模式。它完全用JavaScript编写。

http://prettydiff.com/

答案 7 :(得分:0)

如果它是XHTML(我假设很多)Xml Diff Patch Toolkit会有帮助吗? http://msdn.microsoft.com/en-us/library/aa302294.aspx

答案 8 :(得分:0)

对于较小的差异,你可以做一个普通的文本差异,然后分析丢失或插入的部分,看看如何解决它,但对于任何更大的差异,你将很难做到这一点

例如,您如何检测并显示左对齐图像(文本段落的左侧)突然变为右对齐?

答案 9 :(得分:0)

使用不同的文本会破坏非平凡的文档。 根据您认为的直观,XML的不同可能会生成对带有标记的文本不太好的差异。 AFAIK,DaisyDiff是唯一专门用于HTML的库。它适用于HTML的一个子集。

答案 10 :(得分:0)

如果您使用的是Java和XHTML,XMLUnit允许您通过org.custommonkey.xmlunit.DetailedDiff类比较两个XML文档:

  

比较和描述所有   两个XML文档之间的差异。   文件比较不会停止   一旦第一次无法恢复   与Diff不同,发现了差异   类。

答案 11 :(得分:-5)

我认为这样做的好方法是render the HTML to an image,然后使用一些diff tool that can compare images来发现差异。