1 | var utils = require('../utils');
|
---|
2 |
|
---|
3 | /**
|
---|
4 | * Return the current selector or compile
|
---|
5 | * selector from a string or a list.
|
---|
6 | *
|
---|
7 | * @param {String|Expression}
|
---|
8 | * @return {String}
|
---|
9 | * @api public
|
---|
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 | // selector('.a')
|
---|
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 | // selector-list = '.a', '.b', '.c'
|
---|
32 | // selector(selector-list)
|
---|
33 | if (expr.isList) {
|
---|
34 | pushToStack(expr.nodes, stack);
|
---|
35 | // selector('.a' '.b' '.c')
|
---|
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 | // selector('.a', '.b', '.c')
|
---|
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 | }
|
---|