stringify.js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. "use strict";
  2. var regexpu = require("regexpu-core");
  3. var identifierEscapeRegexp = new RegExp(
  4. regexpu("(^[^A-Za-z_\\-\\u{00a0}-\\u{10ffff}]|^--|[^A-Za-z_0-9\\-\\u{00a0}-\\u{10ffff}])", "ug"),
  5. "g"
  6. );
  7. function escape(str, identifier) {
  8. if(str === "*") {
  9. return "*";
  10. }
  11. if (identifier) {
  12. return str.replace(identifierEscapeRegexp, "\\$1");
  13. } else {
  14. return str.replace(/(^[^A-Za-z_\\-]|^--|[^A-Za-z_0-9\\-])/g, "\\$1");
  15. }
  16. }
  17. function stringifyWithoutBeforeAfter(tree) {
  18. switch(tree.type) {
  19. case "selectors":
  20. return tree.nodes.map(stringify).join(",");
  21. case "selector":
  22. return tree.nodes.map(stringify).join("");
  23. case "element":
  24. return (typeof tree.namespace === "string" ? escape(tree.namespace) + "|" : "") + escape(tree.name);
  25. case "class":
  26. return "." + escape(tree.name, true);
  27. case "id":
  28. return "#" + escape(tree.name, true);
  29. case "attribute":
  30. return "[" + tree.content + "]";
  31. case "spacing":
  32. return tree.value;
  33. case "pseudo-class":
  34. return ":" + escape(tree.name) + (typeof tree.content === "string" ? "(" + tree.content + ")" : "");
  35. case "nested-pseudo-class":
  36. return ":" + escape(tree.name) + "(" + tree.nodes.map(stringify).join(",") + ")";
  37. case "pseudo-element":
  38. return "::" + escape(tree.name);
  39. case "universal":
  40. return (typeof tree.namespace === "string" ? escape(tree.namespace) + "|" : "") + "*";
  41. case "operator":
  42. return tree.operator;
  43. case "comment":
  44. return "/*" + tree.content + "*/";
  45. case "invalid":
  46. return tree.value;
  47. }
  48. }
  49. function stringify(tree) {
  50. var str = stringifyWithoutBeforeAfter(tree);
  51. if(tree.before) {
  52. str = tree.before + str;
  53. }
  54. if(tree.after) {
  55. str = str + tree.after;
  56. }
  57. return str;
  58. }
  59. module.exports = stringify;