class Translatomatic::ResourceFile::Plist::Parser

Adapted from nokogiri-plist parser @see github.com/caseyhoward/nokogiri-plist @private

Public Instance Methods

next_valid_sibling(node) click to toggle source
# File lib/translatomatic/resource_file/plist.rb, line 141
def next_valid_sibling(node)
  node = node.next_sibling until node.nil? || valid_type?(node.name)
  node
end
parse(xml, options = {}) click to toggle source
# File lib/translatomatic/resource_file/plist.rb, line 79
def parse(xml, options = {})
  @converters = {
    'integer' => proc { |node| node.content.to_i },
    'real'    => proc { |node| node.content.to_f },
    'string'  => proc { |node| node.content.to_s },
    # DateTime.parse(node.content)
    'date'    => proc { |node| node.content.to_s },
    'true'    => proc { |_node| true },
    'false'   => proc { |_node| false },
    'dict'    => proc { |node| parse_dict(node) },
    'array'   => proc { |node| parse_array(node) },
    'data'    => proc { |node| node.content.to_s }
  }.merge(options[:converters] || {})

  @dict_class = options[:dict_class] || Hash
  plist = xml.root
  plist = plist.children.first if plist.name == 'plist'
  result = parse_value_node(next_valid_sibling(plist))
  plist_node_value(result)
end
parse_array(node) click to toggle source
# File lib/translatomatic/resource_file/plist.rb, line 132
def parse_array(node)
  node.children.each_with_object([]) do |child, result|
    if valid_node?(child)
      plist_node = parse_value_node(child)
      result << plist_node_value(plist_node)
    end
  end
end
parse_dict(node) click to toggle source
# File lib/translatomatic/resource_file/plist.rb, line 113
def parse_dict(node)
  node.xpath('./key').each_with_object(@dict_class.new) do |k, v|
    plist_node = parse_value_node(next_valid_sibling(k))
    value = plist_node_value(plist_node)
    v[k.content] = value
  end
end
parse_value_node(value_node) click to toggle source
# File lib/translatomatic/resource_file/plist.rb, line 100
def parse_value_node(value_node)
  value = @converters[value_node.name].call(value_node)
  PlistNode.new(value_node, value)
end
plist_node_value(plist_node) click to toggle source

if the PlistNode value is an array or hash, use that directly instead of the PlistNode.

# File lib/translatomatic/resource_file/plist.rb, line 123
def plist_node_value(plist_node)
  content = plist_node.content
  if content.is_a?(Array) || content.is_a?(Hash)
    content
  else
    plist_node
  end
end
valid_node?(node) click to toggle source
# File lib/translatomatic/resource_file/plist.rb, line 109
def valid_node?(node)
  valid_type?(node.name) || node.name == 'key'
end
valid_type?(type) click to toggle source
# File lib/translatomatic/resource_file/plist.rb, line 105
def valid_type?(type)
  @converters.key? type
end