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