File tree Expand file tree Collapse file tree 5 files changed +59
-24
lines changed Expand file tree Collapse file tree 5 files changed +59
-24
lines changed Original file line number Diff line number Diff line change 1
1
'use strict' ;
2
2
3
-
4
- function select ( ast , selector ) {
5
- var result = [ ] ;
6
-
7
- ( function walk ( node ) {
8
- if ( node . type == selector [ 0 ] ) {
9
- if ( selector . length == 1 ) {
10
- result . push ( node ) ;
11
- }
12
- else if ( node . children ) {
13
- node . children . forEach ( function ( child ) {
14
- [ ] . push . apply ( result , select ( child , selector . slice ( 1 ) ) ) ;
15
- } ) ;
16
- }
17
- }
18
- if ( node . children ) {
19
- node . children . forEach ( walk ) ;
20
- }
21
- } ( ast ) ) ;
22
-
23
- return result ;
24
- }
3
+ var parseSelector = require ( './lib/selector' ) ( ) ,
4
+ select = require ( './lib/select' ) ;
25
5
26
6
27
7
module . exports = function ( ast , selector ) {
28
- return select ( ast , selector . split ( / \s + / g) ) ;
8
+ selector = parseSelector ( selector ) ;
9
+ return selector ? select [ selector . type ] ( selector , ast ) : [ ] ;
29
10
} ;
Original file line number Diff line number Diff line change
1
+ 'use strict' ;
2
+
3
+
4
+ var select = exports ;
5
+
6
+
7
+ select . ruleSet = function ( selector , ast ) {
8
+ return select . rule ( selector . rule , ast ) ;
9
+ } ;
10
+
11
+
12
+ select . rule = function ( selector , ast ) {
13
+ var result = [ ] ;
14
+
15
+ ( function walk ( node ) {
16
+ if ( node . type == selector . tagName ) {
17
+ if ( ! selector . rule ) {
18
+ return result . push ( node ) ;
19
+ }
20
+ if ( ! node . children ) {
21
+ return ;
22
+ }
23
+
24
+ node . children . forEach ( function ( childNode ) {
25
+ [ ] . push . apply ( result , select . rule ( selector . rule , childNode ) ) ;
26
+ } ) ;
27
+ }
28
+
29
+ if ( node . children ) {
30
+ node . children . forEach ( walk ) ;
31
+ }
32
+ } ( ast ) ) ;
33
+
34
+ return result ;
35
+ } ;
Original file line number Diff line number Diff line change
1
+ 'use strict' ;
2
+
3
+ var Parser = require ( 'css-selector-parser' ) . CssSelectorParser ;
4
+
5
+
6
+ module . exports = function SelectorParser ( ) {
7
+ var parser = new Parser ;
8
+ parser . registerNestingOperators ( '>' ) ;
9
+ return parser . parse . bind ( parser ) ;
10
+ } ;
Original file line number Diff line number Diff line change 30
30
" visit" ,
31
31
" walk"
32
32
],
33
- "dependencies" : {},
33
+ "dependencies" : {
34
+ "css-selector-parser" : " ^1.1.0"
35
+ },
34
36
"devDependencies" : {
35
37
"tape" : " ^4.2.0"
36
38
}
Original file line number Diff line number Diff line change @@ -6,6 +6,13 @@ var select = require('..'),
6
6
var test = require ( 'tape' ) ;
7
7
8
8
9
+ test ( 'edge cases' , function ( t ) {
10
+ t . deepEqual ( select ( ast , '' ) , [ ] ) ;
11
+ t . deepEqual ( select ( ast , '\t ' ) , [ ] ) ;
12
+ t . end ( ) ;
13
+ } ) ;
14
+
15
+
9
16
test ( 'type selector' , function ( t ) {
10
17
t . equal ( select ( ast , 'root' ) . length , 1 ) ;
11
18
t . equal ( select ( ast , 'root' ) [ 0 ] , ast ) ;
You can’t perform that action at this time.
0 commit comments