class EdifactConverter::AbstractSyntaxTree
Attributes
document[RW]
Public Class Methods
new(document)
click to toggle source
# File lib/edifact_converter/abstract_syntax_tree.rb, line 9 def initialize(document) self.document = document raise 'hell' unless document end
Public Instance Methods
compare(document, &proc)
click to toggle source
# File lib/edifact_converter/abstract_syntax_tree.rb, line 18 def compare(document, &proc) Comparator.new.compare_docs(self.document, document, &proc) end
pack()
click to toggle source
# File lib/edifact_converter/abstract_syntax_tree.rb, line 14 def pack pack_root(document.root) if document.root end
set_checksums()
click to toggle source
# File lib/edifact_converter/abstract_syntax_tree.rb, line 41 def set_checksums document.xpath("//Brev").each do |brev| sum = count_segments(brev) brev.xpath("UNT/Elm[1]/SubElm").each do |elm| elm.content = sum end end end
verify_segments_checksum(&proc)
click to toggle source
# File lib/edifact_converter/abstract_syntax_tree.rb, line 22 def verify_segments_checksum(&proc) errors = [] proc ||= Proc.new { |n| errors << n } document.xpath("//Brev").each do |brev| sum = count_segments brev unt = brev.at("UNT/Elm[1]/SubElm/text()") || '0' if sum != unt.to_s.to_i proc.call( Difference.new( source: brev.at("UNT"), facit: sum, kind: :unt ) ) end end errors end
Private Instance Methods
count_segments(letter)
click to toggle source
# File lib/edifact_converter/abstract_syntax_tree.rb, line 86 def count_segments(letter) sum = 0 letter.traverse do |elm| next if not(elm.element?) || elm.name == "OBJ" || elm['hidden'] sum += 1 if elm.name =~ /[A-Z][A-Z0-9]{2}/ end sum end
last_child_name(element)
click to toggle source
# File lib/edifact_converter/abstract_syntax_tree.rb, line 82 def last_child_name(element) element.last_element_child && element.last_element_child.name end
pack_element(element)
click to toggle source
# File lib/edifact_converter/abstract_syntax_tree.rb, line 58 def pack_element(element) element.elements.reverse.each do |subelm| if subelm.children.empty? subelm.unlink else break end end end
pack_root(root)
click to toggle source
# File lib/edifact_converter/abstract_syntax_tree.rb, line 52 def pack_root(root) root.elements.each do |segment| pack_segment segment end end
pack_segment(segment)
click to toggle source
# File lib/edifact_converter/abstract_syntax_tree.rb, line 68 def pack_segment(segment) if 'Elm' == last_child_name(segment) segment.elements.each { |elm| pack_element elm } segment.elements.reverse.each do |elm| break if elm.elements.any? elm.unlink end else segment.elements.each do |child| pack_segment(child) end end end