63 lines
1.5 KiB
JavaScript
63 lines
1.5 KiB
JavaScript
|
"use strict";
|
||
|
|
||
|
var cssesc = require("cssesc");
|
||
|
|
||
|
var stringify;
|
||
|
|
||
|
function escape(str, stringType) {
|
||
|
return cssesc(str, {
|
||
|
quotes: stringType === "\"" ? "double" : "single"
|
||
|
});
|
||
|
}
|
||
|
|
||
|
function stringifyWithoutBeforeAfter(tree) {
|
||
|
switch(tree.type) {
|
||
|
case "values":
|
||
|
return tree.nodes.map(stringify).join(",");
|
||
|
case "value":
|
||
|
return tree.nodes.map(stringify).join("");
|
||
|
case "item":
|
||
|
return tree.name;
|
||
|
case "nested-item":
|
||
|
return tree.name + "(" + tree.nodes.map(stringify).join(",") + ")";
|
||
|
case "invalid":
|
||
|
return tree.value;
|
||
|
case "comment":
|
||
|
return "/*" + tree.content + "*/";
|
||
|
case "string":
|
||
|
switch(tree.stringType) {
|
||
|
case "'":
|
||
|
return "'" + escape(tree.value, "'") + "'";
|
||
|
case "\"":
|
||
|
return "\"" + escape(tree.value, "\"") + "\"";
|
||
|
}
|
||
|
/* istanbul ignore next */
|
||
|
throw new Error("Invalid stringType");
|
||
|
case "url":
|
||
|
var start = "url(" + (tree.innerSpacingBefore || "");
|
||
|
var end = (tree.innerSpacingAfter || "") + ")";
|
||
|
switch(tree.stringType) {
|
||
|
case "'":
|
||
|
return start + "'" + tree.url.replace(/(\\)/g, "\\$1").replace(/'/g, "\\'") + "'" + end;
|
||
|
case "\"":
|
||
|
return start + "\"" + tree.url.replace(/(\\)/g, "\\$1").replace(/"/g, "\\\"") + "\"" + end;
|
||
|
default:
|
||
|
return start + tree.url.replace(/("|'|\)|\\)/g, "\\$1") + end;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
stringify = function stringify(tree) {
|
||
|
var str = stringifyWithoutBeforeAfter(tree);
|
||
|
if(tree.before) {
|
||
|
str = tree.before + str;
|
||
|
}
|
||
|
if(tree.after) {
|
||
|
str = str + tree.after;
|
||
|
}
|
||
|
return str;
|
||
|
};
|
||
|
|
||
|
module.exports = stringify;
|