summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/generate/config.js96
-rw-r--r--lib/generate/ebook/index.js13
-rw-r--r--lib/generate/index.js71
-rw-r--r--lib/generate/manifest.js72
-rw-r--r--lib/generate/site/index.js35
-rw-r--r--lib/parse/git.js56
-rw-r--r--lib/parse/index.js3
-rw-r--r--lib/parse/page.js10
8 files changed, 109 insertions, 247 deletions
diff --git a/lib/generate/config.js b/lib/generate/config.js
new file mode 100644
index 0000000..0b270a3
--- /dev/null
+++ b/lib/generate/config.js
@@ -0,0 +1,96 @@
+var _ = require('lodash');
+var path = require('path');
+
+// Default configuration for gitbook
+var CONFIG = {
+ // Folders to use for output
+ // Caution: it overrides the value from the command line
+ // It's not advised this option in the book.json
+ "output": null,
+
+ // Generator to use for building
+ // Caution: it overrides the value from the command line
+ // It's not advised this option in the book.json
+ "generator": "site",
+
+ // Configuration file to use
+ "configFile": "book",
+
+ // Book title and description (defaults are extracted from the README)
+ "title": null,
+ "description": null,
+
+ // For ebook format, the extension to use for generation (default is detected from output extension)
+ // "epub", "pdf", "mobi"
+ // Caution: it overrides the value from the command line
+ // It's not advised this option in the book.json
+ "extension": null,
+
+ // Plugins list, can contain "-name" for removing default plugins
+ "plugins": [],
+
+ // Global configuration for plugins
+ "pluginsConfig": {
+ "fontSettings": {
+ "theme": null, //"sepia", "night" or "white",
+ "family": "sans",// "serif" or "sans",
+ "size": 2 // 1 - 4
+ }
+ },
+
+ // Set another theme with your own layout
+ // It's recommended to use plugins or add more options for default theme, though
+ // See https://github.com/GitbookIO/gitbook/issues/209
+ "theme": path.resolve(__dirname, '../../theme'),
+
+ // Links in template (null: default, false: remove, string: new value)
+ "links": {
+ // Custom links at top of sidebar
+ "sidebar": {
+ //"Custom link name": "https://customlink.com"
+ },
+
+ // Sharing links
+ "sharing": {
+ "google": null,
+ "facebook": null,
+ "twitter": null,
+ "weibo": null,
+ "all": null
+ }
+ },
+
+
+ // Options for PDF generation
+ "pdf": {
+ // Add toc at the end of the file
+ "toc": true,
+
+ // Add page numbers to the bottom of every page
+ "pageNumbers": false,
+
+ // Font size for the file content
+ "fontSize": 12,
+
+ // Paper size for the pdf
+ // Choices are [u’a0’, u’a1’, u’a2’, u’a3’, u’a4’, u’a5’, u’a6’, u’b0’, u’b1’, u’b2’, u’b3’, u’b4’, u’b5’, u’b6’, u’legal’, u’letter’]
+ "paperSize": "a4",
+
+ // Margin (in pts)
+ // Note: 72 pts equals 1 inch
+ "margin": {
+ "right": 62,
+ "left": 62,
+ "top": 36,
+ "bottom": 36
+ }
+ }
+};
+
+module.exports = {
+ CONFIG: CONFIG,
+ defaults: function(options) {
+ return _.merge(options || {}, CONFIG, _.defaults);
+ }
+}
+
diff --git a/lib/generate/ebook/index.js b/lib/generate/ebook/index.js
index 6a9aa70..0e1cd4e 100644
--- a/lib/generate/ebook/index.js
+++ b/lib/generate/ebook/index.js
@@ -44,18 +44,7 @@ Generator.prototype.finish = function() {
};
if (format == "pdf") {
- var pdfOptions = _.defaults(that.options.pdf || {}, {
- "fontSize": 12,
- "toc": true,
- "pageNumbers": false,
- "paperSize": "a4",
- "margin": {
- "right": 62,
- "left": 62,
- "top": 36,
- "bottom": 36
- }
- });
+ var pdfOptions = that.options.pdf;
_.extend(_options, {
"--margin-left": String(pdfOptions.margin.left),
diff --git a/lib/generate/index.js b/lib/generate/index.js
index 53de646..c71e0a6 100644
--- a/lib/generate/index.js
+++ b/lib/generate/index.js
@@ -7,6 +7,7 @@ var swig = require('./template');
var fs = require("./fs");
var parse = require("../parse");
var Plugin = require("./plugin");
+var defaultConfig = require("./config");
var generators = {
"site": require("./site"),
@@ -25,7 +26,7 @@ var containsFiles = function(dir, files) {
.then(_.all);
};
-// TEst if generator exists
+// Test if generator exists
var checkGenerator = function(options) {
if (!generators[options.generator]) {
return Q.reject(new Error("Invalid generator (availables are: "+_.keys(generators).join(", ")+")"));
@@ -48,40 +49,7 @@ var loadGenerator = function(options) {
var generate = function(options) {
// Set defaults to options
- options = _.defaults(options || {}, {
- // Folders to use
- "input": null,
- "output": null,
-
- // Config file (relative to input)
- "configFile": "book",
-
- // Output generator
- "generator": "site",
-
- // Book title, keyword, description
- "title": null,
- "description": null,
-
- // Origin github repository id
- "github": null,
- "githubHost": 'https://github.com/',
-
- // Theming
- "theme": path.resolve(__dirname, '../../theme'),
-
- // Plugins
- "plugins": [],
- "pluginsConfig": {},
- "defaultsPlugins": [], // Default plugins that can't be set in book.json
-
- // Links
- "links": {
- "about": null,
- "issues": null,
- "contribue": null,
- }
- });
+ options = defaultConfig.defaults(options);
// Validate options
if (!options.input) {
@@ -96,7 +64,7 @@ var generate = function(options) {
try {
var _config = require(path.resolve(options.input, options.configFile));
- _.extend(options, _.omit(_config, 'input', 'configFile', 'defaultsPlugins'));
+ options = _.merge(options, _.omit(_config, 'input', 'configFile', 'defaultsPlugins'));
}
catch(err) {
// No config file: not a big deal
@@ -217,37 +185,6 @@ var generateBook = function(options) {
return fs.remove(options.output);
})
- // Get repo's URL
- .then(function() {
- // Git deactivated
- if(options.github === false) {
- options.github = null;
- return null;
- } else if(options.github) {
- // Git already specified in options
- options.github = (
- // Support URLs in "github" entry of book.json
- parse.git.githubID(options.github) ||
-
- // Fallback
- options.github
- );
- return;
- }
-
- // Try auto detecting
- return parse.git.url(options.input)
- .then(function(_url) {
- // Get ID of repo
- return parse.git.githubID(_url);
- }, function(err) {
- return null;
- })
- .then(function(repoId) {
- options.github = repoId;
- });
- })
-
.then(function() {
return fs.mkdirp(options.output);
})
diff --git a/lib/generate/manifest.js b/lib/generate/manifest.js
deleted file mode 100644
index 8bb826a..0000000
--- a/lib/generate/manifest.js
+++ /dev/null
@@ -1,72 +0,0 @@
-var _ = require('lodash');
-var path = require('path');
-var Q = require('q');
-
-var fs = require("./fs");
-
-var extsToIgnore = [".gz"]
-
-var Manifest = function() {
- this.revision = 0;
- this.clear(Date.now());
-};
-
-// Regenerate manifest
-Manifest.prototype.clear = function(revision) {
- if (revision) this.revision = revision;
- this.sections = {
- 'CACHE': {},
- 'NETWORK': {},
- 'FALLBACK': {}
- };
- return Q(this);
-};
-
-// Add a resource
-Manifest.prototype.add = function(category, resource, value) {
- if (_.isArray(resource)) {
- _.each(resource, function(subres) {
- this.add(category, subres, value);
- }, this);
- return;
- }
- this.sections[category][resource] = value;
-};
-
-// Add a directory in cache
-Manifest.prototype.addFolder = function(folder, root, except) {
- var that = this;
- root = root || "/";
-
- return fs.list(folder)
- .then(function(files) {
- _.each(
- // Ignore diretcories
- _.filter(files, function(file) {
- return file.substr(-1) != "/" && !_.contains(except, path.join(root, file)) && !_.contains(extsToIgnore, path.extname(file));
- }),
- function(file) {
- that.add("CACHE", path.join(root, file));
- }
- );
- })
-};
-
-// Get manifest content
-Manifest.prototype.dump = function() {
- var lines = [
- "CACHE MANIFEST",
- "# Revision "+this.revision
- ];
-
- _.each(this.sections, function(content, section) {
- if (_.size(content) == 0) return;
- lines.push("");
- lines.push(section+":");
- lines = lines.concat(_.keys(content));
- }, this);
-
- return Q(lines.join("\n"));
-};
-
-module.exports = Manifest;
diff --git a/lib/generate/site/index.js b/lib/generate/site/index.js
index 73765ae..6f29991 100644
--- a/lib/generate/site/index.js
+++ b/lib/generate/site/index.js
@@ -9,7 +9,6 @@ var parse = require("../../parse");
var BaseGenerator = require("../generator");
var links = require("../../utils/links");
var indexer = require('./search_indexer');
-var Manifest = require('../manifest');
@@ -21,10 +20,6 @@ var Generator = function() {
this.revision = Date.now();
this.indexer = indexer();
- this.manifest = new Manifest(Date.now());
- this.manifest.add("NETWORK", [
- '*'
- ]);
};
util.inherits(Generator, BaseGenerator);
@@ -144,8 +139,6 @@ Generator.prototype.convertFile = function(content, _input) {
return _callHook("page");
})
.then(function() {
- that.manifest.add("CACHE", _output);
-
return that._writeTemplate(that.template, {
progress: page.progress,
@@ -189,22 +182,12 @@ Generator.prototype.copyAssets = function() {
path.join(that.options.output, "gitbook")
)
- // Add to cache manifest
- .then(function() {
- return that.manifest.addFolder(path.join(that.options.output, "gitbook"), "gitbook");
- })
-
// Copy plugins assets
.then(function() {
return Q.all(
_.map(that.plugins.list, function(plugin) {
var pluginAssets = path.join(that.options.output, "gitbook/plugins/", plugin.name);
- return plugin.copyAssets(pluginAssets)
- .then(function(copiedStuff) {
- // Nothing was copied
- if(!copiedStuff) { return; }
- return that.manifest.addFolder(pluginAssets, "gitbook/plugins/"+plugin.name);
- });
+ return plugin.copyAssets(pluginAssets);
})
);
});
@@ -219,24 +202,10 @@ Generator.prototype.writeSearchIndex = function() {
};
-// Add cache manifest
-Generator.prototype.writeCacheManifest = function() {
- return fs.writeFile(
- path.join(this.options.output, 'manifest.appcache'),
- this.manifest.dump()
- );
-};
-
Generator.prototype.finish = function() {
- var deferred = this.copyAssets()
+ return this.copyAssets()
.then(this.copyCover)
.then(this.writeSearchIndex);
-
- if (this.options.cache !== false) {
- deferred = deferred.then(this.writeCacheManifest);
- }
-
- return deferred;
};
module.exports = Generator;
diff --git a/lib/parse/git.js b/lib/parse/git.js
deleted file mode 100644
index 18a7cd3..0000000
--- a/lib/parse/git.js
+++ /dev/null
@@ -1,56 +0,0 @@
-var Q = require('q');
-var _ = require('lodash');
-var cp = require('child_process');
-var url = require('url');
-
-// Get the remote of a given repo
-function gitURL(path) {
- var d = Q.defer();
-
- cp.exec("git config --get remote.origin.url", {
- cwd: path,
- env: process.env,
- }, function(err, stdout, stderr) {
- if(err) {
- return d.reject(err);
- }
-
- return d.resolve(stdout);
- });
-
- return d.promise
- .then(function(output) {
- return output.replace(/(\r\n|\n|\r)/gm, "");
- });
-}
-
-// Poorman's parsing
-// Parse a git URL to a github ID : username/reponame
-function githubID(_url) {
- // Remove .git if it's in _url
- var sliceEnd = _url.slice(-4) === '.git' ? -4 : undefined;
-
- // Detect HTTPS repos
- var parsed = url.parse(_url);
- if(parsed.protocol === 'https:' && parsed.host === 'github.com') {
- return parsed.path.slice(1, sliceEnd);
- }
-
- // Detect SSH repos
- if(_url.indexOf('git@') === 0) {
- return _url.split(':', 2)[1].slice(0, sliceEnd);
- }
-
- // None found
- return null;
-}
-
-function titleCase(str) {
- return str.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
-}
-
-module.exports = {
- url: gitURL,
- githubID: githubID,
- titleCase: titleCase
-};
diff --git a/lib/parse/index.js b/lib/parse/index.js
index bb7779f..0ebb03a 100644
--- a/lib/parse/index.js
+++ b/lib/parse/index.js
@@ -5,6 +5,5 @@ module.exports = {
lex: require('./lex'),
progress: require('./progress'),
navigation: require('./navigation'),
- readme: require('./readme'),
- git: require('./git')
+ readme: require('./readme')
};
diff --git a/lib/parse/page.js b/lib/parse/page.js
index 6ef4a6d..ae71666 100644
--- a/lib/parse/page.js
+++ b/lib/parse/page.js
@@ -82,7 +82,7 @@ function parsePage(src, options) {
return {
id: section.id,
type: section.type,
- content: render(nonCodeNodes),
+ content: render(nonCodeNodes, options),
lang: lang,
code: {
base: ci(codeNodes[0].text),
@@ -104,9 +104,9 @@ function parsePage(src, options) {
if (question && (((node.type === 'list_end' || node.type === 'blockquote_end') && i === quizNodes.length - 1)
|| node.type === 'table' || (node.type === 'paragraph' && !foundFeedback))) {
quiz.push({
- base: render(question.questionNodes),
- solution: render(question.solutionNodes),
- feedback: render(question.feedbackNodes)
+ base: render(question.questionNodes, options),
+ solution: render(question.solutionNodes, options),
+ feedback: render(question.feedbackNodes, options)
});
}
@@ -143,7 +143,7 @@ function parsePage(src, options) {
return {
id: section.id,
type: section.type,
- content: render(nonQuizNodes),
+ content: render(nonQuizNodes, options),
quiz: quiz
};
}