Sha256: e3e83d831224bb4590ddfbf72cc9d503777a9394e15ebf12a752b7f10260b220

Contents?: true

Size: 1.06 KB

Versions: 3

Compression:

Stored size: 1.06 KB

Contents

require 'ox'
require 'escape_utils'

module XmlHasher
  class Handler < ::Ox::Sax
    def initialize(options = {})
      @options = options
      @stack = []
    end

    def to_hash
      @hash || {}
    end

    def start_element(name)
      @stack.push(Node.new(transform(name)))
    end

    def attr(name, value)
      unless ignore_attribute?(name)
        @stack.last.attributes[transform(name)] = escape(value) unless @stack.empty?
      end
    end

    def text(value)
      @stack.last.text = escape(value)
    end

    def end_element(name)
      if @stack.size == 1
        @hash = @stack.pop.to_hash
      else
        node = @stack.pop
        @stack.last.children << node
      end
    end

    private

    def transform(name)
      name = name.to_s.split(':').last if @options[:ignore_namespaces]
      name = Util.snakecase(name) if @options[:snakecase]
      name
    end

    def escape(value)
      EscapeUtils.unescape_html(value)
    end

    def ignore_attribute?(name)
      @options[:ignore_namespaces] ? !name.to_s[/^(xmlns|xsi)/].nil? : false
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
xmlhasher-0.0.5 lib/xmlhasher/handler.rb
xmlhasher-0.0.4 lib/xmlhasher/handler.rb
xmlhasher-0.0.3 lib/xmlhasher/handler.rb