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 | |
parent | 9a2b03b1835ca14239b61fb7b8610c782bb460e7 (diff) | |
download | gitbook-b549158483de1336b8b48a1ccbb5c87ea54e8b34.zip gitbook-b549158483de1336b8b48a1ccbb5c87ea54e8b34.tar.gz gitbook-b549158483de1336b8b48a1ccbb5c87ea54e8b34.tar.bz2 |
Parse navigation and progress in parsed page
-rw-r--r-- | lib/book.js | 8 | ||||
-rw-r--r-- | lib/generators/json.js | 5 | ||||
-rw-r--r-- | lib/utils/navigation.js | 64 | ||||
-rw-r--r-- | lib/utils/progress.js | 47 |
4 files changed, 123 insertions, 1 deletions
diff --git a/lib/book.js b/lib/book.js index b98c9f5..1236e5f 100644 --- a/lib/book.js +++ b/lib/book.js @@ -3,6 +3,9 @@ var _ = require("lodash"); var path = require("path"); var fs = require("./utils/fs"); +var parseNavigation = require("./utils/navigation"); +var parseProgress = require("./utils/progress"); + var Configuration = require("./configuration"); var TemplateEngine = require("./template"); var Plugin = require("./plugin"); @@ -302,6 +305,11 @@ Book.prototype.parsePage = function(filename) { return that.template.renderFile(filename) .then(function(content) { return filetype.parser.page(content); + }) + .then(function(page) { + page.navigation = parseNavigation(that.summary, that.files); + page.progress = parseProgress(page.navigation, filename); + return page; }); }; diff --git a/lib/generators/json.js b/lib/generators/json.js index 6dc468e..2e8c731 100644 --- a/lib/generators/json.js +++ b/lib/generators/json.js @@ -20,7 +20,7 @@ Generator.prototype.finish = function() { }; Generator.prototype.writeParsedFile = function(page, input) { var that = this; var json = { - progress: [], + progress: page.progress, sections: page.sections }; @@ -45,16 +45,19 @@ Generator.prototype.langsIndex = function(langs) { return Q() .then(function() { + // Read readme from main language return fs.readFile( path.join(that.options.output, mainLang, readme) ); }) .then(function(content) { + // Extend it with infos about the languages var json = JSON.parse(content); _.extend(json, { langs: langs }); + // Write it as README.json return fs.writeFile( path.join(that.options.output, "README.json"), JSON.stringify(json, null, 4) 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; |