diff --git a/package.json b/package.json index 6676337c99..dd10591672 100644 --- a/package.json +++ b/package.json @@ -85,6 +85,7 @@ "node-libs-browser": "^0.5.2", "request": "2.53.0", "run-sequence": "^1.1.0", + "sassdoc": "^2.1.20", "semver": "^5.0.1", "serve-static": "^1.9.2", "source-map-support": "^0.2.10", diff --git a/scripts/docs/dgeni-config.js b/scripts/docs/dgeni-config.js index fb6b5570c8..c5e113cec0 100644 --- a/scripts/docs/dgeni-config.js +++ b/scripts/docs/dgeni-config.js @@ -25,6 +25,7 @@ module.exports = function(currentVersion, initialVersionBuild) { .processor(require('./processors/collect-inputs-outputs')) .processor(require('./processors/parse-returns-object')) .processor(require('./processors/parse-optional')) +.processor(require('./processors/parse-sass')) // for debugging docs // .processor(function test(){ @@ -165,7 +166,8 @@ module.exports = function(currentVersion, initialVersionBuild) { templateEngine.filters.push( require('./filters/capital'), require('./filters/code'), - require('./filters/dump') + require('./filters/dump'), + require('./filters/platform') ); templateFinder.templateFolders.unshift(path.resolve(__dirname, 'templates')); diff --git a/scripts/docs/filters/platform.js b/scripts/docs/filters/platform.js new file mode 100644 index 0000000000..d0e184cc6e --- /dev/null +++ b/scripts/docs/filters/platform.js @@ -0,0 +1,15 @@ +module.exports = { + name: 'platform', + process: function (str) { + switch (str) { + case 'ios': + return 'iOS' + case 'md': + return 'Material Design' + case 'wp': + return 'Windows Platform' + default: + return 'All' + } + } +}; diff --git a/scripts/docs/processors/parse-sass.js b/scripts/docs/processors/parse-sass.js new file mode 100644 index 0000000000..866956db29 --- /dev/null +++ b/scripts/docs/processors/parse-sass.js @@ -0,0 +1,143 @@ +var path = require('path'); +var fs = require('fs'); +var Q = require('q'); +var sassdoc = require('sassdoc'); + +module.exports = function parseSass () { + return { + $runBefore: ['rendering-docs'], + $process: function (docs) { + + var folders = []; + var docsByComponent = []; + var promises = []; + var returnPromise = Q.defer(); + + // for each doc, check if new folder(component) + // if yes, get styles promises + docs.forEach( function(doc, index) { + if (doc.fileInfo) { + var folder = doc.fileInfo.filePath + .split('/') + .filter( function (item, index, self) { + return index !== self.length - 1; + }) + .join('/'); + if(folders.indexOf(folder) === -1) { + folders.push(folder); + docsByComponent.push([doc]); + promises.push( getStyles(folder, docsByComponent.length - 1) ); + } else { + docsByComponent[folders.indexOf(folder)].push(doc); + } + } + }); + + // when all promises are completed, add sass info + Q.allSettled(promises).spread( function () { + var folders = Array.prototype.map.bind(arguments)(function (item) { + return item.value; + }); + appendStyles(folders, docsByComponent); + returnPromise.resolve(docs); + }).catch( function (error) { + console.log('Sass Error: ' + error); + returnPromise.resolve(docs); + }); + + return returnPromise.promise; + } + } +}; + +function appendStyles(folders, docsByComponent) { + folders.forEach( function (folder) { + + var styles = formatStyles(folder); + + if (styles.length) { + docsByComponent[folder.index].forEach( function (doc) { + doc.sassVariables = styles; + }); + } + }); +} + +function formatStyles (folder) { + + return folder.styles.filter( function (style) { + return style.data && style.data.length; + }).map( function (style) { + + var props = style.data.filter( function (item) { + return item.property && item.property.length; + }).map( function (item) { + + var property = item.property[0]; + + return { + name: item.context.name || '', + default: item.context.value || '', + description: property.description || '', + }; + }); + + return { platform: style.platform, props: props }; + }); +} + +function getStyles (folder, docIndex) { + + var returnPromise = Q.defer(); + + // get component name + var component = folder.split('/').pop(); + + // generate file names to check + var extension = 'scss'; + var files = []; + + files.push({ + platform: 'base', + path: path.join(folder, [component, extension].join('.')) + }); + + ['ios', 'md', 'wp'].forEach( function (platform) { + var fileName = [component, platform, extension].join('.'); + files.push({ + platform: platform, + path: path.join(folder, fileName) + }); + }); + + // for each file, fetch styles + var promises = files.map( function (file) { + return Q.promise( function (resolve, reject) { + fs.access(file.path, function (err) { + if (!err) { + sassdoc.parse(file.path ) + .then( function (data) { + resolve( { platform: file.platform, data: data }); + }).catch( function (error) { + reject(error); + }); + } else { + // file doesn't exist + resolve({ platform: file.platform, data: null }); + } + }); + }); + }); + + // when all promises are finished, return the results + Q.allSettled(promises).then( function (results) { + var styles = results.map( function (style) { + return style.value; + }); + returnPromise.resolve({ index: docIndex, styles: styles }); + }).catch( function (error) { + returnPromise.reject(error); + }); + + return returnPromise.promise; +} diff --git a/scripts/docs/templates/common.template.html b/scripts/docs/templates/common.template.html index 9499932d1f..18624ac28b 100644 --- a/scripts/docs/templates/common.template.html +++ b/scripts/docs/templates/common.template.html @@ -145,6 +145,52 @@ angular_controller: APIDemoCtrl <@ endif @> <$ typeList(fn.typeList) $> <$ fn.description | marked $> <@- endmacro -@> +<@- macro sassTable(files) -@> +
Property | +Default | +Description | +|
---|---|---|---|
<$ prop.name $> | + <@ if prop.default @> +<$ prop.default | code $> | + <@ else @> ++ + | + <@ endif @> +<$ prop.description | marked $> | +