class XmlHasher::Handler

Public Class Methods

new(options = {}) click to toggle source
Calls superclass method
# File lib/xmlhasher/handler.rb, line 8
def initialize(options = {})
  @options = options
  @stack = []
  @transform_cache = {}

  super()
end

Public Instance Methods

attr(name, value) click to toggle source
# File lib/xmlhasher/handler.rb, line 24
def attr(name, value)
  return if ignore_attribute?(name) || @stack.empty?

  @stack.last.attributes[transform(name)] = escape(value)
end
cdata(str) click to toggle source
# File lib/xmlhasher/handler.rb, line 34
def cdata(str)
  @stack.last.text = escape(str)
end
end_element(_name) click to toggle source
# File lib/xmlhasher/handler.rb, line 38
def end_element(_name)
  if @stack.size == 1
    @hash = @stack.pop.to_hash
  else
    node = @stack.pop
    @stack.last.children << node
  end
end
start_element(name) click to toggle source
# File lib/xmlhasher/handler.rb, line 20
def start_element(name)
  @stack.push(Node.new(transform(name)))
end
text(value) click to toggle source
# File lib/xmlhasher/handler.rb, line 30
def text(value)
  @stack.last.text = escape(value)
end
to_hash() click to toggle source
# File lib/xmlhasher/handler.rb, line 16
def to_hash
  @hash || {}
end

Private Instance Methods

escape(value) click to toggle source
# File lib/xmlhasher/handler.rb, line 61
def escape(value)
  CGI.unescapeHTML(value)
end
ignore_attribute?(name) click to toggle source
# File lib/xmlhasher/handler.rb, line 65
def ignore_attribute?(name)
  @options[:ignore_namespaces] ? !name.to_s[/^(xmlns|xsi)/].nil? : false
end
transform(name) click to toggle source
# File lib/xmlhasher/handler.rb, line 49
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 = @options[:string_keys] ? name.to_s : name.to_sym
  @transform_cache[orig_name] = name
  name
end