【发布时间】:2013-04-29 16:37:10
【问题描述】:
我正在为 TinyMCE 生成的 HTML 正文开发类似于 wiki 的差异功能。 diff-lcs 是一个接受数组或对象的差异 gem。大多数差异任务都在代码上,只是比较行。 HTML 文本正文的区别更为复杂。如果我只是插入文本正文,我会得到一个字符一个字符的比较。虽然输出是正确的,但它看起来像垃圾。
seq1 = "<p>Here is a paragraph. A sentence with <strong>bold text</strong>.</p><p>The second paragraph.</p>"
seq2 = seq1.gsub(/[.!?]/, '\0|').split('|')
=> ["<p>Here is a paragraph.", " A sentence with <strong>bold text</strong>.", "</p><p>The second paragraph.", "</p>"]
如果有人更改了第二段,差异输出涉及到前面的段落结束标记。我不能只使用strip_tags,因为我想在比较视图中保持格式。理想的比较是基于完整的句子,将 HTML 分离出来。
seq2.NokogiriMagic
=> ["<p>", "Here is a paragraph.", " A sentence with ", "<strong>", "bold text", "</strong>", ".", "</p>", "<p>", "The second paragraph.", "</p>"]
我发现了很多简洁的 Nokogiri 方法,但没有发现上述方法。
【问题讨论】:
-
Nokogiri 旨在解析 XML/HTML,因此您的起点
seq2(一个字符串数组)并不适合使用 Nokogiri。 TinyMCE 的全部输出是多少?有根元素吗? -
TinyMCE 的输出与 seq1 类似。 seq2 并不重要,我只想使用像 seq3 这样的格式。看来我必须为孩子解析 Nokogiri 对象,然后执行 seq2 之类的操作。
-
您可以使用 SAX 接口并将每个标签附加到一个数组中,对于文本节点,可以按单词拆分。
-
我对 SAX 不熟悉,您能详细说明一下吗?
-
您的 HTML 文件有多大? DOM 解析,这是使用 Nokogiri 解析 HTML 的实际方式,要容易得多。好处是整个文件都被解析并在内存中,因此您可以重新构建 HTML,或在其中跳转。缺点是全部都在内存中。我很少看到不适合内存的 HTML 文件,否则它也不适合浏览器。 SAX 只允许对标记进行线性处理,但不会将其拉入内存,因此可以处理巨大的文件,通常是 XML。请参阅nokogiri.org/Nokogiri/HTML/SAX.html 了解更多信息。