88 lines
2.2 KiB
JavaScript
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;
|