-
-
Save skandragon/92b1ad57e360d3948138 to your computer and use it in GitHub Desktop.
string combination diff for Diff::LCS
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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