Skip to content

Commit 1bc769e

Browse files
author
isaacs
committed
Simplify a few things, remove the reference to YUI in the comments, fix the indent styling.
1 parent f63db8a commit 1bc769e

File tree

4 files changed

+129
-209
lines changed

4 files changed

+129
-209
lines changed

querystring-parse.js

+67-78
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,15 @@
1212
*/
1313

1414

15-
var sys = require("sys");
16-
var util = require("./util");
15+
var sys = require("sys"),
16+
util = require("./util");
17+
18+
exports.parse = querystring_parse;
1719

1820
/**
1921
* <p>The querystring module adds support for serializing JavaScript objects into
2022
* query strings and parsing JavaScript objects from query strings format.</p>
2123
*
22-
* <p>The querystring namespace is added to your YUI instance including static methods
23-
* querystring.parse(..) and querystring.stringify(..).</p>
24-
*
2524
* <p>The <code>querystring</code> module is a rollup of <code>querystring-parse</code> and
2625
* <code>querystring-stringify</code>.</p>
2726
*
@@ -43,19 +42,13 @@ var util = require("./util");
4342
* @for querystring
4443
* @static
4544
*/
46-
var parse = function (qs, sep, eq) {
47-
// wouldn't Array(qs.split()).map(pieceParser(eq)).reduce(mergeParams) be prettier?
48-
return util.reduce(
49-
util.map(
50-
qs.split(sep || "&"),
51-
pieceParser(eq || "=")
52-
),
53-
{},
54-
mergeParams
55-
);
45+
function querystring_parse (qs, sep, eq, unesc) {
46+
return qs.split(sep || "&")
47+
.map(pieceParser(eq || "=", unesc || unescape))
48+
.reduce(mergeParams, {});
5649
};
5750

58-
var unescape = function (s) {
51+
function unescape (s) {
5952
return decodeURIComponent(s.replace(/\+/g, ' '));
6053
};
6154

@@ -69,76 +62,72 @@ var unescape = function (s) {
6962
// return parse(foo[bar], [{bla:"baz"}])
7063
// return parse(foo, {bar:[{bla:"baz"}]})
7164
// return {foo:{bar:[{bla:"baz"}]}}
72-
var pieceParser = function (eq) {
73-
return function parsePiece (key, val) {
74-
if (arguments.length !== 2) {
75-
// key=val, called from the map/reduce
76-
key = key.split(eq);
77-
return parsePiece(
78-
unescape(key.shift()),
79-
unescape(key.join(eq))
80-
);
81-
}
82-
key = key.replace(/^\s+|\s+$/g, '');
83-
if (util.isString(val)) {
84-
val = val.replace(/^\s+|\s+$/g, '');
85-
// convert numerals to numbers
86-
if (!isNaN(val)) {
87-
var numVal = +val;
88-
if (val === numVal.toString(10)) val = numVal;
89-
}
90-
}
91-
var sliced = /(.*)\[([^\]]*)\]$/.exec(key);
92-
if (!sliced) {
93-
var ret = {};
94-
if (key) ret[key] = val;
95-
return ret;
96-
}
97-
// ["foo[][bar][][baz]", "foo[][bar][]", "baz"]
98-
var tail = sliced[2], head = sliced[1];
99-
100-
// array: key[]=val
101-
if (!tail) return parsePiece(head, [val]);
102-
103-
// obj: key[subkey]=val
104-
var ret = {};
105-
ret[tail] = val;
106-
return parsePiece(head, ret);
107-
};
65+
function pieceParser (eq, unesc) {
66+
return function parsePiece (key, val) {
67+
68+
if (arguments.length !== 2) {
69+
// key=val, called from the map/reduce
70+
key = key.split(eq);
71+
return parsePiece(
72+
unesc(key.shift()),
73+
unesc(key.join(eq))
74+
);
75+
}
76+
key = key.replace(/^\s+|\s+$/g, '');
77+
if (util.isString(val)) {
78+
val = val.replace(/^\s+|\s+$/g, '');
79+
// convert numerals to numbers
80+
if (!isNaN(val)) {
81+
var numVal = +val;
82+
if (val === numVal.toString(10)) val = numVal;
83+
}
84+
}
85+
var sliced = /(.*)\[([^\]]*)\]$/.exec(key);
86+
if (!sliced) {
87+
var ret = {};
88+
if (key) ret[key] = val;
89+
return ret;
90+
}
91+
// ["foo[][bar][][baz]", "foo[][bar][]", "baz"]
92+
var tail = sliced[2],
93+
head = sliced[1];
94+
95+
// array: key[]=val
96+
if (!tail) return parsePiece(head, [val]);
97+
98+
// obj: key[subkey]=val
99+
var ret = {};
100+
ret[tail] = val;
101+
return parsePiece(head, ret);
102+
};
108103
};
109104

110105
// the reducer function that merges each query piece together into one set of params
111106
function mergeParams (params, addition) {
112-
var ret;
113-
114-
if (!params){
115-
// if it's uncontested, then just return the addition.
116-
ret = addition;
117-
} else if (util.isArray(params)) {
118-
// if the existing value is an array, then concat it.
119-
ret = params.concat(addition);
120-
} else if (!util.isObject(params) || !util.isObject(addition)) {
121-
// if the existing value is not an array, and either are not objects, arrayify it.
122-
ret = [params].concat(addition);
123-
} else {
124-
// else merge them as objects, which is a little more complex
125-
ret = mergeObjects(params, addition);
126-
}
127-
return ret;
107+
var ret;
108+
109+
if (!params){
110+
// if it's uncontested, then just return the addition.
111+
ret = addition;
112+
} else if (util.isArray(params)) {
113+
// if the existing value is an array, then concat it.
114+
ret = params.concat(addition);
115+
} else if (!util.isObject(params) || !util.isObject(addition)) {
116+
// if the existing value is not an array, and either are not objects, arrayify it.
117+
ret = [params].concat(addition);
118+
} else {
119+
// else merge them as objects, which is a little more complex
120+
ret = mergeObjects(params, addition);
121+
}
122+
return ret;
128123
};
129124

130125

131126
// Merge two *objects* together. If this is called, we've already ruled
132127
// out the simple cases, and need to do the for-in business.
133128
function mergeObjects (params, addition) {
134-
for (var i in addition) if (i && addition.hasOwnProperty(i)) {
135-
params[i] = mergeParams(params[i], addition[i]);
136-
}
137-
return params;
129+
for (var i in addition) if (i && addition.hasOwnProperty(i)) {
130+
params[i] = mergeParams(params[i], addition[i]);
131+
}
132+
return params;
138133
};
139-
140-
141-
142-
143-
/* exports */
144-
exports.parse = parse;

querystring-stringify.js

+44-46
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
var util = require("./util");
1616

17-
var escape = encodeURIComponent;
17+
exports.stringify = querystring_stringify;
1818

1919
var stack = [];
2020
/**
@@ -27,52 +27,50 @@ var stack = [];
2727
* @param sep {String} (optional) Character that should join param k=v pairs together. Default: "&"
2828
* @param eq {String} (optional) Character that should join keys to their values. Default: "="
2929
* @param name {String} (optional) Name of the current key, for handling children recursively.
30+
* @param escape {Function} (optional) Function for escaping. Default: encodeURIComponent
3031
*/
31-
var stringify = function (obj, sep, eq, name) {
32-
sep = sep || "&";
33-
eq = eq || "=";
34-
35-
if (util.isNull(obj) || util.isUndefined(obj) || typeof(obj) === 'function') {
36-
return name ? escape(name) + eq : '';
37-
}
38-
39-
if (util.is('Boolean',obj)) obj = +obj;
40-
if (util.is('Number',obj) || util.is("String",obj)) {
41-
42-
return escape(name) + eq + escape(obj);
43-
}
44-
45-
if (util.isArray(obj)) {
46-
var s = [];
47-
name = name+'[]';
48-
for (var i = 0, l = obj.length; i < l; i ++) {
49-
s.push( stringify(obj[i], sep, eq, name) );
50-
}
51-
return s.join(sep);
52-
}
53-
54-
// Check for cyclical references in nested objects
55-
for (var i = stack.length - 1; i >= 0; --i) if (stack[i] === obj) {
56-
throw new Error("stringify. Cyclical reference");
57-
}
58-
59-
stack.push(obj);
60-
32+
function querystring_stringify (obj, sep, eq, name, escape) {
33+
sep = sep || "&";
34+
eq = eq || "=";
35+
escape = escape || encodeURIComponent;
36+
37+
if (util.isNull(obj) || util.isUndefined(obj) || typeof(obj) === 'function') {
38+
return name ? escape(name) + eq : '';
39+
}
40+
41+
if (util.isBoolean(obj)) obj = +obj;
42+
if (util.isNumber(obj) || util.isString(obj)) {
43+
return escape(name) + eq + escape(obj);
44+
}
45+
46+
if (util.isArray(obj)) {
6147
var s = [];
62-
var begin = name ? name + '[' : '';
63-
var end = name ? ']' : '';
64-
for (var i in obj) if (obj.hasOwnProperty(i)) {
65-
var n = begin + i + end;
66-
s.push(stringify(obj[i], sep, eq, n));
67-
}
68-
69-
stack.pop();
70-
71-
s = s.join(sep);
72-
if (!s && name) return name + "=";
73-
return s;
48+
name = name+'[]';
49+
for (var i = 0, l = obj.length; i < l; i ++) {
50+
s.push( querystring_stringify(obj[i], sep, eq, name, escape) );
51+
}
52+
return s.join(sep);
53+
}
54+
55+
// Check for cyclical references in nested objects
56+
for (var i = stack.length - 1; i >= 0; --i) if (stack[i] === obj) {
57+
throw new Error("querystring_stringify. Cyclical reference");
58+
}
59+
60+
stack.push(obj);
61+
62+
var s = [];
63+
var begin = name ? name + '[' : '';
64+
var end = name ? ']' : '';
65+
for (var i in obj) if (obj.hasOwnProperty(i)) {
66+
var n = begin + i + end;
67+
s.push(querystring_stringify(obj[i], sep, eq, n, escape));
68+
}
69+
70+
stack.pop();
71+
72+
s = s.join(sep);
73+
if (!s && name) return name + "=";
74+
return s;
7475
};
7576

76-
/* exports */
77-
78-
exports.stringify = stringify;

querystring.js

+6-9
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,9 @@
1919
*
2020
*/
2121

22-
23-
24-
var qp = require("./querystring-parse"),
25-
qs = require("./querystring-stringify");
26-
27-
/* exports */
28-
29-
exports.parse = qp.parse;
30-
exports.stringify = qs.stringify;
22+
[
23+
require("./querystring-parse"),
24+
require("./querystring-stringify")
25+
].forEach(function (q) {
26+
for (var i in q) if (q.hasOwnProperty(i)) exports[i] = q[i];
27+
});

0 commit comments

Comments
 (0)