@chasemoskal/magical
Version:
web toolkit for lit apps
44 lines • 1.74 kB
JavaScript
export function* compile(expressions) {
function recurse(expression, previousSelector) {
let css = [];
const selector = expression[0];
// This is an at-rule, not a regular selector.
if (selector.startsWith("@")) {
const directive = expression[0];
const children = expression[1];
css.push(`${stripAwayComments(directive)}`);
for (const child of children)
css = [...css, ...recurse(child, undefined)];
css.push(`}`);
}
// This is a regular selector.
else {
const rules = expression[1];
const children = expression[2];
const compoundSelector = previousSelector
? handleParentReference(`${previousSelector} ${selector}`)
: selector;
const ruleEntries = Object.entries(rules);
if (ruleEntries.length > 0) {
const rulesString = ruleEntries
.map(([ruleName, ruleValue]) => `\t${ruleName}: ${stripAwayComments(ruleValue)};`)
.join("\n");
css.push(`${stripAwayComments(compoundSelector)} {\n${rulesString}\n}`);
}
for (const child of children)
css = [...css, ...recurse(child, compoundSelector)];
}
return css;
}
yield "\n";
for (const expression of expressions)
yield "\n" + recurse(expression, undefined).join("\n");
yield "\n";
}
function stripAwayComments(text) {
return text.replaceAll(/(\s*)(\/\/.*)$/gm, "");
}
function handleParentReference(groupedSelector) {
return groupedSelector.replaceAll(/(\s+)*(\^|&)/gm, "");
}
//# sourceMappingURL=compile.js.map