require 'diff' module HTMLCollapsable def diff(b) Diff.new(self, b) end def collapse(diff,starttoken,endtoken) newary = nil if diff.difftype == String newary = diff.difftype.new('') else newary = diff.difftype.new end ai = 0 bi = 0 diff.diffs.each { |d| d.each { |mod| quoted = 0 case mod[0] when '-' if ai < mod[1] quoted = 1 end newary << starttoken if quoted == 1 while ai < mod[1] newary << self[ai] ai += 1 bi += 1 end newary << endtoken if quoted == 1 ai += 1 when '+' if bi < mod[1] quoted = 1 end newary << starttoken if quoted == 1 while bi < mod[1] newary << self[ai] ai += 1 bi += 1 end newary << endtoken if quoted == 1 newary << mod[2] bi += 1 else raise "Unknown diff action" end } } quoted = 0 if ai < self.length quoted = 1 end newary << starttoken if quoted == 1 while ai < self.length newary << self[ai] ai += 1 bi += 1 end newary << endtoken if quoted == 1 return newary end end class Array include HTMLCollapsable end class String include HTMLCollapsable end