prettyPrint.js 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. function renderProperty(fileObj, propertyObj) {
  2. var getPropertyValue = function(val) {
  3. if(val.indexOf('$') == 0) {
  4. return fileObj.getValue(val.replace('$', ''));
  5. }
  6. return val;
  7. };
  8. return propertyObj.name + ': ' + getPropertyValue(propertyObj.val) + ';';
  9. };
  10. function renderBlock(fileObj, blockObj, scope) {
  11. var selector = blockObj.selector,
  12. scopeIndent = (scope && scope.indent) || '',
  13. currentIndent = scopeIndent + ' ',
  14. paddedScopeSelector = (scope && scope.selector) ? scope.selector + ' ' : '',
  15. currentSelector = paddedScopeSelector + selector,
  16. selectors = blockObj.selectors,
  17. properties = blockObj.properties,
  18. blocks = blockObj.blocks,
  19. includes = blockObj.includes,
  20. css = scopeIndent + currentSelector;
  21. var expandIncludes = function(includeNames) {
  22. includeNames.forEach(function(includeName) {
  23. var mixin = fileObj.getMixin(includeName);
  24. //Why doesn't .concat() work?
  25. //properties.concat(mixin.properties);
  26. //blocks.concat(mixin.blocks);
  27. mixin.properties.forEach(function(property) {
  28. properties.push(property);
  29. });
  30. mixin.blocks.forEach(function(block) {
  31. blocks.push(block);
  32. });
  33. expandIncludes(mixin.includes);
  34. });
  35. };
  36. expandIncludes(includes);
  37. selectors.forEach(function(sel) {
  38. css += ',\n' + scopeIndent + paddedScopeSelector + sel;
  39. });
  40. css += ' {\n';
  41. properties.forEach(function(property) {
  42. css += currentIndent + renderProperty(fileObj, property) + '\n';
  43. });
  44. css += scopeIndent + '}\n';
  45. blocks.forEach(function(block) {
  46. css += renderBlock(fileObj, block, {
  47. indent: currentIndent,
  48. selector: currentSelector
  49. });
  50. });
  51. return css;
  52. };
  53. function renderFile(fileObj) {
  54. var blocks = fileObj.blocks,
  55. css = '';
  56. blocks.forEach(function(block) {
  57. css += renderBlock(fileObj, block);
  58. css += '\n';
  59. });
  60. return css;
  61. };
  62. function render(cssObj, callback) {
  63. var css;
  64. try {
  65. css = renderFile(cssObj);
  66. callback(null, css)
  67. }
  68. catch(ex) {
  69. callback(ex);
  70. }
  71. };
  72. module.exports.render = render;