1 | var utils = require('../utils');
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 | (module.exports = function selector(){
|
13 | var stack = this.selectorStack
|
14 | , args = [].slice.call(arguments);
|
15 |
|
16 | if (1 == args.length) {
|
17 | var expr = utils.unwrap(args[0])
|
18 | , len = expr.nodes.length;
|
19 |
|
20 |
|
21 | if (1 == len) {
|
22 | utils.assertString(expr.first, 'selector');
|
23 | var SelectorParser = require('../selector-parser')
|
24 | , val = expr.first.string
|
25 | , parsed = new SelectorParser(val).parse().val;
|
26 |
|
27 | if (parsed == val) return val;
|
28 |
|
29 | stack.push(parse(val));
|
30 | } else if (len > 1) {
|
31 |
|
32 |
|
33 | if (expr.isList) {
|
34 | pushToStack(expr.nodes, stack);
|
35 |
|
36 | } else {
|
37 | stack.push(parse(expr.nodes.map(function(node){
|
38 | utils.assertString(node, 'selector');
|
39 | return node.string;
|
40 | }).join(' ')));
|
41 | }
|
42 | }
|
43 |
|
44 | } else if (args.length > 1) {
|
45 | pushToStack(args, stack);
|
46 | }
|
47 |
|
48 | return stack.length ? utils.compileSelectors(stack).join(',') : '&';
|
49 | }).raw = true;
|
50 |
|
51 | function pushToStack(selectors, stack) {
|
52 | selectors.forEach(function(sel) {
|
53 | sel = sel.first;
|
54 | utils.assertString(sel, 'selector');
|
55 | stack.push(parse(sel.string));
|
56 | });
|
57 | }
|
58 |
|
59 | function parse(selector) {
|
60 | var Parser = new require('../parser')
|
61 | , parser = new Parser(selector)
|
62 | , nodes;
|
63 | parser.state.push('selector-parts');
|
64 | nodes = parser.selector();
|
65 | nodes.forEach(function(node) {
|
66 | node.val = node.segments.map(function(seg){
|
67 | return seg.toString();
|
68 | }).join('');
|
69 | });
|
70 | return nodes;
|
71 | }
|