0

私は、テキストの変更だけでなく、HTML 構造の変更も強調する新しい diffing gem を見つけるか書きたいと思っていました。これが私の言いたいことの簡単な例です。

現在、ほとんどの diffing gem や 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 などのパーサーを使用することをお勧めします。次に、パラメーターが一貫した順序になるように、ドキュメントのタグを再フォーマットする必要があります。パラメータの名前を使用した単純なアルファベット順の並べ替えをお勧めします。

ノコギリのto_html方法は、リストラの結果をアウトプットする際に役立ちます。

テキストノードで空白を保持するか削除するか、およびパラメータとタグ名の大文字と小文字を区別するかどうかも決定する必要があります。

パーサーに頼らずにやってみることもできますが、気が狂ってしまうと思います。HTML は単純な diff 以上のことを行うにはあまりにも構造化されておらず、不規則です。

于 2012-08-27T21:48:41.977 に答える