"use strict"; var stringify; var regexpu = require("regexpu-core"); var identifierEscapeRegexp = new RegExp( regexpu("(^[^A-Za-z_\\-\\u{00a0}-\\u{10ffff}]|^\\-\\-|[^A-Za-z_0-9\\-\\u{00a0}-\\u{10ffff}])", "ug"), "g" ); function escape(str, identifier) { if(str === "*") { return "*"; } if (identifier) { return str.replace(identifierEscapeRegexp, "\\$1"); } else { return str.replace(/(^[^A-Za-z_\\-]|^\-\-|[^A-Za-z_0-9\\-])/g, "\\$1"); } } function stringifyWithoutBeforeAfter(tree) { switch(tree.type) { case "selectors": return tree.nodes.map(stringify).join(","); case "selector": return tree.nodes.map(stringify).join(""); case "element": return (typeof tree.namespace === "string" ? escape(tree.namespace) + "|" : "") + escape(tree.name); case "class": return "." + escape(tree.name, true); case "id": return "#" + escape(tree.name, true); case "attribute": return "[" + tree.content + "]"; case "spacing": return tree.value; case "pseudo-class": return ":" + escape(tree.name) + (typeof tree.content === "string" ? "(" + tree.content + ")" : ""); case "nested-pseudo-class": return ":" + escape(tree.name) + "(" + tree.nodes.map(stringify).join(",") + ")"; case "pseudo-element": return "::" + escape(tree.name); case "universal": return (typeof tree.namespace === "string" ? escape(tree.namespace) + "|" : "") + "*"; case "operator": return tree.operator; case "comment": return "/*" + tree.content + "*/"; case "invalid": return tree.value; } } 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;