2017-02-03 11 views
0

私は、次の文があるとします。Rubyで3つのセンテンスにデルタを使用するには?

s1 = "The red dog jumped over the hill, followed by the crazy clown." 
s2 = "The green fox jumped over the hill, followed by the crazy clown." 
s3 = "The red dog jumped over the hill, followed by the dumb dolphin." 

私はいくつかの圧縮形式でS2-S1とS3-S1のデルタを格納できるようにしたい、のように:s2_d_s1 = - 「赤犬」+ "グリーンfox "

次に、私はこれらのデルタをとり、s2_d_s1またはs3_d_s1のいずれかを最初から順番に適用できます。次のように等しい:

apply_delta(apply_delta(s1, s2_d_s1), s3_d_s1) == 
    apply_delta(apply_delta(s1, s3_d_s1), s2_d_s1) 

apply_delta(s1, s2_d_s1) == "The green fox jumped over the hill, followed by the crazy clown." 

私はこれをRubyでどうやって行いますか?それを行うライブラリはありますか?

(実際のコンテンツは、文章よりも複雑になるだろう。それは文書です。)

私はfossilizeを試してみたが、変化する文のサイズを処理する方法を見つけ出すことはできません(最初のデルタを適用する文を変更サイズは2番目のデルタを適用してねじ込みます)。

s1 = "The red dog jumped over the hill, followed by the crazy clown." 
s2 = "The green fox jumped over the hill, followed by the crazy clown." 
s3 = "The red dog jumped over the hill, followed by the dumb dolphin." 
s2_d_s1 = Fossilize.create(s1, s2) 
s3_d_s1 = Fossilize.create(s1, s3) 
Fossilize.apply(Fossilize.apply(s1, s2_d_s1), s3_d_s1) 
DeltaApplicationError: Output was -1, but I expected 63! 
    from /Users/me/.rvm/gems/ruby-2.2.1/gems/fossilize-1.1.1/lib/fossilize.rb:107:in `apply' 
    from (irb):14 
    from /Users/me/.rvm/rubies/ruby-2.2.1/bin/irb:11:in `<main>' 
+0

[ruby-git](https://github.com/schacon/ruby-git)はあなたを助けますか? –

+0

Gitはデルタだけでなく、ファイルの状態全体を記録しているので、探しているものではありません。 gitが差分を保持するのはよくある誤解です。 –

答えて

0

あなたのニーズに合わせて、それはDifferと呼ばれています。

require 'differ' 

@original = "Epic lolcat fail!" 
@current = "Epic wolfman fail!" 

@diff = Differ.diff_by_line(@current, @original) 
    # => "{"Epic lolcat fail!" >> "Epic wolfman fail!"}" 

@diff = Differ.diff_by_word(@current, @original) 
    # => "Epic {"lolcat" >> "wolfman"} fail!" 
+0

これはちょっと違います。私はデルタを適用したい。 BTW、私はまたFOSSIL SCMのデルタ圧縮アルゴリズムを使用していますが、彼らは文章のサイズを変更する場合、複数のデルタを適用する方法を把握することはできませんfossilizeしようとしました。 –

関連する問題