37 lines
1 KiB
JavaScript
37 lines
1 KiB
JavaScript
'use strict';
|
|
|
|
const tab = " ";
|
|
const nl = "\n";
|
|
function tokensToString(tree) {
|
|
let compact = true;
|
|
for (let i = 0; i < tree.length; i++) {
|
|
if (tree[i].type !== "rule") {
|
|
compact = false;
|
|
break;
|
|
}
|
|
}
|
|
return tree.map((token) => {
|
|
return parseToken(token, compact, 0);
|
|
}).join("");
|
|
}
|
|
function parseToken(token, compact, depth) {
|
|
let content;
|
|
switch (token.type) {
|
|
case "rule": {
|
|
return (compact ? "" : tab.repeat(depth)) + token.prop + (compact ? ":" : ": ") + token.value + ";" + (compact ? "" : nl);
|
|
}
|
|
case "at-rule": {
|
|
content = `@${token.rule} ${token.value}`.trim();
|
|
break;
|
|
}
|
|
case "selector": {
|
|
content = token.selectors.join(compact ? "," : ", ");
|
|
}
|
|
}
|
|
const children = token.children.map((item) => {
|
|
return parseToken(item, compact, depth + 1);
|
|
});
|
|
return (compact ? "" : tab.repeat(depth)) + content + (compact ? "{" : " {" + nl) + children.join("") + (compact ? "}" : tab.repeat(depth) + "}" + nl);
|
|
}
|
|
|
|
exports.tokensToString = tokensToString;
|