@@ -35,21 +35,21 @@ var attribSelectors = {
35
35
36
36
//pseudos, whose data-property is parsed as well
37
37
var unpackPseudos = {
38
- __proto__ : null ,
39
- "has" : true ,
40
- "not" : true ,
41
- "matches" : true
38
+ __proto__ : null ,
39
+ "has" : true ,
40
+ "not" : true ,
41
+ "matches" : true
42
42
} ;
43
43
44
44
var stripQuotesFromPseudos = {
45
- __proto__ : null ,
46
- "contains" : true
45
+ __proto__ : null ,
46
+ "contains" : true
47
47
} ;
48
48
49
49
var quotes = {
50
- __proto__ : null ,
51
- "\"" : true ,
52
- "'" : true
50
+ __proto__ : null ,
51
+ "\"" : true ,
52
+ "'" : true
53
53
} ;
54
54
55
55
//unescape function taken from https://github.com/jquery/sizzle/blob/master/src/sizzle.js#L139
@@ -72,71 +72,71 @@ function unescapeCSS(str){
72
72
}
73
73
74
74
function isWhitespace ( c ) {
75
- return c === " " || c === "\n" || c === "\t" || c === "\f" || c === "\r" ;
75
+ return c === " " || c === "\n" || c === "\t" || c === "\f" || c === "\r" ;
76
76
}
77
77
78
78
function parse ( selector , options ) {
79
79
var subselects = [ ] ;
80
80
81
- selector = parseSelector ( subselects , selector + "" , options ) ;
81
+ selector = parseSelector ( subselects , selector + "" , options ) ;
82
82
83
- if ( selector !== "" ) {
84
- throw new SyntaxError ( "Unmatched selector: " + selector ) ;
85
- }
83
+ if ( selector !== "" ) {
84
+ throw new SyntaxError ( "Unmatched selector: " + selector ) ;
85
+ }
86
86
87
- return subselects ;
87
+ return subselects ;
88
88
}
89
89
90
90
function parseSelector ( subselects , selector , options ) {
91
- var tokens = [ ] ,
92
- sawWS = false ,
93
- data , firstChar , name , quot ;
91
+ var tokens = [ ] ,
92
+ sawWS = false ,
93
+ data , firstChar , name , quot ;
94
94
95
95
function getName ( ) {
96
96
var sub = selector . match ( re_name ) [ 0 ] ;
97
97
selector = selector . substr ( sub . length ) ;
98
98
return unescapeCSS ( sub ) ;
99
99
}
100
100
101
- function stripWhitespace ( start ) {
102
- while ( isWhitespace ( selector . charAt ( start ) ) ) start ++ ;
103
- selector = selector . substr ( start ) ;
104
- }
101
+ function stripWhitespace ( start ) {
102
+ while ( isWhitespace ( selector . charAt ( start ) ) ) start ++ ;
103
+ selector = selector . substr ( start ) ;
104
+ }
105
105
106
- stripWhitespace ( 0 ) ;
106
+ stripWhitespace ( 0 ) ;
107
107
108
108
while ( selector !== "" ) {
109
- firstChar = selector . charAt ( 0 ) ;
109
+ firstChar = selector . charAt ( 0 ) ;
110
110
111
- if ( isWhitespace ( firstChar ) ) {
111
+ if ( isWhitespace ( firstChar ) ) {
112
112
sawWS = true ;
113
- stripWhitespace ( 1 ) ;
113
+ stripWhitespace ( 1 ) ;
114
114
} else if ( firstChar in simpleSelectors ) {
115
- tokens . push ( { type : simpleSelectors [ firstChar ] } ) ;
116
- sawWS = false ;
117
-
118
- stripWhitespace ( 1 ) ;
119
- } else if ( firstChar === "," ) {
120
- if ( tokens . length === 0 ) {
121
- throw new SyntaxError ( "empty sub-selector" ) ;
122
- }
123
- subselects . push ( tokens ) ;
124
- tokens = [ ] ;
125
- sawWS = false ;
126
- stripWhitespace ( 1 ) ;
127
- } else {
115
+ tokens . push ( { type : simpleSelectors [ firstChar ] } ) ;
116
+ sawWS = false ;
117
+
118
+ stripWhitespace ( 1 ) ;
119
+ } else if ( firstChar === "," ) {
120
+ if ( tokens . length === 0 ) {
121
+ throw new SyntaxError ( "empty sub-selector" ) ;
122
+ }
123
+ subselects . push ( tokens ) ;
124
+ tokens = [ ] ;
125
+ sawWS = false ;
126
+ stripWhitespace ( 1 ) ;
127
+ } else {
128
128
if ( sawWS ) {
129
- if ( tokens . length > 0 ) {
130
- tokens . push ( { type : "descendant" } ) ;
131
- }
129
+ if ( tokens . length > 0 ) {
130
+ tokens . push ( { type : "descendant" } ) ;
131
+ }
132
132
sawWS = false ;
133
133
}
134
134
135
- if ( firstChar === "*" ) {
136
- selector = selector . substr ( 1 ) ;
135
+ if ( firstChar === "*" ) {
136
+ selector = selector . substr ( 1 ) ;
137
137
tokens . push ( { type : "universal" } ) ;
138
138
} else if ( firstChar in attribSelectors ) {
139
- selector = selector . substr ( 1 ) ;
139
+ selector = selector . substr ( 1 ) ;
140
140
tokens . push ( {
141
141
type : "attribute" ,
142
142
name : attribSelectors [ firstChar ] [ 0 ] ,
@@ -145,7 +145,7 @@ function parseSelector(subselects, selector, options){
145
145
ignoreCase : false
146
146
} ) ;
147
147
} else if ( firstChar === "[" ) {
148
- selector = selector . substr ( 1 ) ;
148
+ selector = selector . substr ( 1 ) ;
149
149
data = selector . match ( re_attr ) ;
150
150
if ( ! data ) {
151
151
throw new SyntaxError ( "Malformed attribute selector: " + selector ) ;
@@ -174,89 +174,89 @@ function parseSelector(subselects, selector, options){
174
174
} else if ( firstChar === ":" ) {
175
175
//if(selector.charAt(1) === ":"){} //TODO pseudo-element
176
176
177
- selector = selector . substr ( 1 ) ;
177
+ selector = selector . substr ( 1 ) ;
178
178
179
179
name = getName ( ) . toLowerCase ( ) ;
180
180
data = null ;
181
181
182
182
if ( selector . charAt ( 0 ) === "(" ) {
183
- if ( name in unpackPseudos ) {
184
- quot = selector . charAt ( 1 ) ;
185
- var quoted = quot in quotes ;
183
+ if ( name in unpackPseudos ) {
184
+ quot = selector . charAt ( 1 ) ;
185
+ var quoted = quot in quotes ;
186
186
187
- selector = selector . substr ( quoted + 1 ) ;
187
+ selector = selector . substr ( quoted + 1 ) ;
188
188
189
- data = [ ] ;
190
- selector = parseSelector ( data , selector , options ) ;
189
+ data = [ ] ;
190
+ selector = parseSelector ( data , selector , options ) ;
191
191
192
- if ( quoted ) {
193
- if ( selector . charAt ( 0 ) !== quot ) {
194
- throw new SyntaxError ( "unmatched quotes in :" + name ) ;
195
- } else {
196
- selector = selector . substr ( 1 ) ;
197
- }
198
- }
192
+ if ( quoted ) {
193
+ if ( selector . charAt ( 0 ) !== quot ) {
194
+ throw new SyntaxError ( "unmatched quotes in :" + name ) ;
195
+ } else {
196
+ selector = selector . substr ( 1 ) ;
197
+ }
198
+ }
199
199
200
- if ( selector . charAt ( 0 ) !== ")" ) {
201
- throw new SyntaxError ( "missing closing parenthesis in :" + name + " " + selector ) ;
202
- }
200
+ if ( selector . charAt ( 0 ) !== ")" ) {
201
+ throw new SyntaxError ( "missing closing parenthesis in :" + name + " " + selector ) ;
202
+ }
203
203
204
- selector = selector . substr ( 1 ) ;
205
- } else {
206
- var pos = 1 , counter = 1 ;
204
+ selector = selector . substr ( 1 ) ;
205
+ } else {
206
+ var pos = 1 , counter = 1 ;
207
207
208
- for ( ; counter > 0 && pos < selector . length ; pos ++ ) {
209
- if ( selector . charAt ( pos ) === "(" ) counter ++ ;
210
- else if ( selector . charAt ( pos ) === ")" ) counter -- ;
211
- }
208
+ for ( ; counter > 0 && pos < selector . length ; pos ++ ) {
209
+ if ( selector . charAt ( pos ) === "(" ) counter ++ ;
210
+ else if ( selector . charAt ( pos ) === ")" ) counter -- ;
211
+ }
212
212
213
- if ( counter ) {
214
- throw new SyntaxError ( "parenthesis not matched" ) ;
215
- }
213
+ if ( counter ) {
214
+ throw new SyntaxError ( "parenthesis not matched" ) ;
215
+ }
216
216
217
- data = selector . substr ( 1 , pos - 2 ) ;
218
- selector = selector . substr ( pos ) ;
217
+ data = selector . substr ( 1 , pos - 2 ) ;
218
+ selector = selector . substr ( pos ) ;
219
219
220
- if ( name in stripQuotesFromPseudos ) {
221
- quot = data . charAt ( 0 ) ;
220
+ if ( name in stripQuotesFromPseudos ) {
221
+ quot = data . charAt ( 0 ) ;
222
222
223
- if ( quot === data . slice ( - 1 ) && quot in quotes ) {
224
- data = data . slice ( 1 , - 1 ) ;
225
- }
223
+ if ( quot === data . slice ( - 1 ) && quot in quotes ) {
224
+ data = data . slice ( 1 , - 1 ) ;
225
+ }
226
226
227
- data = unescapeCSS ( data ) ;
228
- }
229
- }
227
+ data = unescapeCSS ( data ) ;
228
+ }
229
+ }
230
230
}
231
231
232
232
tokens . push ( { type : "pseudo" , name : name , data : data } ) ;
233
233
} else if ( re_name . test ( selector ) ) {
234
- name = getName ( ) ;
235
-
236
- if ( ! options || ( "lowerCaseTags" in options ? options . lowerCaseTags : ! options . xmlMode ) ) {
237
- name = name . toLowerCase ( ) ;
238
- }
239
-
240
- tokens . push ( { type : "tag" , name : name } ) ;
241
- } else {
242
- if ( tokens . length && tokens [ tokens . length - 1 ] . type === "descendant" ) {
243
- tokens . pop ( ) ;
244
- }
245
- addToken ( subselects , tokens ) ;
246
- return selector ;
234
+ name = getName ( ) ;
235
+
236
+ if ( ! options || ( "lowerCaseTags" in options ? options . lowerCaseTags : ! options . xmlMode ) ) {
237
+ name = name . toLowerCase ( ) ;
238
+ }
239
+
240
+ tokens . push ( { type : "tag" , name : name } ) ;
241
+ } else {
242
+ if ( tokens . length && tokens [ tokens . length - 1 ] . type === "descendant" ) {
243
+ tokens . pop ( ) ;
244
+ }
245
+ addToken ( subselects , tokens ) ;
246
+ return selector ;
247
247
}
248
248
}
249
249
}
250
250
251
- addToken ( subselects , tokens ) ;
251
+ addToken ( subselects , tokens ) ;
252
252
253
253
return selector ;
254
254
}
255
255
256
256
function addToken ( subselects , tokens ) {
257
- if ( subselects . length > 0 && tokens . length === 0 ) {
258
- throw new SyntaxError ( "empty sub-selector" ) ;
259
- }
257
+ if ( subselects . length > 0 && tokens . length === 0 ) {
258
+ throw new SyntaxError ( "empty sub-selector" ) ;
259
+ }
260
260
261
261
subselects . push ( tokens ) ;
262
262
}
0 commit comments