|
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
|