def parse(data)
scanner = StringScanner.new(data)
start_document
if scanner.scan %:^rlml/(.*)[\n\s]+:
encoding scanner[1].strip
scanner.pos -= 1
else
encoding nil
end
until scanner.empty?
if scanner.scan /\n?\s*#(.*)/
comment scanner[1]
next
end
scanner.scan /(\s|\n)+/
if scanner.scan /([\w.]+)(\s|\n)*\{/
start_tag scanner[1]
elsif scanner.scan /\[(.*?)\]/m
comment scanner[1]
elsif scanner.scan /"(.*?([^\\]|\\\\))"/
data scanner[1].gsub('\t', "\t").gsub('\"', "\"").
gsub('\r', "\r").gsub('\n', "\n").gsub('\\\\', "\\")
elsif scanner.scan /\}/
end_tag
else
unless scanner.rest == ""
raise ParseError, "Can't parse: `#{scanner.rest}'"
end
end
end
end_document
end