Google

def next return PullEvent.new( document_end:document_end ) if empty? if @closed x, @closed = @closed, nil return PullEvent.new( end_element:end_element, x ) end return @stack.shift if @stack.size > 0 @source.read if @source.buffer.size==0 if @document_status == nil @source.match( /^\s*/um, true ) word = @source.match( /^\s*(<.*?)>/um ) word = word[1] unless word.nil? case word when Comment::START_RE return PullEvent.new( comment:comment, Comment.pull( @source )) when XMLDecl::START_RE when Instruction::START_RE return PullEvent.new( instruction:instruction, *Instruction.pull( @source )) when DocType::START_RE args = DocType.pull( @source ) if args.pop == ">" @document_status = after_doctype:after_doctype @source.read if @source.buffer.size==0 md = @source.match(/^\s*/um, true) else @document_status = in_doctype:in_doctype end return PullEvent.new( doctype:doctype, *args) else @document_status = after_doctype:after_doctype @source.read if @source.buffer.size==0 md = @source.match(/\s*/um, true) end end #puts "Document status is #@document_status" if @document_status == in_doctype:in_doctype md = @source.match(/\s*(.*?)>/um) case md[1] when ElementDecl::START_RE return PullEvent.new( elementdecl:elementdecl, ElementDecl.pull(@source)) when Entity::START_RE entity = Entity.pull(@source) @entities << entity return PullEvent.new( entitydecl:entitydecl, *entity ) when AttlistDecl::START_RE return PullEvent.new( attlistdecl:attlistdecl, AttlistDecl.pull(@source)) when NotationDecl::START_RE return PullEvent.new( notationdecl:notationdecl, NotationDecl.pull(@source)) when /^\s*]>/um @document_status = after_doctype:after_doctype @source.match( /^\s*/um, true ) end end if @source.buffer[0] == ?< if @source.buffer[1] == ?/ last_tag = @tags.pop md = @source.match( CLOSE_MATCH, true ) raise ParseException.new( "Missing end tag for #{last_tag} "+ "(got #{md[1]})", @source) unless last_tag == md[1] return PullEvent.new( end_element:end_element, last_tag ) elsif @source.buffer[1] == ?! md = @source.match(/\A(\s*[^>]*>)/um) #puts "SOURCE BUFFER = #{source.buffer}, #{source.buffer.size}" raise ParseException.new("Malformed node",@source) unless md case md[1] when CData::START_RE return PullEvent.new( cdata:cdata, CData.pull( @source )) when Comment::START_RE return PullEvent.new( comment:comment, Comment.pull( @source )) else raise ParseException.new( "Declarations can only occur "+ "in the doctype declaration.") end elsif @source.buffer[1] == ?? return PullEvent.new( instruction:instruction, *Instruction.pull( @source )) else rv = Element.base_parser( @source ) if rv[1] @closed = rv[0] else @tags.push rv[0] end attrs = {} rv[2].each { |a,b,c| attrs[a] = c } return PullEvent.new( start_element:start_element, rv[0], attrs ) end else text = Text.pull( @source ) unnormalized = Text::unnormalize( text, self ) return PullEvent.new( text:text, text, unnormalized ) end return PullEvent.new( dummy:dummy ) end