0

我一直想找到或编写一个新的 diffing gem,它不仅可以突出显示文本的变化,还可以突出 HTML 结构的变化。这是我的意思的一个快速示例。

现在,大多数不同的 gems 或 algos 将采用以下内容:

a = "<p>I am some text</p>"
b = "<p>I was some text</p>"
MyDiffer.diff(a,b)
=> "<p>I <del>am</del><ins>was</ins> some text</p>"

然而,当 HTML 标签被抛出时,它们中的大多数都没有正确考虑。我想看到这样的东西:

a = "<p>I am <strong>some</strong> text</p>"
b = "<p>I was some text</p>"
MyDiffer.diff(a,b)
=> "<p>I <del>am</del><ins>was</ins> <del class='htmlchange'><strong>some</strong></del><ins class="htmlchange">some</ins></p>"
a = "<p>I am a sentence.  I am another sentence.</p>"
b = "<p>I am a sentence.</p><p>I am another sentence.</p>"
MyDiffer.diff(a,b)
=> "<p>I am a sentence.<del class="htmlchange">I am another sentence</del></p><ins class="htmlchange"><p>I am another sentence</p></ins>"

外面有这样的东西吗?如果不是,我不完全确定如何按照这些思路进行构建。任何帮助,将不胜感激。

4

1 回答 1

1

对于 HTML,您需要使用解析器,例如 Nokogiri,它会为您进行一些清理和规范化。然后,您需要重新格式化文档的标签,以便参数的顺序一致。我建议使用参数名称进行简单的字母排序。

在输出重组结果时, Nokogiri 的to_html方法将很有用。

您还需要决定是否在文本节点中保留或删除空格,以及是否支持参数和标记名大小写。

您可以尝试在不依赖解析器的情况下执行此操作,但我认为您会发疯。HTML 过于非结构化和不规则,只能做一个简单的 diff。

于 2012-08-27T21:48:41.977 回答