aboutsummaryrefslogtreecommitdiffstats
path: root/docs/config/processors/pages-data.js
diff options
context:
space:
mode:
Diffstat (limited to 'docs/config/processors/pages-data.js')
-rw-r--r--docs/config/processors/pages-data.js200
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);
+ }
+};