diff options
Diffstat (limited to 'docs/config/processors/pages-data.js')
| -rw-r--r-- | docs/config/processors/pages-data.js | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/docs/config/processors/pages-data.js b/docs/config/processors/pages-data.js new file mode 100644 index 00000000..47896db5 --- /dev/null +++ b/docs/config/processors/pages-data.js @@ -0,0 +1,200 @@ +var _ = require('lodash'); +var path = require('canonical-path'); +var log = require('winston'); + +var AREA_NAMES = { + api: 'API', + guide: 'Developer Guide', + misc: 'Miscellaneous', + tutorial: 'Tutorial', + error: 'Error Reference' +}; + +function getNavGroup(navGroupPages, groupName, pageSorter, pageMapper) { + + var navItems = _(navGroupPages) + .sortBy(pageSorter) + .map(pageMapper) + .value(); + + return { + name: groupName, + type: 'group', + navItems: navItems + }; +} + + +var navGroupMappers = { + api: function(areaPages, areaName) { + var navGroups = _(areaPages) + .filter('module') // We are not interested in docs that are not in a module + + .groupBy('module') + + .map(function(modulePages, moduleName) { + console.log('moduleName', moduleName); + var navItems = []; + var modulePage; + + _(modulePages) + + .groupBy('docType') + + .tap(function(docTypes) { + console.log(_.keys(docTypes)); + // Extract the module page from the collection + modulePage = docTypes.module[0]; + delete docTypes.module; + }) + + .forEach(function(sectionPages, sectionName) { + + if ( sectionPages.length > 0 ) { + // Push a navItem for this section + navItems.push({ + name: sectionName, + type: 'section', + href: path.dirname(sectionPages[0].path) + }); + + // Push the rest of the sectionPages for this section + _.forEach(sectionPages, function(sectionPage) { + + navItems.push({ + name: sectionPage.name, + href: sectionPage.path, + type: sectionPage.docType + }); + + }); + } + }); + return { + name: moduleName, + href: modulePage.path, + type: 'group', + navItems: navItems + }; + }) + .value(); + return navGroups; + }, + tutorial: function(pages, areaName) { + return [getNavGroup(pages, areaName, 'step', function(page) { + return { + name: page.name, + step: page.step, + href: page.path, + type: 'tutorial' + }; + })]; + }, + error: function(pages, areaName) { + return [getNavGroup(pages, areaName, 'path', function(page) { + return { + name: page.name, + href: page.path, + type: 'error' + }; + })]; + }, + pages: function(pages, areaName) { + return [getNavGroup(pages, areaName, 'path', function(page) { + return { + name: page.name, + href: page.path, + type: 'page' + }; + })]; + } +}; + +var outputFolder; + +module.exports = { + name: 'pages-data', + description: 'This plugin will create a new doc that will be rendered as an angularjs module ' + + 'which will contain meta information about the pages and navigation', + runAfter: ['adding-extra-docs', 'component-groups-generate'], + runBefore: ['extra-docs-added'], + init: function(config) { + outputFolder = config.rendering.outputFolder; + }, + process: function(docs) { + + _(docs) + .filter(function(doc) { return doc.area === 'api'; }) + .filter(function(doc) { return doc.docType === 'module'; }) + .map(function(doc) { return _.pick(doc, ['id', 'module', 'docType', 'area']); }) + .tap(function(docs) { + console.log(docs); + }); + + + // We are only interested in docs that are in a area and not landing pages + var navPages = _.filter(docs, function(page) { + return page.area && page.docType != 'landingPage'; + }); + + // Generate an object collection of pages that is grouped by area e.g. + // - area "api" + // - group "ng" + // - section "directive" + // - ngApp + // - ngBind + // - section "global" + // - angular.element + // - angular.bootstrap + // - section "service" + // - $compile + // - group "ngRoute" + // - section "directive" + // - ngView + // - section "service" + // - $route + // + var areas = {}; + _(navPages) + .groupBy('area') + .forEach(function(pages, areaName) { + var navGroupMapper = navGroupMappers[areaName] || navGroupMappers['pages']; + var areaTitle = AREA_NAMES[areaName]; + + areas[areaName] = { + id: areaName, + name: areaTitle, + navGroups: navGroupMapper(pages, areaTitle) + }; + }); + + _.forEach(docs, function(doc) { + if ( !doc.path ) { + log.warn('Missing path property for ', doc.id); + } + }); + + // Extract a list of basic page information for mapping paths to paritals and for client side searching + var pages = _(docs) + .map(function(doc) { + var page = _.pick(doc, [ + 'docType', 'id', 'name', 'area', 'outputPath', 'path', 'searchTerms' + ]); + return page; + }) + .indexBy('path') + .value(); + + + var docData = { + docType: 'pages-data', + id: 'pages-data', + template: 'pages-data.template.js', + outputPath: 'js/pages-data.js', + + areas: areas, + pages: pages + }; + docs.push(docData); + } +}; |
