# File lib/facebooker/parser.rb, line 161 def self.anonymous_field_from(child, hash) if child.name == 'anon' (hash[child.name] || []) << child.content.strip end end
# File lib/facebooker/parser.rb, line 44 def self.array_of(response_element, element_name) values_to_return = [] response_element.children.each do |element| next if element.text? next unless element.name == element_name values_to_return << yield(element) end values_to_return end
# File lib/facebooker/parser.rb, line 60 def self.array_of_hashes(response_element, element_name) array_of(response_element, element_name) do |element| hashinate(element) end end
# File lib/facebooker/parser.rb, line 54 def self.array_of_text_values(response_element, element_name) array_of(response_element, element_name) do |element| element.content.strip end end
# File lib/facebooker/parser.rb, line 157 def self.booleanize(response) response == "1" ? true : false end
# File lib/facebooker/parser.rb, line 66 def self.element(name, data) data = data.body rescue data # either data or an HTTP response if Object.const_defined?(:Nokogiri) xml = Nokogiri::XML(data.strip) if node = xml.at(name) return node end if xml.root.name == name return xml.root end else doc = REXML::Document.new(data) doc.elements.each(name) do |element| return element end end raise "Element #{name} not found in #{data}" end
# File lib/facebooker/parser.rb, line 119 def self.hash_by_key_or_value_for(element, convert_1_to_true=false) if element.children.size == 0 { element['key'] => nil } elsif element.children.size == 1 && element.children.first.text? { element['key'] => (convert_1_to_true ? element.content.strip == '1' : element.content.strip) } else hashinate_by_key(element, convert_1_to_true) end end
# File lib/facebooker/parser.rb, line 85 def self.hash_or_value_for(element) if element.children.size == 1 && element.children.first.text? element.content.strip else # We can have lists in not list item if element['list'] == 'true' element.children.reject{|c| c.text? }.map { |subchild| hash_or_value_for(subchild)} else hashinate(element) end end end
# File lib/facebooker/parser.rb, line 98 def self.hashinate(response_element) response_element.children.reject{|c| c.text? }.inject({}) do |hash, child| # If the node hasn't any child, and is not a list, we want empty strings, not empty hashes, # except if attributes['nil'] == true hash[child.name] = if (child['nil'] == 'true') nil elsif (child.children.size == 1 && child.children.first.text?) || (child.children.size == 0 && child['list'] != 'true') anonymous_field_from(child, hash) || child.content.strip elsif child['list'] == 'true' child.children.reject{|c| c.text? }.map { |subchild| hash_or_value_for(subchild)} else child.children.reject{|c| c.text? }.inject({}) do |subhash, subchild| subhash[subchild.name] = hash_or_value_for(subchild) subhash end end #if (child.attributes) hash end #do |hash, child| end
A modification to hashinate. The new dashboard API returns XML in a different format than the other calls. What used to be the element name has become an attribute called “key”.
# File lib/facebooker/parser.rb, line 131 def self.hashinate_by_key(response_element, convert_1_to_true=false) response_element.children.reject{|c| c.text? }.inject({}) do |hash, child| # If the node hasn't any child, and is not a list, we want empty strings, not empty hashes, # except if attributes['nil'] == true hash[child['key']] = if (child['nil'] == 'true') nil elsif (child.children.size == 1 && child.children.first.text?) || (child.children.size == 0 && child['list'] != 'true') anonymous_field_from(child, hash) || (convert_1_to_true ? child.content.strip == '1' : child.content.strip) elsif child['list'] == 'true' && child.children.reject {|subchild| subchild.text?}.all? { |subchild| !subchild.text? && subchild['key'].nil? } child.children.reject{|c| c.text? }.map { |subchild| hash_by_key_or_value_for(subchild, convert_1_to_true)} elsif child['list'] == 'true' hash_by_key_or_value_for(child, convert_1_to_true) else child.children.reject{|c| c.text? }.inject({}) do |subhash, subchild| subhash[subchild['key']] = hash_by_key_or_value_for(subchild, convert_1_to_true) subhash end end hash end end
# File lib/facebooker/parser.rb, line 37 def self.parse(method, data) Errors.process(data) parser = Parser::PARSERS[method] raise "Can't find a parser for '#{method}'" unless parser parser.process(data) end