2017-02-03 1 views
0

Предположим, у меня есть следующие предложения:Как использовать дельта на 3 предложения в Ruby?

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? Есть ли библиотека, которая бы это сделала?

(Фактическое содержание будет более сложным, чем предложения. Это документы.)

Я попытался окаменелость, но не могу понять, как обрабатывать изменение размера предложения (применение первого дельту изменяет предложение размер, который щурит нанесение второго дельты):

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

Существует драгоценный камень для ваших потребностей, это называется Отличается.

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

Это просто отличается. Я хочу применить дельт. Кстати, я также попробовал окаменелость, которая использует алгоритм дельта-сжатия FOSSIL SCM, но я не могу понять, как применять несколько дельт, если они изменяют размер предложения. –

Смежные вопросы