class Addressable::Template
def transform_mapping(mapping, processor=nil)
-
(Hash)- The transformed mapping.
Parameters:
-
processor(#validate, #transform) -- -
mapping(Hash) -- The mapping of variables to values.
def transform_mapping(mapping, processor=nil) return mapping.inject({}) do |accu, pair| name, value = pair value = value.to_s if Numeric === value || Symbol === value unless value.respond_to?(:to_ary) || value.respond_to?(:to_str) raise TypeError, "Can't convert #{value.class} into String or Array." end if Symbol === name name = name.to_s elsif name.respond_to?(:to_str) name = name.to_str else raise TypeError, "Can't convert #{name.class} into String." end value = value.respond_to?(:to_ary) ? value.to_ary : value.to_str # Handle unicode normalization if value.kind_of?(Array) value.map! { |val| Addressable::IDNA.unicode_normalize_kc(val) } else value = Addressable::IDNA.unicode_normalize_kc(value) end if processor == nil || !processor.respond_to?(:transform) # Handle percent escaping if value.kind_of?(Array) transformed_value = value.map do |val| Addressable::URI.encode_component( val, Addressable::URI::CharacterClasses::UNRESERVED) end else transformed_value = Addressable::URI.encode_component( value, Addressable::URI::CharacterClasses::UNRESERVED) end end # Process, if we've got a processor if processor != nil if processor.respond_to?(:validate) if !processor.validate(name, value) display_value = value.kind_of?(Array) ? value.inspect : value raise InvalidTemplateValueError, "#{name}=#{display_value} is an invalid template value." end end if processor.respond_to?(:transform) transformed_value = processor.transform(name, value) if transformed_value.kind_of?(Array) transformed_value.map! do |val| Addressable::IDNA.unicode_normalize_kc(val) end else transformed_value = Addressable::IDNA.unicode_normalize_kc(transformed_value) end end end accu[name] = transformed_value accu end end