mirror of
https://github.com/GitbookIO/gitbook.git
synced 2026-09-16 15:45:13 +00:00
80 lines
1.8 KiB
JavaScript
80 lines
1.8 KiB
JavaScript
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
|
|
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.exists) 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, {
|
|
index: i,
|
|
title: current.title,
|
|
introduction: current.introduction,
|
|
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;
|