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