Skip to content

Instantly share code, notes, and snippets.

@skandragon
Created June 14, 2013 18:14
Show Gist options
  • Save skandragon/92b1ad57e360d3948138 to your computer and use it in GitHub Desktop.
Save skandragon/92b1ad57e360d3948138 to your computer and use it in GitHub Desktop.
string combination diff for Diff::LCS
require 'diff/lcs'
class Comparison
attr_reader :sequences
def initialize
@state = ' '
@buffer = ''
@sequences = []
end
def match(element)
append_state(' ', element.old_element)
end
def discard_a(element)
append_state('-', element.old_element)
end
def discard_b(element)
append_state('+', element.new_element)
end
def finalize
dump_buffer('e')
end
private
def append_state(new_state, character)
if (@state == new_state)
else
dump_buffer(new_state)
end
@buffer += character
end
def dump_buffer(new_state)
return if @buffer.empty?
@sequences << [@state, @buffer]
@state = new_state
@buffer = ''
end
end
seq1 = 'This is a test of the emergency broadcast system.'
seq2 = 'This is only a TEST of the broadcast system.'
diff = Diff::LCS.diff(seq1, seq2)
comp = Comparison.new
Diff::LCS.traverse_sequences(seq1, seq2, comp)
comp.finalize
puts comp.sequences.inspect
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment