class EimXML::Parser

Attributes

scanner[R]

Public Class Methods

new(src) click to toggle source
   # File lib/eim_xml/parser.rb
24 def initialize(src)
25         @scanner = StringScanner.new(src)
26         @scanner.scan(/\s*<\?.*?\?>\s*/)
27 end

Public Instance Methods

parse() click to toggle source
   # File lib/eim_xml/parser.rb
29 def parse
30         if @scanner.scan(RE::EMPTY_ELEMENT)
31                 parse_empty_element
32         elsif @scanner.scan(RE::START_TAG)
33                 parse_start_tag
34         elsif @scanner.scan(RE::STRING)
35                 parse_string
36         else
37                 nil
38         end
39 end

Protected Instance Methods

parse_empty_element() click to toggle source
   # File lib/eim_xml/parser.rb
49 def parse_empty_element
50         parse_tag
51 end
parse_start_tag() click to toggle source
   # File lib/eim_xml/parser.rb
54 def parse_start_tag
55         e = parse_tag
56 
57         until @scanner.scan(RE::END_TAG)
58                 c = parse
59                 raise ParseError.new("Syntax error.") unless c
60                 e << c
61         end
62         raise ParseError.new("End tag mismatched.") unless @scanner[1].to_sym==e.name
63         e
64 end
parse_string() click to toggle source
   # File lib/eim_xml/parser.rb
67 def parse_string
68         s = @scanner[0]
69         s = s.gsub(/&(amp|quot|apos|lt|gt);/) do
70                 case $1
71                 when "amp"
72                         "&"
73                 when "quot"
74                         '"'
75                 when "apos"
76                         "'"
77                 when "lt"
78                         "<"
79                 when "gt"
80                         ">"
81                 end
82         end
83         PCString.new(s)
84 end
parse_tag() click to toggle source
   # File lib/eim_xml/parser.rb
41 def parse_tag
42         s = StringScanner.new(@scanner[1])
43         e = Element.new(s.scan(/\S+/))
44         e[s[1]] = s[3] ? s[3] : s[4] while s.scan(RE::ATTRIBUTE)
45         e
46 end