diff options
author | ser <ser@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-06-10 01:31:01 +0000 |
---|---|---|
committer | ser <ser@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-06-10 01:31:01 +0000 |
commit | 75b6d8aa32fbb9166aee732e05398e2984f2b92d (patch) | |
tree | d3e1f95a5acf262a9dd46e9663b7034bb285b406 /lib/rexml/parsers/lightparser.rb | |
parent | 2480062df118c8b08fc48686c24084c1ce142f8e (diff) | |
download | ruby-75b6d8aa32fbb9166aee732e05398e2984f2b92d.tar.gz ruby-75b6d8aa32fbb9166aee732e05398e2984f2b92d.tar.xz ruby-75b6d8aa32fbb9166aee732e05398e2984f2b92d.zip |
Initial revision
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@3925 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/rexml/parsers/lightparser.rb')
-rw-r--r-- | lib/rexml/parsers/lightparser.rb | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/lib/rexml/parsers/lightparser.rb b/lib/rexml/parsers/lightparser.rb new file mode 100644 index 000000000..e2f083bc8 --- /dev/null +++ b/lib/rexml/parsers/lightparser.rb @@ -0,0 +1,56 @@ +require 'rexml/parsers/streamparser' +require 'rexml/parsers/baseparser' +require 'rexml/light/node' + +module REXML + module Parsers + class LightParser + def initialize stream + @stream = stream + @parser = REXML::Parsers::BaseParser.new( stream ) + end + + def rewind + @stream.rewind + @parser.stream = @stream + end + + def parse + root = context = REXML::Light::Node.new([ :document ]) + while true + event = @parser.pull + case event[0] + when :end_document + break + when :end_doctype + context = context.parent + when :start_element, :start_doctype + new_node = REXML::Light::Node.new(event) + context << new_node + new_node.parent = context + context = new_node + when :end_element, :end_doctype + context = context.parent + else + new_node = REXML::Light::Node.new(event) + context << new_node + new_node.parent = context + end + end + root + end + end + + # An element is an array. The array contains: + # 0 The parent element + # 1 The tag name + # 2 A hash of attributes + # 3..-1 The child elements + # An element is an array of size > 3 + # Text is a String + # PIs are [ :processing_instruction, target, data ] + # Comments are [ :comment, data ] + # DocTypes are DocType structs + # The root is an array with XMLDecls, Text, DocType, Array, Text + end +end |