Sha256: aa34e0138df3bd428da291a2b7150173b2368d0fbc8dae2497616d3ed838a289

Contents?: true

Size: 1.35 KB

Versions: 1

Compression:

Stored size: 1.35 KB

Contents

# frozen_string_literal: true

require 'ox'
require 'escape_utils'

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

    def to_hash
      @hash || {}
    end

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

    def attr(name, value)
      return if ignore_attribute?(name) || @stack.empty?

      @stack.last.attributes[transform(name)] = escape(value)
    end

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

    def cdata(str)
      @stack.last.text = escape(str)
    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)
      return @transform_cache[name] if @transform_cache[name]

      orig_name = name

      name = name.to_s.split(':').last if @options[:ignore_namespaces]
      name = Util.snakecase(name) if @options[:snakecase]
      name = name.to_sym unless @options[:string_keys]
      @transform_cache[orig_name] = name
      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

1 entries across 1 versions & 1 rubygems

Version Path
xmlhasher-1.0.5 lib/xmlhasher/handler.rb