parse-sass.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. var path = require('path');
  2. var fs = require('fs');
  3. var Q = require('q');
  4. var sassdoc = require('sassdoc');
  5. module.exports = function parseSass () {
  6. return {
  7. $runBefore: ['rendering-docs'],
  8. $process: function (docs) {
  9. var folders = [];
  10. var docsByComponent = [];
  11. var promises = [];
  12. var returnPromise = Q.defer();
  13. // for each doc, check if new folder(component)
  14. // if yes, get styles promises
  15. docs.forEach( function(doc, index) {
  16. if (doc.fileInfo) {
  17. var folder = doc.fileInfo.filePath
  18. .split('/')
  19. .filter( function (item, index, self) {
  20. return index !== self.length - 1;
  21. })
  22. .join('/');
  23. if(folders.indexOf(folder) === -1) {
  24. folders.push(folder);
  25. docsByComponent.push([doc]);
  26. promises.push( getStyles(folder, docsByComponent.length - 1) );
  27. } else {
  28. docsByComponent[folders.indexOf(folder)].push(doc);
  29. }
  30. }
  31. });
  32. // when all promises are completed, add sass info
  33. Q.allSettled(promises).spread( function () {
  34. var folders = Array.prototype.map.bind(arguments)(function (item) {
  35. return item.value;
  36. });
  37. appendStyles(folders, docsByComponent);
  38. returnPromise.resolve(docs);
  39. }).catch( function (error) {
  40. console.log('SASS ERROR: ' + error);
  41. returnPromise.resolve(docs);
  42. });
  43. return returnPromise.promise;
  44. }
  45. }
  46. };
  47. function appendStyles(folders, docsByComponent) {
  48. folders.forEach( function (folder) {
  49. var styles = formatStyles(folder);
  50. if (styles.length) {
  51. docsByComponent[folder.index].forEach( function (doc) {
  52. doc.sassVariables = styles;
  53. });
  54. }
  55. });
  56. }
  57. function formatStyles (folder) {
  58. // container for holding styles by platform
  59. var concatenatedStyles = {};
  60. // extract styles
  61. folder.styles.filter( function (file) {
  62. return file.data && file.data.length;
  63. }).forEach( function (file) {
  64. var props = file.data.filter( function (item) {
  65. return item.property && item.property.length;
  66. }).map( function (item) {
  67. var property = item.property[0];
  68. return {
  69. name: item.context.name || '',
  70. default: item.context.value || '',
  71. description: property.description || '',
  72. };
  73. });
  74. if( concatenatedStyles[file.platform] ) {
  75. concatenatedStyles[file.platform] = concatenatedStyles[file.platform].concat(props);
  76. } else {
  77. concatenatedStyles[file.platform] = props;
  78. }
  79. });
  80. // place in Array
  81. var formattedStyles = [];
  82. ['base', 'ios', 'md', 'wp'].forEach( function (platform) {
  83. if ( concatenatedStyles[platform] ) {
  84. formattedStyles.push({
  85. platform: platform,
  86. props: concatenatedStyles[platform]
  87. });
  88. }
  89. });
  90. return formattedStyles;
  91. }
  92. function getStyles (folder, docIndex) {
  93. var returnPromise = Q.defer();
  94. // generate file names to check
  95. var extension = 'scss';
  96. var allFiles = fs.readdirSync(folder);
  97. var removeNonSass = function (filename) {
  98. return filename.split('.').pop() === extension;
  99. };
  100. var toFileObject = function (filename) {
  101. // determine platform
  102. var platform = filename.split('.')[1];
  103. if ( ['ios', 'md', 'wp'].indexOf(platform) === -1 ) {
  104. platform = 'base';
  105. }
  106. return {
  107. platform: platform,
  108. path: path.join(folder, filename)
  109. };
  110. };
  111. var files = allFiles.filter(removeNonSass).map(toFileObject);
  112. // for each file, fetch styles
  113. var promises = files.map( function (file) {
  114. return Q.promise( function (resolve, reject) {
  115. fs.access(file.path, function (err) {
  116. if (!err) {
  117. sassdoc.parse(file.path )
  118. .then( function (data) {
  119. resolve( { platform: file.platform, data: data });
  120. }).catch( function (error) {
  121. reject(error);
  122. });
  123. } else {
  124. // file doesn't exist
  125. resolve({ platform: file.platform, data: null });
  126. }
  127. });
  128. });
  129. });
  130. // when all promises are finished, return the results
  131. Q.allSettled(promises).then( function (results) {
  132. var styles = results.map( function (style) {
  133. return style.value;
  134. });
  135. returnPromise.resolve({ index: docIndex, styles: styles });
  136. }).catch( function (error) {
  137. returnPromise.reject(error);
  138. });
  139. return returnPromise.promise;
  140. }