diff options
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 0000000000..e2f083bc8e --- /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 |