Class: XHTMLDiff
Constant Summary collapse
- BLOCK_CONTAINERS =
['div', 'ul', 'li']
Instance Attribute Summary collapse
-
#output ⇒ Object
Returns the value of attribute output.
Class Method Summary collapse
Instance Method Summary collapse
- #change(event) ⇒ Object
- #choose_event(event, element, tag) ⇒ Object
- #diff(a, b) ⇒ Object
-
#discard_a(event) ⇒ Object
This will be called when there is an element in A that isn’t in B.
-
#discard_b(event) ⇒ Object
This will be called when there is an element in B that isn’t in A.
-
#initialize(output) ⇒ XHTMLDiff
constructor
A new instance of XHTMLDiff.
-
#match(event) ⇒ Object
This will be called with both elements are the same.
- #wrap(element, tag) ⇒ Object
Constructor Details
#initialize(output) ⇒ XHTMLDiff
Returns a new instance of XHTMLDiff.
81 82 83 |
# File 'lib/xhtmldiff.rb', line 81 def initialize(output) @output = output end |
Instance Attribute Details
#output ⇒ Object
Returns the value of attribute output.
57 58 59 |
# File 'lib/xhtmldiff.rb', line 57 def output @output end |
Class Method Details
.diff(a, b) ⇒ Object
61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
# File 'lib/xhtmldiff.rb', line 61 def diff(a, b) if a == b return a.deep_clone end if REXML::HashableElementDelegator === a and REXML::HashableElementDelegator === b o = REXML::Element.new(a.name) o.add_attributes a.attributes hd = self.new(o) Diff::LCS.traverse_balanced(a, b, hd) o else raise ArgumentError.new("both arguments must be equal or both be elements. a is #{a.class.name} and b is #{b.class.name}") end end |
Instance Method Details
#change(event) ⇒ Object
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
# File 'lib/xhtmldiff.rb', line 96 def change(event) begin sd = diff(event.old_element, event.new_element) rescue ArgumentError debug { $stderr.puts "Not subdiffable: #{$!.}" } sd = nil end if sd and ((rs = Float(sd.to_s.size)) / bs = Math.max(event.old_element.to_s.size, event.new_element.to_s.size)) < 2 debug { $stderr.puts "Chose recursed: rs = #{rs}, bs = #{bs}" } @output << sd else debug { $stderr.puts "Chose block: rs = #{rs}, bs = #{bs}" } @output << wrap(event.old_element, 'del') @output << wrap(event.new_element, 'ins') end end |
#choose_event(event, element, tag) ⇒ Object
118 119 |
# File 'lib/xhtmldiff.rb', line 118 def choose_event(event, element, tag) end |
#diff(a, b) ⇒ Object
77 78 79 |
# File 'lib/xhtmldiff.rb', line 77 def diff(a, b) self.class.diff(a,b) end |
#discard_a(event) ⇒ Object
This will be called when there is an element in A that isn’t in B
92 93 94 |
# File 'lib/xhtmldiff.rb', line 92 def discard_a(event) @output << wrap(event.old_element, 'del') end |
#discard_b(event) ⇒ Object
This will be called when there is an element in B that isn’t in A
114 115 116 |
# File 'lib/xhtmldiff.rb', line 114 def discard_b(event) @output << wrap(event.new_element, 'ins') end |
#match(event) ⇒ Object
This will be called with both elements are the same
86 87 88 89 |
# File 'lib/xhtmldiff.rb', line 86 def match(event) debug { $stderr.puts event.inspect } @output << event.old_element.deep_clone if event.old_element end |
#wrap(element, tag) ⇒ Object
121 122 123 124 125 |
# File 'lib/xhtmldiff.rb', line 121 def wrap(element, tag) el = Element.new tag el << element.deep_clone el end |