我一直想找到或写一个新的差异化宝石,它不仅会突出显示文本中的变化,还会突出显示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>"
那里有类似的东西吗?如果没有,我不完全确定如何沿着这些方向构建一些东西。任何帮助将不胜感激。
答案 0 :(得分:1)
对于HTML,您需要使用解析器,例如Nokogiri,它将为您进行一些清理和规范化。然后,您将需要重新格式化文档的标记,以便参数的顺序一致。我建议使用参数的名称进行简单的字母排序。
Nokogiri的to_html
方法在输出重组结果时非常有用。
您还需要确定是否在文本节点中保留或删除空格,以及是否遵守参数和标记名称大小写。
你可以尝试不依赖解析器,但我想你会疯了。 HTML过于非结构化和不规则,不仅仅是简单的差异。