File Manager
Viewing File: xml_key.rb
module Gyoku
module XMLKey
class << self
CAMELCASE = lambda { |key| key.gsub(/\/(.?)/) { |m| "::#{m.split('').last.upcase}" }.gsub(/(?:^|_)(.)/) { |m| m.split('').last.upcase } }
LOWER_CAMELCASE = lambda { |key| key[0].chr.downcase + CAMELCASE.call(key)[1..-1] }
UPCASE = lambda { |key| key.upcase }
FORMULAS = {
:lower_camelcase => lambda { |key| LOWER_CAMELCASE.call(key) },
:camelcase => lambda { |key| CAMELCASE.call(key) },
:upcase => lambda { |key| UPCASE.call(key) },
:none => lambda { |key| key }
}
# Converts a given +object+ with +options+ to an XML key.
def create(key, options = {})
xml_key = chop_special_characters key.to_s
if unqualified = unqualify?(xml_key)
xml_key = xml_key.split(":").last
end
xml_key = key_converter(options, xml_key).call(xml_key) if Symbol === key
if !unqualified && qualify?(options) && !xml_key.include?(":")
xml_key = "#{options[:namespace]}:#{xml_key}"
end
xml_key
end
private
# Returns the formula for converting Symbol keys.
def key_converter(options, xml_key)
return options[:key_converter] if options[:key_converter].is_a? Proc
defined_key = options[:key_to_convert]
if (defined_key != nil) && (defined_key == xml_key)
key_converter = options[:key_converter]
elsif defined_key != nil
key_converter = :lower_camelcase
elsif (options[:except] == xml_key)
key_converter = :lower_camelcase
else
key_converter = options[:key_converter] || :lower_camelcase
end
FORMULAS[key_converter]
end
# Chops special characters from the end of a given +string+.
def chop_special_characters(string)
["!", "/"].include?(string[-1, 1]) ? string.chop : string
end
# Returns whether to remove the namespace from a given +key+.
def unqualify?(key)
key[0, 1] == ":"
end
# Returns whether to namespace all keys (elementFormDefault).
def qualify?(options)
options[:element_form_default] == :qualified && options[:namespace]
end
end
end
end