This repository has been archived by the owner on Jan 28, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 3
/
index.js
79 lines (68 loc) · 1.61 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
const cssom = require('cssom');
/**
* Returns an array of the selectors.
*
* @license Sizzle CSS Selector Engine - MIT
* @param {String} selectorText from cssom
* @api public
*/
function extract(selectorText) {
let attr = 0;
const sels = [];
let sel = '';
let i;
let c;
const l = selectorText.length;
for (i = 0; i < l; i++) {
c = selectorText.charAt(i);
if (attr) {
if (c === '[' || c === '(') {
attr--;
}
sel += c;
} else if (c === ',') {
sels.push(sel);
sel = '';
} else {
if (c === '[' || c === '(') {
attr++;
}
if (sel.length || (c !== ',' && c !== '\n' && c !== ' ')) {
sel += c;
}
}
}
if (sel.length) {
sels.push(sel);
}
return sels;
}
/**
* Returns a parse tree for a CSS source.
* If it encounters multiple selectors separated by a comma, it splits the
* tree.
*
* @param {String} css source
* @api public
*/
module.exports = css => {
const rules = cssom.parse(css).cssRules || [];
const ret = [];
let i;
const l = rules.length;
let rule;
let selectors;
let ii;
let ll;
for (i = 0; i < l; i++) {
if (rules[i].selectorText) { // media queries don't have selectorText
rule = rules[i];
selectors = extract(rule.selectorText);
ll = selectors.length;
for (ii = 0; ii < ll; ii++) {
ret.push([ selectors[ii], rule.style ]);
}
}
}
return ret;
};