|
|
- "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;
|