diff options
author | Samy Pessé <samypesse@gmail.com> | 2015-01-19 20:54:59 +0100 |
---|---|---|
committer | Samy Pessé <samypesse@gmail.com> | 2015-01-19 20:54:59 +0100 |
commit | b549158483de1336b8b48a1ccbb5c87ea54e8b34 (patch) | |
tree | cd80478f807b30923bd7cf9008d3073ba7f070a8 /lib/utils | |
parent | 9a2b03b1835ca14239b61fb7b8610c782bb460e7 (diff) | |
download | gitbook-b549158483de1336b8b48a1ccbb5c87ea54e8b34.zip gitbook-b549158483de1336b8b48a1ccbb5c87ea54e8b34.tar.gz gitbook-b549158483de1336b8b48a1ccbb5c87ea54e8b34.tar.bz2 |
Parse navigation and progress in parsed page
Diffstat (limited to 'lib/utils')
-rw-r--r-- | lib/utils/navigation.js | 64 | ||||
-rw-r--r-- | lib/utils/progress.js | 47 |
2 files changed, 111 insertions, 0 deletions
diff --git a/lib/utils/navigation.js b/lib/utils/navigation.js new file mode 100644 index 0000000..ae4eb9d --- /dev/null +++ b/lib/utils/navigation.js @@ -0,0 +1,64 @@ +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 ndeeded etc ... + var navNodes = flattenChapters(summary.chapters); + var prevNodes = [null].concat(navNodes.slice(0, -1)); + var nextNodes = navNodes.slice(1).concat([null]); + + // Mapping of prev/next for a give path + var mapping = _.chain(_.zip(navNodes, prevNodes, nextNodes)) + .map(function(nodes) { + var current = nodes[0], prev = nodes[1], next = nodes[2]; + + // Skip if no path + if(!current.path) return null; + + return [current.path, { + title: current.title, + prev: prev, + next: next, + level: current.level, + }]; + }) + .filter() + .object() + .value(); + + // Filter for only files we want + if(files) { + return _.pick(mapping, files); + } + + return mapping; +} + + +// Exports +module.exports = navigation; diff --git a/lib/utils/progress.js b/lib/utils/progress.js new file mode 100644 index 0000000..b66aea9 --- /dev/null +++ b/lib/utils/progress.js @@ -0,0 +1,47 @@ +var _ = require("lodash"); + +// Returns from a navigation and a current file, a snapshot of current detailed state +var calculProgress = function(navigation, current) { + var n = _.size(navigation); + var percent = 0, prevPercent = 0, currentChapter = null; + var done = true; + + var chapters = _.chain(navigation) + .map(function(nav, path) { + nav.path = path; + return nav; + }) + .map(function(nav, i) { + // Calcul percent + nav.percent = (i * 100) / Math.max((n - 1), 1); + + // Is it done + nav.done = done; + if (nav.path == current) { + currentChapter = nav; + percent = nav.percent; + done = false; + } else if (done) { + prevPercent = nav.percent; + } + + return nav; + }) + .value(); + + return { + // Previous percent + prevPercent: prevPercent, + + // Current percent + percent: percent, + + // List of chapter with progress + chapters: chapters, + + // Current chapter + current: currentChapter + }; +} + +module.exports = calculProgress; |