33module . exports = match
44
55var zwitch = require ( 'zwitch' )
6- var needsIndex = require ( './pseudo' ) . needsIndex
6+ var pseudo = require ( './pseudo' )
77var test = require ( './test' )
88var nest = require ( './nest' )
99
10- var type = zwitch ( 'type' )
11- var handlers = type . handlers
12-
13- type . unknown = unknownType
14- type . invalid = invalidType
15- handlers . selectors = selectors
16- handlers . ruleSet = ruleSet
17- handlers . rule = rule
10+ var type = zwitch ( 'type' , {
11+ unknown : unknownType ,
12+ invalid : invalidType ,
13+ handlers : {
14+ selectors : selectors ,
15+ ruleSet : ruleSet ,
16+ rule : rule
17+ }
18+ } )
1819
1920function match ( query , node , state ) {
2021 return query && node ? type ( query , node , state ) : [ ]
2122}
2223
2324function selectors ( query , node , state ) {
2425 var collect = collector ( state . one )
25- var ruleSets = query . selectors
26- var length = ruleSets . length
2726 var index = - 1
2827
29- while ( ++ index < length ) {
30- collect ( ruleSet ( ruleSets [ index ] , node , state ) )
28+ while ( ++ index < query . selectors . length ) {
29+ collect ( ruleSet ( query . selectors [ index ] , node , state ) )
3130 }
3231
3332 return collect . result
@@ -39,22 +38,27 @@ function ruleSet(query, node, state) {
3938
4039function rule ( query , tree , state ) {
4140 var collect = collector ( state . one )
42- var options = {
43- scopeNodes : tree . type === 'root' ? tree . children : [ tree ] ,
44- iterator : match ,
45- one : state . one ,
46- shallow : state . shallow
47- }
4841
4942 if ( state . shallow && query . rule ) {
5043 throw new Error ( 'Expected selector without nesting' )
5144 }
5245
53- nest ( query , tree , 0 , null , configure ( query , options ) )
46+ nest (
47+ query ,
48+ tree ,
49+ 0 ,
50+ null ,
51+ configure ( query , {
52+ scopeNodes : tree . type === 'root' ? tree . children : [ tree ] ,
53+ iterator : iterator ,
54+ one : state . one ,
55+ shallow : state . shallow
56+ } )
57+ )
5458
5559 return collect . result
5660
57- function match ( query , node , index , parent , state ) {
61+ function iterator ( query , node , index , parent , state ) {
5862 if ( test ( query , node , index , parent , state ) ) {
5963 if ( query . rule ) {
6064 nest ( query . rule , node , index , parent , configure ( query . rule , state ) )
@@ -64,21 +68,20 @@ function rule(query, tree, state) {
6468 }
6569 }
6670 }
71+ }
6772
68- function configure ( query , state ) {
69- var pseudos = query . pseudos
70- var length = pseudos && pseudos . length
71- var index = - 1
73+ function configure ( query , state ) {
74+ var pseudos = query . pseudos || [ ]
75+ var index = - 1
7276
73- while ( ++ index < length ) {
74- if ( needsIndex . indexOf ( pseudos [ index ] . name ) !== - 1 ) {
75- state . index = true
76- break
77- }
77+ while ( ++ index < pseudos . length ) {
78+ if ( pseudo . needsIndex . indexOf ( pseudos [ index ] . name ) > - 1 ) {
79+ state . index = true
80+ break
7881 }
79-
80- return state
8182 }
83+
84+ return state
8285}
8386
8487/* istanbul ignore next - Shouldn’t be invoked, all data is handled. */
@@ -100,35 +103,26 @@ function collector(one) {
100103 return collect
101104
102105 /* Append nodes to array, filtering out duplicates. */
103- function collect ( source ) {
104- if ( 'length' in source ) {
105- collectAll ( )
106- } else {
107- collectOne ( source )
108- }
109-
110- function collectAll ( ) {
111- var length = source . length
112- var index = - 1
106+ function collect ( node ) {
107+ var index = - 1
113108
114- while ( ++ index < length ) {
115- collectOne ( source [ index ] )
109+ if ( 'length' in node ) {
110+ while ( ++ index < node . length ) {
111+ collectOne ( node [ index ] )
116112 }
113+ } else {
114+ collectOne ( node )
117115 }
116+ }
118117
119- function collectOne ( node ) {
120- if ( one ) {
121- /* istanbul ignore if - shouldn’t happen, safeguards performance problems. */
122- if ( found ) {
123- throw new Error ( 'Cannot collect multiple nodes' )
124- }
125-
126- found = true
127- }
118+ function collectOne ( node ) {
119+ if ( one ) {
120+ /* istanbul ignore if - shouldn’t happen, safeguards performance problems. */
121+ if ( found ) throw new Error ( 'Cannot collect multiple nodes' )
128122
129- if ( result . indexOf ( node ) === - 1 ) {
130- result . push ( node )
131- }
123+ found = true
132124 }
125+
126+ if ( result . indexOf ( node ) < 0 ) result . push ( node )
133127 }
134128}
0 commit comments