summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamy Pessé <samypesse@gmail.com>2015-01-19 20:54:59 +0100
committerSamy Pessé <samypesse@gmail.com>2015-01-19 20:54:59 +0100
commitb549158483de1336b8b48a1ccbb5c87ea54e8b34 (patch)
treecd80478f807b30923bd7cf9008d3073ba7f070a8
parent9a2b03b1835ca14239b61fb7b8610c782bb460e7 (diff)
downloadgitbook-b549158483de1336b8b48a1ccbb5c87ea54e8b34.zip
gitbook-b549158483de1336b8b48a1ccbb5c87ea54e8b34.tar.gz
gitbook-b549158483de1336b8b48a1ccbb5c87ea54e8b34.tar.bz2
Parse navigation and progress in parsed page
-rw-r--r--lib/book.js8
-rw-r--r--lib/generators/json.js5
-rw-r--r--lib/utils/navigation.js64
-rw-r--r--lib/utils/progress.js47
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;