Module: Ruboto::Util::ScanInAPI

Included in:
API
Defined in:
lib/ruboto/util/scan_in_api.rb

Instance Method Summary collapse

Instance Method Details

#scan_in_api(file) ⇒ Object

Scan the XML file. Much faster than using REXML.



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/ruboto/util/scan_in_api.rb', line 9

def scan_in_api(file)
  require 'strscan'
  doc = StringScanner.new(file)
  Thread.current[:api] = XMLElement.new
  parents = [Thread.current[:api]]

  while not doc.eos?
    doc.scan(/</)
    if doc.scan(/\/\w+>/)
      parents.pop
    else
      name = doc.scan(/\w+/)
      doc.scan(/\s+/)
      values = {}
      while not (term = doc.scan(/[\/>]/))
        key = doc.scan(/\w+/)
        doc.scan(/='/)
        value = doc.scan(/[^']*/)
        doc.scan(/'\s*/)
        values[key] = value.include?("&") ? value.gsub('&lt;', '<').gsub('&gt;', '>').gsub('&quot;', "\"") : value
      end
      element = parents[-1].add_element(name, values)
      parents.push(element) if term == ">"
      doc.scan(/>/) if term == "/"
    end
  end

  Thread.current[:api]
end