有人有渲染 HTML 的 diff 算法吗?

IT技术 javascript html diff
2021-02-02 05:02:25

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

澄清一下,我希望能够将并排的差异视为渲染输出。所以如果我删除一个段落,并排视图会知道正确地间隔。


@Josh 正是如此。虽然它可能会以红色或其他形式显示已删除的文本。这个想法是,如果我对我的 HTML 内容使用 WYSIWYG 编辑器,我不想切换到 HTML 来做差异。我想并排使用两个所见即所得的编辑器。或者至少在最终用户友好的情况下并排显示差异。

6个回答

您可以使用另一个不错的技巧来显着改善呈现的 HTML 差异的外观。虽然这并不能完全解决最初的问题,但它会对呈现的 HTML 差异的外观产生重大影响。

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

稍微详细地解释一下:

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

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

更新:此库已移至GitHub

HTMLDiff 算法已在 JavaScript (CoffeeScript) 中移植,请点击此处
2021-03-16 05:02:25
@Florian Parain:感谢分享github.com/tnwinc/htmldiff.js的链接,效果很好!对于想要 JS 版本的任何人的提示,只需通过“npm install htmldiff”安装,然后在“src”目录中使用 htmldiff.js。
2021-03-16 05:02:25
@TiagoCardoso 删除了我过时的评论。
2021-03-26 05:02:25
@Rohland 很棒的图书馆!真的拯救了我的一天:)
2021-03-26 05:02:25
嗨@pate,我相信这些链接不再有效...
2021-04-06 05:02:25

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

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

HTH

daisydiff 看起来不错
2021-03-25 05:02:25

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

DaisyDiff怎么JavaPHP版本可用)。

以下功能非常好:

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