]>
Commit | Line | Data |
---|---|---|
1354d172 AD |
1 | define("dojo/io-query", ["./_base/lang"], function(lang){ |
2 | // module: | |
3 | // dojo/io-query | |
4 | // summary: | |
5 | // This module defines query string processing functions. | |
6 | ||
7 | var backstop = {}; | |
8 | ||
9 | function objectToQuery(/*Object*/ map){ | |
10 | // summary: | |
11 | // takes a name/value mapping object and returns a string representing | |
12 | // a URL-encoded version of that object. | |
13 | // example: | |
14 | // this object: | |
15 | // | |
16 | // | { | |
17 | // | blah: "blah", | |
18 | // | multi: [ | |
19 | // | "thud", | |
20 | // | "thonk" | |
21 | // | ] | |
22 | // | }; | |
23 | // | |
24 | // yields the following query string: | |
25 | // | |
26 | // | "blah=blah&multi=thud&multi=thonk" | |
27 | ||
28 | // FIXME: need to implement encodeAscii!! | |
29 | var enc = encodeURIComponent, pairs = []; | |
30 | for(var name in map){ | |
31 | var value = map[name]; | |
32 | if(value != backstop[name]){ | |
33 | var assign = enc(name) + "="; | |
34 | if(lang.isArray(value)){ | |
35 | for(var i = 0, l = value.length; i < l; ++i){ | |
36 | pairs.push(assign + enc(value[i])); | |
37 | } | |
38 | }else{ | |
39 | pairs.push(assign + enc(value)); | |
40 | } | |
41 | } | |
42 | } | |
43 | return pairs.join("&"); // String | |
44 | } | |
45 | ||
46 | function queryToObject(/*String*/ str){ | |
47 | // summary: | |
48 | // Create an object representing a de-serialized query section of a | |
49 | // URL. Query keys with multiple values are returned in an array. | |
50 | // | |
51 | // example: | |
52 | // This string: | |
53 | // | |
54 | // | "foo=bar&foo=baz&thinger=%20spaces%20=blah&zonk=blarg&" | |
55 | // | |
56 | // results in this object structure: | |
57 | // | |
58 | // | { | |
59 | // | foo: [ "bar", "baz" ], | |
60 | // | thinger: " spaces =blah", | |
61 | // | zonk: "blarg" | |
62 | // | } | |
63 | // | |
64 | // Note that spaces and other urlencoded entities are correctly | |
65 | // handled. | |
66 | ||
67 | // FIXME: should we grab the URL string if we're not passed one? | |
68 | var dec = decodeURIComponent, qp = str.split("&"), ret = {}, name, val; | |
69 | for(var i = 0, l = qp.length, item; i < l; ++i){ | |
70 | item = qp[i]; | |
71 | if(item.length){ | |
72 | var s = item.indexOf("="); | |
73 | if(s < 0){ | |
74 | name = dec(item); | |
75 | val = ""; | |
76 | }else{ | |
77 | name = dec(item.slice(0, s)); | |
78 | val = dec(item.slice(s + 1)); | |
79 | } | |
80 | if(typeof ret[name] == "string"){ // inline'd type check | |
81 | ret[name] = [ret[name]]; | |
82 | } | |
83 | ||
84 | if(lang.isArray(ret[name])){ | |
85 | ret[name].push(val); | |
86 | }else{ | |
87 | ret[name] = val; | |
88 | } | |
89 | } | |
90 | } | |
91 | return ret; // Object | |
92 | } | |
93 | ||
94 | return { | |
95 | objectToQuery: objectToQuery, | |
96 | queryToObject: queryToObject | |
97 | }; | |
98 | }); |