lib/gyoku/array.rb in gyoku-1.3.1 vs lib/gyoku/array.rb in gyoku-1.4.0

- old
+ new

@@ -1,55 +1,66 @@ require "builder" -require "gyoku/hash" +require "gyoku/prettifier.rb" require "gyoku/xml_value" module Gyoku class Array NESTED_ELEMENT_NAME = "element" + # Builds XML and prettifies it if +pretty_print+ option is set to +true+ + def self.to_xml(array, key, escape_xml = true, attributes = {}, options = {}) + xml = build_xml(array, key, escape_xml, attributes, options) + + if options[:pretty_print] && options[:unwrap] + Prettifier.prettify(xml, options) + else + xml + end + end + + private + # Translates a given +array+ to XML. Accepts the XML +key+ to add the elements to, # whether to +escape_xml+ and an optional Hash of +attributes+. - def self.to_xml(array, key, escape_xml = true, attributes = {}, options = {}) + def self.build_xml(array, key, escape_xml = true, attributes = {}, options = {}) self_closing = options.delete(:self_closing) - unwrap = options[:unwrap] || false + unwrap = unwrap?(options.fetch(:unwrap, false), key) iterate_with_xml array, key, attributes, options do |xml, item, attrs, index| if self_closing xml.tag!(key, attrs) else case item when ::Hash then if unwrap xml << Hash.to_xml(item, options) else - xml.tag!(key, attrs) { xml << Hash.to_xml(item, options) } + xml.tag!(key, attrs) { xml << Hash.build_xml(item, options) } end when ::Array then - xml.tag!(key, attrs) { xml << Array.to_xml(item, NESTED_ELEMENT_NAME) } + xml.tag!(key, attrs) { xml << Array.build_xml(item, NESTED_ELEMENT_NAME) } when NilClass then xml.tag!(key, "xsi:nil" => "true") else xml.tag!(key, attrs) { xml << XMLValue.create(item, escape_xml) } end end end end - private - # Iterates over a given +array+ with a Hash of +attributes+ and yields a builder +xml+ # instance, the current +item+, any XML +attributes+ and the current +index+. def self.iterate_with_xml(array, key, attributes, options, &block) xml = Builder::XmlMarkup.new - unwrap = options[:unwrap] || false + unwrap = unwrap?(options.fetch(:unwrap, false), key) - if (unwrap) - xml.tag!(key) { iterate_array(xml, array, attributes, &block) } + if unwrap + xml.tag!(key, attributes) { iterate_array(xml, array, attributes, &block) } else iterate_array(xml, array, attributes, &block) end xml.target! @@ -81,9 +92,13 @@ attributes.inject({}) do |hash, (key, value)| value = value[index] if value.kind_of? ::Array value ? hash.merge(key => value) : hash end + end + + def self.unwrap?(unwrap, key) + unwrap.kind_of?(::Array) ? unwrap.include?(key.to_sym) : unwrap end end end