我正在爲TinyMCE生成的HTML體創建類似wiki的差異功能。 diff-lcs
是接受數組或對象的差異gem。大多數不同的任務在代碼上,只是比較行。 HTML文本體的差異更爲複雜。如果我插入文本的主體,我會逐字比較一個字符。雖然輸出是正確的,但它看起來像垃圾。將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的全部輸出是什麼?有沒有根元素? – 2013-04-29 16:48:10
TinyMCE的輸出與seq1類似。 seq2並不重要,我只想用seq3這樣的格式進行操作。看起來我必須爲孩子解析Nokogiri對象,然後執行諸如seq2之類的操作。 – Archonic 2013-04-29 16:55:02
您可以使用SAX界面並將每個標籤附加到數組,並將文本節點附加到單詞上。 – 2013-04-29 16:58:08