Skip to content

Commit 6e74e36

Browse files
committed
Use css-selector-parser
1 parent 7618da2 commit 6e74e36

File tree

5 files changed

+59
-24
lines changed

5 files changed

+59
-24
lines changed

index.js

Lines changed: 4 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,10 @@
11
'use strict';
22

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');
255

266

277
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) : [];
2910
};

lib/select.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
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+
};

lib/selector.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
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+
};

package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@
3030
"visit",
3131
"walk"
3232
],
33-
"dependencies": {},
33+
"dependencies": {
34+
"css-selector-parser": "^1.1.0"
35+
},
3436
"devDependencies": {
3537
"tape": "^4.2.0"
3638
}

test/test.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,13 @@ var select = require('..'),
66
var test = require('tape');
77

88

9+
test('edge cases', function (t) {
10+
t.deepEqual(select(ast, ''), []);
11+
t.deepEqual(select(ast, '\t '), []);
12+
t.end();
13+
});
14+
15+
916
test('type selector', function (t) {
1017
t.equal(select(ast, 'root').length, 1);
1118
t.equal(select(ast, 'root')[0], ast);

0 commit comments

Comments
 (0)