Files
2023-08-01 13:49:46 +02:00

88 lines
2.2 KiB
JavaScript

var parse = require('csso').syntax.parse;
function getInfo(postcssNode) {
return {
postcssNode: postcssNode
};
}
function appendChildren(cssoNode, nodes) {
cssoNode.children.fromArray(nodes.map(postcssToCsso));
return cssoNode;
}
function parseToCsso(css, config, postcssNode) {
var cssoNode;
try {
cssoNode = parse(css || '', config);
} catch (e) {
if (e.name === 'CssSyntaxError') {
throw postcssNode.error(e.message, { index: e.offset });
}
throw e;
}
cssoNode.loc = getInfo(postcssNode);
return cssoNode;
}
function postcssToCsso(node) {
switch (node.type) {
case 'root':
return appendChildren(
parseToCsso('', { context: 'stylesheet' }, node),
node.nodes
);
case 'rule':
return {
type: 'Rule',
loc: getInfo(node),
prelude: parseToCsso(node.selector, { context: 'selectorList' }, node),
block: appendChildren(
parseToCsso('{}', { context: 'block' }, node),
node.nodes
)
};
case 'atrule':
var cssoNode = {
type: 'Atrule',
loc: getInfo(node),
name: node.name,
prelude: node.params
? parseToCsso(node.params, { context: 'atrulePrelude', atrule: node.name }, node)
: null,
block: null
};
if (node.nodes) {
cssoNode.block = appendChildren(
parseToCsso('{}', { context: 'block' }, node),
node.nodes
);
}
return cssoNode;
case 'decl':
return parseToCsso(
(node.raws.before || '').trimLeft() + node.toString(),
{ context: 'declaration' },
node
);
case 'comment':
return {
type: 'Comment',
loc: getInfo(node),
value: node.raws.left + node.text + node.raws.right
};
}
}
module.exports = postcssToCsso;