3
3
module . exports = match
4
4
5
5
var zwitch = require ( 'zwitch' )
6
- var needsIndex = require ( './pseudo' ) . needsIndex
6
+ var pseudo = require ( './pseudo' )
7
7
var test = require ( './test' )
8
8
var nest = require ( './nest' )
9
9
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
+ } )
18
19
19
20
function match ( query , node , state ) {
20
21
return query && node ? type ( query , node , state ) : [ ]
21
22
}
22
23
23
24
function selectors ( query , node , state ) {
24
25
var collect = collector ( state . one )
25
- var ruleSets = query . selectors
26
- var length = ruleSets . length
27
26
var index = - 1
28
27
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 ) )
31
30
}
32
31
33
32
return collect . result
@@ -39,22 +38,27 @@ function ruleSet(query, node, state) {
39
38
40
39
function rule ( query , tree , state ) {
41
40
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
- }
48
41
49
42
if ( state . shallow && query . rule ) {
50
43
throw new Error ( 'Expected selector without nesting' )
51
44
}
52
45
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
+ )
54
58
55
59
return collect . result
56
60
57
- function match ( query , node , index , parent , state ) {
61
+ function iterator ( query , node , index , parent , state ) {
58
62
if ( test ( query , node , index , parent , state ) ) {
59
63
if ( query . rule ) {
60
64
nest ( query . rule , node , index , parent , configure ( query . rule , state ) )
@@ -64,21 +68,20 @@ function rule(query, tree, state) {
64
68
}
65
69
}
66
70
}
71
+ }
67
72
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
72
76
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
78
81
}
79
-
80
- return state
81
82
}
83
+
84
+ return state
82
85
}
83
86
84
87
/* istanbul ignore next - Shouldn’t be invoked, all data is handled. */
@@ -100,35 +103,26 @@ function collector(one) {
100
103
return collect
101
104
102
105
/* 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
113
108
114
- while ( ++ index < length ) {
115
- collectOne ( source [ index ] )
109
+ if ( 'length' in node ) {
110
+ while ( ++ index < node . length ) {
111
+ collectOne ( node [ index ] )
116
112
}
113
+ } else {
114
+ collectOne ( node )
117
115
}
116
+ }
118
117
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' )
128
122
129
- if ( result . indexOf ( node ) === - 1 ) {
130
- result . push ( node )
131
- }
123
+ found = true
132
124
}
125
+
126
+ if ( result . indexOf ( node ) < 0 ) result . push ( node )
133
127
}
134
128
}
0 commit comments