diff options
Diffstat (limited to 'lib/utils/navigation.js')
-rw-r--r-- | lib/utils/navigation.js | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/lib/utils/navigation.js b/lib/utils/navigation.js new file mode 100644 index 0000000..21666ad --- /dev/null +++ b/lib/utils/navigation.js @@ -0,0 +1,80 @@ +var _ = require('lodash'); + +// Cleans up an article/chapter object +// remove 'articles' attributes +function clean(obj) { + return obj && _.omit(obj, ['articles']); +} + +function flattenChapters(chapters) { + return _.reduce(chapters, function(accu, chapter) { + return accu.concat([clean(chapter)].concat(flattenChapters(chapter.articles))); + }, []); +} + +// Returns from a summary a map of +/* + { + "file/path.md": { + prev: ..., + next: ..., + }, + ... + } +*/ +function navigation(summary, files) { + // Support single files as well as list + files = _.isArray(files) ? files : (_.isString(files) ? [files] : null); + + // List of all navNodes + // Flatten chapters, then add in default README node if needed etc ... + var navNodes = flattenChapters(summary.chapters); + + // Mapping of prev/next for a give path + var mapping = _.chain(navNodes) + .map(function(current, i) { + var prev = null, next = null; + + // Skip if no path + if(!current.path) return null; + + // Find prev + prev = _.chain(navNodes) + .slice(0, i) + .reverse() + .find(function(node) { + return node.exists && !node.external; + }) + .value(); + + // Find next + next = _.chain(navNodes) + .slice(i+1) + .find(function(node) { + return node.exists && !node.external; + }) + .value(); + + + return [current.path, { + title: current.title, + prev: prev, + next: next, + level: current.level, + }]; + }) + .compact() + .object() + .value(); + + // Filter for only files we want + if(files) { + return _.pick(mapping, files); + } + + return mapping; +} + + +// Exports +module.exports = navigation; |