164 lines
5.2 KiB
Plaintext
164 lines
5.2 KiB
Plaintext
note
|
|
description: "[
|
|
Utility routines to handle parameters and convert them as string, list or table values.
|
|
]"
|
|
date: "$Date$"
|
|
revision: "$Revision$"
|
|
|
|
class
|
|
WSF_VALUE_UTILITIES
|
|
|
|
inherit
|
|
ANY
|
|
|
|
SHARED_WSF_PERCENT_ENCODER
|
|
rename
|
|
percent_encoder as url_encoder
|
|
export
|
|
{NONE} all
|
|
end
|
|
|
|
feature -- Smart parameter identification
|
|
|
|
add_utf_8_string_value_to_table (a_utf_8_name: READABLE_STRING_8; a_utf_8_value: READABLE_STRING_8; a_table: HASH_TABLE [WSF_VALUE, READABLE_STRING_GENERAL])
|
|
-- Add a utf-8 string value `a_utf_8_value' associated with name `a_utf_8_name' to `a_table'.
|
|
local
|
|
utf: UTF_CONVERTER
|
|
n,v: READABLE_STRING_32
|
|
do
|
|
n := utf.utf_8_string_8_to_string_32 (a_utf_8_name)
|
|
v := utf.utf_8_string_8_to_string_32 (a_utf_8_value)
|
|
add_value_to_table (n, new_string_value (n, v), a_table)
|
|
end
|
|
|
|
add_percent_encoded_string_value_to_table (a_encoded_name: READABLE_STRING_8; a_encoded_value: READABLE_STRING_8; a_table: HASH_TABLE [WSF_VALUE, READABLE_STRING_GENERAL])
|
|
-- Add a percent-encoded string value `a_encoded_value' associated with name `a_encoded_name' to `a_table'.
|
|
local
|
|
v: WSF_STRING
|
|
do
|
|
v := new_string_value_with_percent_encoded_values (a_encoded_name, a_encoded_value)
|
|
add_value_to_table (v.name, v, a_table)
|
|
end
|
|
|
|
add_value_to_table (a_name: READABLE_STRING_GENERAL; a_value: WSF_VALUE; a_table: HASH_TABLE [WSF_VALUE, READABLE_STRING_GENERAL])
|
|
-- Add value `a_value' associated with unicode name `a_name' to `a_table'.
|
|
local
|
|
l_decoded_name: STRING_32
|
|
l_encoded_name: READABLE_STRING_8
|
|
v: detachable WSF_VALUE
|
|
n,k,r,vn: STRING_32
|
|
p,q: INTEGER
|
|
tb,ptb: detachable WSF_TABLE
|
|
do
|
|
--| Check if this is a list format such as choice[] or choice[a] or even choice[a][] or choice[a][b][c]...
|
|
l_decoded_name := a_name.as_string_32
|
|
l_encoded_name := a_value.url_encoded_name
|
|
p := l_decoded_name.index_of ({CHARACTER_32}'[', 1)
|
|
n := l_decoded_name
|
|
if p > 0 then
|
|
q := l_decoded_name.index_of ({CHARACTER_32}']', p + 1)
|
|
if q > p then
|
|
n := l_decoded_name.substring (1, p - 1)
|
|
r := l_decoded_name.substring (q + 1, l_decoded_name.count)
|
|
r.left_adjust; r.right_adjust
|
|
|
|
create tb.make (n)
|
|
if attached {WSF_TABLE} a_table.item (tb.name) as l_existing_table then
|
|
tb := l_existing_table
|
|
end
|
|
|
|
k := l_decoded_name.substring (p + 1, q - 1)
|
|
k.left_adjust; k.right_adjust
|
|
if k.is_empty then
|
|
k.append_integer (tb.count + 1)
|
|
end
|
|
v := tb
|
|
create vn.make_from_string (n)
|
|
vn.append_character ({CHARACTER_32}'[')
|
|
vn.append (k)
|
|
vn.append_character ({CHARACTER_32}']')
|
|
|
|
from
|
|
until
|
|
r.is_empty
|
|
loop
|
|
ptb := tb
|
|
p := r.index_of ({CHARACTER_32} '[', 1)
|
|
if p > 0 then
|
|
q := r.index_of ({CHARACTER_32} ']', p + 1)
|
|
if q > p then
|
|
if attached {WSF_TABLE} ptb.value (k) as l_tb_value then
|
|
tb := l_tb_value
|
|
else
|
|
create tb.make (n)
|
|
ptb.add_value (tb, k)
|
|
end
|
|
|
|
k := r.substring (p + 1, q - 1)
|
|
r := r.substring (q + 1, r.count)
|
|
r.left_adjust; r.right_adjust
|
|
if k.is_empty then
|
|
k.append_integer (tb.count + 1)
|
|
end
|
|
vn.append_character ('[')
|
|
vn.append (k)
|
|
vn.append_character (']')
|
|
end
|
|
else
|
|
r.wipe_out
|
|
--| Ignore bad value
|
|
end
|
|
end
|
|
a_value.change_name (vn)
|
|
tb.add_value (a_value, k)
|
|
else
|
|
--| Missing end bracket
|
|
end
|
|
end
|
|
if v = Void then
|
|
a_value.change_name (l_decoded_name)
|
|
v := a_value
|
|
end
|
|
if attached a_table.item (n) as l_existing_value then
|
|
if tb /= Void then
|
|
--| Already done in previous part
|
|
elseif attached {WSF_MULTIPLE_STRING} l_existing_value as l_multi then
|
|
l_multi.add_value (v)
|
|
elseif attached {WSF_TABLE} l_existing_value as l_table then
|
|
-- Keep previous values (most likely we have table[1]=foo, table[2]=bar ..and table=/foo/bar
|
|
-- Anyway for this case, we keep the previous version, and ignore this "conflict"
|
|
else
|
|
a_table.force (create {WSF_MULTIPLE_STRING}.make_with_array (<<l_existing_value, v>>), v.name)
|
|
check replaced: a_table.found and then a_table.found_item ~ l_existing_value end
|
|
end
|
|
else
|
|
a_table.force (v, n)
|
|
end
|
|
end
|
|
|
|
feature -- Factory
|
|
|
|
new_string_value (a_name: READABLE_STRING_GENERAL; a_value: READABLE_STRING_GENERAL): WSF_STRING
|
|
-- New WSF_STRING value built from unicode `a_name' and `a_value'.
|
|
do
|
|
create Result.make (a_name, a_value)
|
|
end
|
|
|
|
new_string_value_with_percent_encoded_values (a_encoded_name: READABLE_STRING_8; a_encoded_value: READABLE_STRING_8): WSF_STRING
|
|
-- New WSF_STRING value built from utf8+percent encoded `a_encoded_name' and `a_encoded_value'.
|
|
do
|
|
create Result.make_with_percent_encoded_values (a_encoded_name, a_encoded_value)
|
|
end
|
|
|
|
note
|
|
copyright: "2011-2015, Jocelyn Fiat, Javier Velilla, Olivier Ligot, Colin Adams, Eiffel Software and others"
|
|
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
|
source: "[
|
|
Eiffel Software
|
|
5949 Hollister Ave., Goleta, CA 93117 USA
|
|
Telephone 805-685-1006, Fax 805-685-6869
|
|
Website http://www.eiffel.com
|
|
Customer support http://support.eiffel.com
|
|
]"
|
|
end
|