1module REXML 2 module Parsers 3 class StreamParser 4 def initialize source, listener 5 @listener = listener 6 @parser = BaseParser.new( source ) 7 end 8 9 def add_listener( listener ) 10 @parser.add_listener( listener ) 11 end 12 13 def parse 14 # entity string 15 while true 16 event = @parser.pull 17 case event[0] 18 when :end_document 19 return 20 when :start_element 21 attrs = event[2].each do |n, v| 22 event[2][n] = @parser.unnormalize( v ) 23 end 24 @listener.tag_start( event[1], attrs ) 25 when :end_element 26 @listener.tag_end( event[1] ) 27 when :text 28 normalized = @parser.unnormalize( event[1] ) 29 @listener.text( normalized ) 30 when :processing_instruction 31 @listener.instruction( *event[1,2] ) 32 when :start_doctype 33 @listener.doctype( *event[1..-1] ) 34 when :end_doctype 35 # FIXME: remove this condition for milestone:3.2 36 @listener.doctype_end if @listener.respond_to? :doctype_end 37 when :comment, :attlistdecl, :cdata, :xmldecl, :elementdecl 38 @listener.send( event[0].to_s, *event[1..-1] ) 39 when :entitydecl, :notationdecl 40 @listener.send( event[0].to_s, event[1..-1] ) 41 end 42 end 43 end 44 end 45 end 46end 47