Sha256: ce17a61a80fd2cc4b0192473a9726e749a4e0b25d224ebd0795a77bf66a773c3

Contents?: true

Size: 1.87 KB

Versions: 1

Compression:

Stored size: 1.87 KB

Contents

require "nokogiri"

module SAXMachine
  def self.included(base)
    base.extend ClassMethods
  end

  def parse(xml_text)
    sax_handler = SAXHandler.new(self)
    parser = Nokogiri::XML::SAX::Parser.new(sax_handler)
    parser.parse(xml_text)
    self
  end

  module ClassMethods
    def parse(xml_text)
      new.parse(xml_text)
    end

    def element(name, options = {})
      options[:as] ||= name

      unless options[:class]
        sax_config.add_top_level_element(name, options)
      else
        sax_config.add_complex_element(name, options)
      end

      # We only want to insert the getter and setter if they haven't been
      # defined elsewhere. This is how we allow custom parsing behavior. So you
      # could define the setter and have it parse the string into a date or
      # whatever. However, if the getter or setter is defined by a superclass,
      # we go ahead and overwrite it. This allows use to still access elements
      # with names like "id".
      attr_reader options[:as] unless instance_methods(false).include?(options[:as].to_s)
      attr_writer options[:as] unless instance_methods(false).include?("#{options[:as]}=")
    end

    def elements(name, options = {})
      options[:as] ||= name

      if options[:class]
        sax_config.add_collection_element(name, options)
      else
        class_eval <<-SRC
          def add_#{options[:as]}(value)
            #{options[:as]} << value
          end
        SRC

        sax_config.add_top_level_element(name, options.merge(:collection => true))
      end

      if !instance_methods.include?(options[:as].to_s)
        class_eval <<-SRC
          def #{options[:as]}
            @#{options[:as]} ||= []
          end
        SRC
      end

      attr_writer options[:as] unless instance_methods.include?("#{options[:as]}=")
    end

    def sax_config
      @sax_config ||= SAXConfig.new
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
UnderpantsGnome-sax-machine-0.0.14 lib/sax-machine/sax_document.rb