def parse
plist_tags = PTag::mappings.keys.join('|')
start_tag = %r<(#{plist_tags})([^>]*)>/
end_tag = %r<\/(#{plist_tags})[^>]*>/
require 'strscan'
contents = (
if (File.exists? @filename_or_xml)
File.open(@filename_or_xml) {|f| f.read}
else
@filename_or_xml
end
)
@scanner = StringScanner.new( contents )
until @scanner.eos?
if @scanner.scan(COMMENT_START)
@scanner.scan(COMMENT_END)
elsif @scanner.scan(XMLDECL_PATTERN)
elsif @scanner.scan(DOCTYPE_PATTERN)
elsif @scanner.scan(start_tag)
@listener.tag_start(@scanner[1], nil)
if (@scanner[2] =~ %r\/$/)
@listener.tag_end(@scanner[1])
end
elsif @scanner.scan(TEXT)
@listener.text(@scanner[1])
elsif @scanner.scan(end_tag)
@listener.tag_end(@scanner[1])
else
raise "Unimplemented element"
end
end
end