97 lines
2.8 KiB
JavaScript
97 lines
2.8 KiB
JavaScript
|
define("dojo/io-query", ["./_base/lang"], function(lang){
|
||
|
|
||
|
// module:
|
||
|
// dojo/io-query
|
||
|
|
||
|
var backstop = {};
|
||
|
|
||
|
return {
|
||
|
// summary:
|
||
|
// This module defines query string processing functions.
|
||
|
|
||
|
objectToQuery: function objectToQuery(/*Object*/ map){
|
||
|
// summary:
|
||
|
// takes a name/value mapping object and returns a string representing
|
||
|
// a URL-encoded version of that object.
|
||
|
// example:
|
||
|
// this object:
|
||
|
//
|
||
|
// | {
|
||
|
// | blah: "blah",
|
||
|
// | multi: [
|
||
|
// | "thud",
|
||
|
// | "thonk"
|
||
|
// | ]
|
||
|
// | };
|
||
|
//
|
||
|
// yields the following query string:
|
||
|
//
|
||
|
// | "blah=blah&multi=thud&multi=thonk"
|
||
|
|
||
|
// FIXME: need to implement encodeAscii!!
|
||
|
var enc = encodeURIComponent, pairs = [];
|
||
|
for(var name in map){
|
||
|
var value = map[name];
|
||
|
if(value != backstop[name]){
|
||
|
var assign = enc(name) + "=";
|
||
|
if(lang.isArray(value)){
|
||
|
for(var i = 0, l = value.length; i < l; ++i){
|
||
|
pairs.push(assign + enc(value[i]));
|
||
|
}
|
||
|
}else{
|
||
|
pairs.push(assign + enc(value));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return pairs.join("&"); // String
|
||
|
},
|
||
|
|
||
|
queryToObject: function queryToObject(/*String*/ str){
|
||
|
// summary:
|
||
|
// Create an object representing a de-serialized query section of a
|
||
|
// URL. Query keys with multiple values are returned in an array.
|
||
|
//
|
||
|
// example:
|
||
|
// This string:
|
||
|
//
|
||
|
// | "foo=bar&foo=baz&thinger=%20spaces%20=blah&zonk=blarg&"
|
||
|
//
|
||
|
// results in this object structure:
|
||
|
//
|
||
|
// | {
|
||
|
// | foo: [ "bar", "baz" ],
|
||
|
// | thinger: " spaces =blah",
|
||
|
// | zonk: "blarg"
|
||
|
// | }
|
||
|
//
|
||
|
// Note that spaces and other urlencoded entities are correctly
|
||
|
// handled.
|
||
|
|
||
|
// FIXME: should we grab the URL string if we're not passed one?
|
||
|
var dec = decodeURIComponent, qp = str.split("&"), ret = {}, name, val;
|
||
|
for(var i = 0, l = qp.length, item; i < l; ++i){
|
||
|
item = qp[i];
|
||
|
if(item.length){
|
||
|
var s = item.indexOf("=");
|
||
|
if(s < 0){
|
||
|
name = dec(item);
|
||
|
val = "";
|
||
|
}else{
|
||
|
name = dec(item.slice(0, s));
|
||
|
val = dec(item.slice(s + 1));
|
||
|
}
|
||
|
if(typeof ret[name] == "string"){ // inline'd type check
|
||
|
ret[name] = [ret[name]];
|
||
|
}
|
||
|
|
||
|
if(lang.isArray(ret[name])){
|
||
|
ret[name].push(val);
|
||
|
}else{
|
||
|
ret[name] = val;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return ret; // Object
|
||
|
}
|
||
|
};
|
||
|
});
|