Class: SergioSax

Inherits:
Nokogiri::XML::SAX::Document
  • Object
show all
Defined in:
lib/sergio/sergio_sax.rb

Instance Method Summary collapse

Constructor Details

#initialize(object) ⇒ SergioSax

Returns a new instance of SergioSax.



2
3
4
5
# File 'lib/sergio/sergio_sax.rb', line 2

def initialize(object)
  @stack = []
  @object = object
end

Instance Method Details

#cdata_block(string) ⇒ Object



16
17
18
# File 'lib/sergio/sergio_sax.rb', line 16

def cdata_block(string)
  characters(string)
end

#characters(string) ⇒ Object



11
12
13
14
# File 'lib/sergio/sergio_sax.rb', line 11

def characters(string)
  name, attrs = @stack.last
  attrs << ['@text', string]
end

#end_element(name) ⇒ Object



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/sergio/sergio_sax.rb', line 20

def end_element(name)
  e_context = @stack.clone
  name, attrs = @stack.pop
  if sergio_elements = @object.class.sergio_config.get_element_configs(e_context)
    sergio_elements.each do |sergio_element|
      attr = sergio_element.options[:attribute]
      val = attrs.assoc(attr)
      if val
        val = val[1]
        hash_path = sergio_element.new_path
        callback = sergio_element.callback

        r = if callback.arity == 1
          callback.call(val)
        elsif callback.arity == 2
          h = Hash[*attrs.flatten]
          h.delete('@text')
          callback.call(val, Hash[*attrs.flatten])
        end

        @object.sergio_parsed_document.set_element(hash_path, r, sergio_element.options)
      end
    end
  end
end

#start_element(name, attrs = []) ⇒ Object



7
8
9
# File 'lib/sergio/sergio_sax.rb', line 7

def start_element(name, attrs = [])
  @stack << [name, attrs]
end