css-rules
Version:
Returns a parse tree for a CSS source.
80 lines (68 loc) • 1.65 kB
JavaScript
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;
};