class RqueryString::Parser
Public Class Methods
parse(query_string)
click to toggle source
# File lib/rquery_string/parser.rb, line 6 def self.parse(query_string) hash_pair_array = query_string.split("&") result_hash = Hash.new hash_pair_array.each do |hash_value| key, value = hash_value.split("=") if is_array(key) parse_array(key, value, result_hash) elsif is_hash(key) parse_hash(key, value, result_hash) elsif is_string(value) result_hash[parse_key(key)] = parse_string(value) else result_hash[parse_key(key)] = eval(value) end end return result_hash end
Private Class Methods
is_array(key)
click to toggle source
# File lib/rquery_string/parser.rb, line 26 def self.is_array(key) key.end_with?("]") && ((key.index("[")+ 2) == key.length) end
is_hash(key)
click to toggle source
# File lib/rquery_string/parser.rb, line 30 def self.is_hash(key) key.end_with?("]") && ((key.index("[")+ 1) < key.rindex("]")) end
is_string(value)
click to toggle source
# File lib/rquery_string/parser.rb, line 34 def self.is_string(value) value.start_with?("%27") && value.end_with?("%27") end
merge_array_value(old_hash_value, new_hash_value)
click to toggle source
# File lib/rquery_string/parser.rb, line 99 def self.merge_array_value(old_hash_value, new_hash_value) old_hash_value.each do |key, value| if value.instance_of?(Array) && new_hash_value[key].instance_of?(Array) new_hash_value[key] = value.concat new_hash_value[key] else if value.instance_of?(Hash) && new_hash_value[key].instance_of?(Hash) merge_array_value(old_hash_value[key], new_hash_value[key]) end end end end
parse_array(key, value, result_hash)
click to toggle source
# File lib/rquery_string/parser.rb, line 38 def self.parse_array(key, value, result_hash) array_key = parse_key(key[0..key.index("[") - 1]) result_hash[array_key] = [] if result_hash[array_key].nil? result_hash[array_key] << parse_value(value) end
parse_hash(key, value, result_hash)
click to toggle source
# File lib/rquery_string/parser.rb, line 44 def self.parse_hash(key, value, result_hash) hash_key = parse_key(key[0..key.index("[") - 1]) keys = key[key.index("[")..-1].split("]").reverse sub_result_object = nil keys.each_index do |index| sub_key = parse_key(keys[index][1..-1]) sub_hash_value = sub_result_object if sub_key == :"" sub_result_object = Array.new if sub_hash_value sub_result_object << sub_hash_value else sub_result_object << parse_value(value) end else sub_result_object = Hash.new if index == 0 sub_result_object[sub_key] = parse_value(value) else sub_result_object[sub_key] = sub_hash_value end end end if result_hash[hash_key].nil? result_hash[hash_key] = sub_result_object else if sub_result_object.instance_of?(Array) && sub_result_object.instance_of?(Array) result_hash[hash_key].concat sub_result_object else merge_array_value(result_hash[hash_key], sub_result_object) result_hash[hash_key].merge! sub_result_object end end end
parse_key(key)
click to toggle source
# File lib/rquery_string/parser.rb, line 91 def self.parse_key(key) if is_string(key) return parse_string(key) else return key.to_sym end end
parse_string(value)
click to toggle source
# File lib/rquery_string/parser.rb, line 79 def self.parse_string(value) CGI::unescape(value[3..value.rindex("%27")-1]) end
parse_value(value)
click to toggle source
# File lib/rquery_string/parser.rb, line 83 def self.parse_value(value) if is_string(value) parse_string(value) else eval(value) end end