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