@@ -42,6 +42,7 @@ exports.parse = querystring_parse;
42
42
* @for querystring
43
43
* @static
44
44
*/
45
+ < << << << HEAD
45
46
function querystring_parse ( qs , sep , eq , unesc ) {
46
47
return qs . split ( sep || "&" )
47
48
. map ( pieceParser ( eq || "=" , unesc || unescape ) )
@@ -50,6 +51,22 @@ function querystring_parse (qs, sep, eq, unesc) {
50
51
51
52
function unescape ( s ) {
52
53
return decodeURIComponent ( s . replace ( / \+ / g, ' ' ) ) ;
54
+ = === ===
55
+ var parse = function ( qs , sep , eq ) {
56
+ // wouldn't Array(qs.split()).map(pieceParser(eq)).reduce(mergeParams) be prettier?
57
+ return util . reduce (
58
+ util . map (
59
+ qs . split ( sep || "&" ) ,
60
+ pieceParser ( eq || "=" )
61
+ ) ,
62
+ { } ,
63
+ mergeParams
64
+ ) ;
65
+ } ;
66
+
67
+ var unescape = function ( s ) {
68
+ return decodeURIComponent ( s . replace ( / \+ / g, ' ' ) ) ;
69
+ > >>> >>> dfaf3130e7ad0c25f7464dc46bb862c9f0bfb9ee
53
70
} ;
54
71
55
72
@@ -62,24 +79,40 @@ function unescape (s) {
62
79
// return parse(foo[bar], [{bla:"baz"}])
63
80
// return parse(foo, {bar:[{bla:"baz"}]})
64
81
// return {foo:{bar:[{bla:"baz"}] }}
82
+ < << << << HEAD
65
83
function pieceParser ( eq , unesc ) {
66
84
return function parsePiece ( key , val ) {
67
85
86
+ = === ===
87
+ var pieceParser = function ( eq ) {
88
+ return function parsePiece ( key , val ) {
89
+ > >>> >>> dfaf3130e7ad0c25f7464dc46bb862c9f0bfb9ee
68
90
if ( arguments . length !== 2 ) {
69
91
// key=val, called from the map/reduce
70
92
key = key . split ( eq ) ;
71
93
return parsePiece (
94
+ < << << << HEAD
72
95
unesc ( key . shift ( ) ) ,
73
96
unesc ( key . join ( eq ) )
74
97
) ;
98
+ = === ===
99
+ unescape ( key . shift ( ) ) ,
100
+ unescape ( key . join ( eq ) )
101
+ ) ;
102
+ > >>> >>> dfaf3130e7ad0c25f7464dc46bb862c9f0bfb9ee
75
103
}
76
104
key = key . replace ( / ^ \s + | \s + $ / g, '' ) ;
77
105
if ( util . isString ( val ) ) {
78
106
val = val . replace ( / ^ \s + | \s + $ / g, '' ) ;
79
107
// convert numerals to numbers
80
108
if ( ! isNaN ( val ) ) {
109
+ < << << << HEAD
81
110
var numVal = + val ;
82
111
if ( val === numVal . toString ( 10 ) ) val = numVal ;
112
+ = === ===
113
+ var numVal = + val ;
114
+ if ( val === numVal . toString ( 10 ) ) val = numVal ;
115
+ > >>> >>> dfaf3130e7ad0c25f7464dc46bb862c9f0bfb9ee
83
116
}
84
117
}
85
118
var sliced = / ( .* ) \[ ( [ ^ \] ] * ) \] $ / . exec ( key ) ;
@@ -89,8 +122,12 @@ function pieceParser (eq, unesc) {
89
122
return ret ;
90
123
}
91
124
// ["foo[][bar][][baz]", "foo[][bar][]", "baz"]
125
+ < << << << HEAD
92
126
var tail = sliced [ 2 ] ,
93
127
head = sliced [ 1 ] ;
128
+ = === ===
129
+ var tail = sliced [ 2 ] , head = sliced [ 1 ] ;
130
+ > >>> >>> dfaf3130e7ad0c25f7464dc46bb862c9f0bfb9ee
94
131
95
132
// array: key[]=val
96
133
if ( ! tail ) return parsePiece ( head , [ val ] ) ;
@@ -104,6 +141,7 @@ function pieceParser (eq, unesc) {
104
141
105
142
// the reducer function that merges each query piece together into one set of params
106
143
function mergeParams ( params , addition ) {
144
+ < << << << HEAD
107
145
var ret ;
108
146
109
147
if ( ! params ) {
@@ -120,14 +158,39 @@ function mergeParams (params, addition) {
120
158
ret = mergeObjects ( params , addition ) ;
121
159
}
122
160
return ret ;
161
+ = === ===
162
+ var ret ;
163
+
164
+ if ( ! params ) {
165
+ // if it's uncontested, then just return the addition.
166
+ ret = addition ;
167
+ } else if ( util . isArray ( params ) ) {
168
+ // if the existing value is an array, then concat it.
169
+ ret = params . concat ( addition ) ;
170
+ } else if ( ! util . isObject ( params ) || ! util . isObject ( addition ) ) {
171
+ // if the existing value is not an array, and either are not objects, arrayify it.
172
+ ret = [ params ] . concat ( addition ) ;
173
+ } else {
174
+ // else merge them as objects, which is a little more complex
175
+ ret = mergeObjects ( params , addition ) ;
176
+ }
177
+ return ret ;
178
+ > >>> >>> dfaf3130e7ad0c25f7464dc46bb862c9f0bfb9ee
123
179
} ;
124
180
125
181
126
182
// Merge two *objects* together. If this is called, we've already ruled
127
183
// out the simple cases, and need to do the for-in business.
128
184
function mergeObjects ( params , addition ) {
185
+ < << << << HEAD
129
186
for ( var i in addition ) if ( i && addition . hasOwnProperty ( i ) ) {
130
187
params [ i ] = mergeParams ( params [ i ] , addition [ i ] ) ;
188
+ = === ===
189
+ for ( var i in addition ) {
190
+ if ( i && addition . hasOwnProperty ( i ) ) {
191
+ params [ i ] = mergeParams ( params [ i ] , addition [ i ] ) ;
192
+ }
193
+ > >>> >>> dfaf3130e7ad0c25f7464dc46bb862c9f0bfb9ee
131
194
}
132
195
return params ;
133
196
} ;
0 commit comments