stringify.js 1.6 KB

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