73: def parse
74: plist_tags = PTag::mappings.keys.join('|')
75: start_tag = /<(#{plist_tags})([^>]*)>/i
76: end_tag = /<\/(#{plist_tags})[^>]*>/i
77:
78: require 'strscan'
79:
80: contents = (
81: if (File.exists? @filename_or_xml)
82: File.open(@filename_or_xml) {|f| f.read}
83: else
84: @filename_or_xml
85: end
86: )
87:
88: @scanner = StringScanner.new( contents )
89: until @scanner.eos?
90: if @scanner.scan(COMMENT_START)
91: @scanner.scan(COMMENT_END)
92: elsif @scanner.scan(XMLDECL_PATTERN)
93: elsif @scanner.scan(DOCTYPE_PATTERN)
94: elsif @scanner.scan(start_tag)
95: @listener.tag_start(@scanner[1], nil)
96: if (@scanner[2] =~ /\/$/)
97: @listener.tag_end(@scanner[1])
98: end
99: elsif @scanner.scan(TEXT)
100: @listener.text(@scanner[1])
101: elsif @scanner.scan(end_tag)
102: @listener.tag_end(@scanner[1])
103: else
104: raise "Unimplemented element"
105: end
106: end
107: end