aboutsummaryrefslogtreecommitdiffstats
path: root/docs/config/processors
diff options
context:
space:
mode:
Diffstat (limited to 'docs/config/processors')
-rw-r--r--docs/config/processors/index-page.js42
-rw-r--r--docs/config/processors/keywords.js91
-rw-r--r--docs/config/processors/pages-data.js200
-rw-r--r--docs/config/processors/versions-data.js42
4 files changed, 375 insertions, 0 deletions
diff --git a/docs/config/processors/index-page.js b/docs/config/processors/index-page.js
new file mode 100644
index 00000000..3ba1ac73
--- /dev/null
+++ b/docs/config/processors/index-page.js
@@ -0,0 +1,42 @@
+var _ = require('lodash');
+var log = require('winston');
+var path = require('canonical-path');
+var deployment;
+
+module.exports = {
+ name: 'index-page',
+ runAfter: ['adding-extra-docs'],
+ runBefore: ['extra-docs-added'],
+ description: 'This processor creates docs that will be rendered as the index page for the app',
+ init: function(config) {
+ deployment = config.deployment;
+ if ( !deployment || !deployment.environments ) {
+ throw new Errro('No deployment environments found in the config.');
+ }
+ },
+ process: function(docs) {
+
+ // Collect up all the areas in the docs
+ var areas = {};
+ _.forEach(docs, function(doc) {
+ if ( doc.area ) {
+ areas[doc.area] = doc.area;
+ }
+ });
+ areas = _.keys(areas);
+
+ _.forEach(deployment.environments, function(environment) {
+
+ var indexDoc = _.defaults({
+ docType: 'indexPage',
+ areas: areas
+ }, environment);
+
+ indexDoc.id = 'index' + (environment.name === 'default' ? '' : '-' + environment.name);
+ // Use .. to put it at the root of the build
+ indexDoc.outputPath = indexDoc.id + '.html';
+
+ docs.push(indexDoc);
+ });
+ }
+}; \ No newline at end of file
diff --git a/docs/config/processors/keywords.js b/docs/config/processors/keywords.js
new file mode 100644
index 00000000..6f7e9c21
--- /dev/null
+++ b/docs/config/processors/keywords.js
@@ -0,0 +1,91 @@
+var _ = require('lodash');
+var log = require('winston');
+var fs = require('fs');
+var path = require('canonical-path');
+
+// Keywords to ignore
+var wordsToIgnore = [];
+var propertiesToIgnore;
+var areasToSearch;
+
+// Keywords start with "ng:" or one of $, _ or a letter
+var KEYWORD_REGEX = /^((ng:|[\$_a-z])[\w\-_]+)/;
+
+module.exports = {
+ name: 'keywords',
+ runAfter: ['docs-processed'],
+ runBefore: ['adding-extra-docs'],
+ description: 'This processor extracts all the keywords from the document',
+ init: function(config) {
+
+ // Load up the keywords to ignore, if specified in the config
+ if ( config.processing.search && config.processing.search.ignoreWordsFile ) {
+
+ var ignoreWordsPath = path.resolve(config.basePath, config.processing.search.ignoreWordsFile);
+ wordsToIgnore = fs.readFileSync(ignoreWordsPath, 'utf8').toString().split(/[,\s\n\r]+/gm);
+
+ log.debug('Loaded ignore words from "' + ignoreWordsPath + '"');
+ log.silly(wordsToIgnore);
+
+ }
+
+ areasToSearch = _.indexBy(config.get('processing.search.areasToSearch', ['api', 'guide', 'misc', 'error', 'tutorial']));
+
+ propertiesToIgnore = _.indexBy(config.get('processing.search.propertiesToIgnore', []));
+ log.debug('Properties to ignore', propertiesToIgnore);
+
+ },
+ process: function(docs) {
+
+ var ignoreWordsMap = _.indexBy(wordsToIgnore);
+
+ // If the title contains a name starting with ng, e.g. "ngController", then add the module name
+ // without the ng to the title text, e.g. "controller".
+ function extractTitleWords(title) {
+ var match = /ng([A-Z]\w*)/.exec(title);
+ if ( match ) {
+ title = title + ' ' + match[1].toLowerCase();
+ }
+ return title;
+ }
+
+ function extractWords(text, words, keywordMap) {
+
+ var tokens = text.toLowerCase().split(/[\.\s,`'"#]+/mg);
+ _.forEach(tokens, function(token){
+ var match = token.match(KEYWORD_REGEX);
+ if (match){
+ key = match[1];
+ if ( !keywordMap[key]) {
+ keywordMap[key] = true;
+ words.push(key);
+ }
+ }
+ });
+ }
+
+
+ // We are only interested in docs that live in the right area
+ docs = _.filter(docs, function(doc) { return areasToSearch[doc.area]; });
+
+ _.forEach(docs, function(doc) {
+
+ var words = [];
+ var keywordMap = _.clone(ignoreWordsMap);
+
+ // Search each top level property of the document for search terms
+ _.forEach(doc, function(value, key) {
+ if ( _.isString(value) && !propertiesToIgnore[key] ) {
+ extractWords(value, words, keywordMap);
+ }
+ });
+
+ doc.searchTerms = {
+ titleWords: extractTitleWords(doc.name),
+ keywords: _.sortBy(words).join(' ')
+ };
+
+ });
+
+ }
+}; \ No newline at end of file
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);
+ }
+};
diff --git a/docs/config/processors/versions-data.js b/docs/config/processors/versions-data.js
new file mode 100644
index 00000000..eb158e79
--- /dev/null
+++ b/docs/config/processors/versions-data.js
@@ -0,0 +1,42 @@
+var _ = require('lodash');
+
+var version;
+var versions;
+
+module.exports = {
+ name: 'versions-data',
+ description: 'This plugin will create a new doc that will be rendered as an angularjs module ' +
+ 'which will contain meta information about the versions of angular',
+ runAfter: ['adding-extra-docs', 'pages-data'],
+ runBefore: ['extra-docs-added'],
+ init: function(config) {
+ version = config.source.currentVersion;
+ versions = config.source.previousVersions;
+
+ if ( !version ) {
+ throw new Error('Invalid configuration. Please provide a valid `source.currentVersion` property');
+ }
+ if ( !versions ) {
+ throw new Error('Invalid configuration. Please provide a valid `source.previousVersions` property');
+ }
+ },
+ process: function(docs) {
+
+ var versionDoc = {
+ docType: 'versions-data',
+ id: 'versions-data',
+ template: 'versions-data.template.js',
+ outputPath: 'js/versions-data.js',
+ };
+
+ versionDoc.currentVersion = version;
+
+ versionDoc.versions = _(versions)
+ .filter(function(version) { return version.major > 0; })
+ .push(version)
+ .reverse()
+ .value();
+
+ docs.push(versionDoc);
+ }
+}; \ No newline at end of file