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); +  } +}; | 
