使用html标签区分文本

时间:2012-08-27 21:19:21

标签: ruby rubygems diff

我一直想找到或写一个新的差异化宝石,它不仅会突出显示文本中的变化,还会突出显示HTML结构的变化。这是我的意思的一个简单例子。

现在大多数差异化的宝石或算法都会出现类似的情况:

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>"

那里有类似的东西吗?如果没有,我不完全确定如何沿着这些方向构建一些东西。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

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

Nokogiri的to_html方法在输出重组结果时非常有用。

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

你可以尝试不依赖解析器,但我想你会疯了。 HTML过于非结构化和不规则,不仅仅是简单的差异。