stringify.js 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. module.exports = function stringify(tree) {
  2. // TODO: Better error message
  3. if (!tree) throw new Error('We need tree to translate');
  4. function _t(tree) {
  5. var type = tree.type;
  6. if (_unique[type]) return _unique[type](tree);
  7. if (typeof tree.content === 'string') return tree.content;
  8. if (Array.isArray(tree.content)) return _composite(tree.content);
  9. return '';
  10. }
  11. function _composite(t, i) {
  12. if (!t) return '';
  13. var s = '';
  14. i = i || 0;
  15. for (; i < t.length; i++) s += _t(t[i]);
  16. return s;
  17. }
  18. var _unique = {
  19. 'arguments': function(t) {
  20. return '(' + _composite(t.content) + ')';
  21. },
  22. 'atkeyword': function(t) {
  23. return '@' + _composite(t.content);
  24. },
  25. 'atruler': function(t) {
  26. return _t(t.content[0]) + _t(t.content[1]) + '{' + _t(t.content[2]) + '}';
  27. },
  28. 'attribute': function(t) {
  29. return '[' + _composite(t.content) + ']';
  30. },
  31. 'block': function(t) {
  32. return '{' + _composite(t.content) + '}';
  33. },
  34. 'braces': function(t) {
  35. return t.content[0] + _composite(t.content.slice(2)) + t.content[1];
  36. },
  37. 'class': function(t) {
  38. return '.' + _composite(t.content);
  39. },
  40. 'color': function(t) {
  41. return '#' + t.content;
  42. },
  43. 'filter': function(t) {
  44. return _t(t.content[0]) + ':' + _t(t.content[1]);
  45. },
  46. 'functionExpression': function(t) {
  47. return 'expression(' + t.content + ')';
  48. },
  49. 'id': function (t) {
  50. return '#' + t.content;
  51. },
  52. 'important': function(t) {
  53. return '!' + _composite(t.content) + 'important';
  54. },
  55. 'multilineComment': function(t) {
  56. return '/*' + t.content + '*/';
  57. },
  58. 'nthSelector': function(t) {
  59. return ':' + _t(t.content[0]) + '(' + _composite(t.content.slice(1)) + ')';
  60. },
  61. 'percentage': function(t) {
  62. return _composite(t.content) + '%';
  63. },
  64. 'pseudoClass': function(t) {
  65. return ':' + _composite(t.content);
  66. },
  67. 'pseudoElement': function(t) {
  68. return '::' + _composite(t.content);
  69. },
  70. 'uri': function(t) {
  71. return 'url(' + _composite(t.content) + ')';
  72. }
  73. };
  74. return _t(tree);
  75. }