diff options
author | ser <ser@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-05-16 15:17:31 +0000 |
---|---|---|
committer | ser <ser@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-05-16 15:17:31 +0000 |
commit | 8fd29e2019077205a9997308cf3bc05202a83ad1 (patch) | |
tree | 5add8b63369553228f3348398c7681f22c58cbec /lib/rexml/document.rb | |
parent | ac1d9e7c2dfceb06a9b6ee22e2fc0593c9ddce29 (diff) |
------------------------------------------------------------------------
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@6329 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/rexml/document.rb')
-rw-r--r-- | lib/rexml/document.rb | 128 |
1 files changed, 66 insertions, 62 deletions
diff --git a/lib/rexml/document.rb b/lib/rexml/document.rb index 52500f2afd..1378bb212c 100644 --- a/lib/rexml/document.rb +++ b/lib/rexml/document.rb @@ -176,68 +176,72 @@ module REXML tag_stack = [] in_doctype = false entities = nil - while true - event = parser.pull - case event[0] - when :end_document - return - when :start_element - tag_stack.push(event[1]) - # find the observers for namespaces - build_context = build_context.add_element( event[1], event[2] ) - when :end_element - tag_stack.pop - build_context = build_context.parent - when :text - if not in_doctype - if build_context[-1].instance_of? Text - build_context[-1] << event[1] - else - build_context.add( - Text.new( event[1], build_context.whitespace, nil, true ) - ) unless ( - event[1].strip.size==0 and - build_context.ignore_whitespace_nodes - ) - end - end - when :comment - c = Comment.new( event[1] ) - build_context.add( c ) - when :cdata - c = CData.new( event[1] ) - build_context.add( c ) - when :processing_instruction - build_context.add( Instruction.new( event[1], event[2] ) ) - when :end_doctype - in_doctype = false - entities.each { |k,v| entities[k] = build_context.entities[k].value } - build_context = build_context.parent - when :start_doctype - doctype = DocType.new( event[1..-1], build_context ) - build_context = doctype - entities = {} - in_doctype = true - when :attlistdecl - n = AttlistDecl.new( event[1..-1] ) - build_context.add( n ) - when :externalentity - n = ExternalEntity.new( event[1] ) - build_context.add( n ) - when :elementdecl - n = ElementDecl.new( event[1] ) - build_context.add(n) - when :entitydecl - entities[ event[1] ] = event[2] unless event[2] =~ /PUBLIC|SYSTEM/ - build_context.add(Entity.new(event)) - when :notationdecl - n = NotationDecl.new( *event[1..-1] ) - build_context.add( n ) - when :xmldecl - x = XMLDecl.new( event[1], event[2], event[3] ) - build_context.add( x ) - end - end + begin + while true + event = parser.pull + case event[0] + when :end_document + return + when :start_element + tag_stack.push(event[1]) + # find the observers for namespaces + build_context = build_context.add_element( event[1], event[2] ) + when :end_element + tag_stack.pop + build_context = build_context.parent + when :text + if not in_doctype + if build_context[-1].instance_of? Text + build_context[-1] << event[1] + else + build_context.add( + Text.new( event[1], build_context.whitespace, nil, true ) + ) unless ( + event[1].strip.size==0 and + build_context.ignore_whitespace_nodes + ) + end + end + when :comment + c = Comment.new( event[1] ) + build_context.add( c ) + when :cdata + c = CData.new( event[1] ) + build_context.add( c ) + when :processing_instruction + build_context.add( Instruction.new( event[1], event[2] ) ) + when :end_doctype + in_doctype = false + entities.each { |k,v| entities[k] = build_context.entities[k].value } + build_context = build_context.parent + when :start_doctype + doctype = DocType.new( event[1..-1], build_context ) + build_context = doctype + entities = {} + in_doctype = true + when :attlistdecl + n = AttlistDecl.new( event[1..-1] ) + build_context.add( n ) + when :externalentity + n = ExternalEntity.new( event[1] ) + build_context.add( n ) + when :elementdecl + n = ElementDecl.new( event[1] ) + build_context.add(n) + when :entitydecl + entities[ event[1] ] = event[2] unless event[2] =~ /PUBLIC|SYSTEM/ + build_context.add(Entity.new(event)) + when :notationdecl + n = NotationDecl.new( *event[1..-1] ) + build_context.add( n ) + when :xmldecl + x = XMLDecl.new( event[1], event[2], event[3] ) + build_context.add( x ) + end + end + rescue + raise ParseException.new( $!.message, parser.source, parser, $! ) + end end end end |