summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/generate/fs.js10
-rw-r--r--lib/generate/index.js93
-rw-r--r--lib/generate/template.js53
-rw-r--r--lib/index.js1
4 files changed, 157 insertions, 0 deletions
diff --git a/lib/generate/fs.js b/lib/generate/fs.js
new file mode 100644
index 0000000..df39bb8
--- /dev/null
+++ b/lib/generate/fs.js
@@ -0,0 +1,10 @@
+var Q = require("q");
+var fs = require("fs");
+var fsExtra = require("fs-extra");
+
+module.exports = {
+ readFile: Q.denodeify(fs.readFile),
+ writeFile: Q.denodeify(fs.writeFile),
+ mkdirp: Q.denodeify(fsExtra.mkdirp),
+ copy: Q.denodeify(fsExtra.copy)
+} \ No newline at end of file
diff --git a/lib/generate/index.js b/lib/generate/index.js
new file mode 100644
index 0000000..fff3ca9
--- /dev/null
+++ b/lib/generate/index.js
@@ -0,0 +1,93 @@
+var Q = require("q");
+var _ = require("lodash");
+var path = require("path");
+var glob = require("glob");
+var fs = require("./fs");
+var parse = require("../parse");
+var template = require("./template");
+
+var generate = function(root, output, options) {
+ var files, summary, tpl;
+
+ options = _.defaults(options || {}, {
+ // Book title
+ title: null,
+
+ // Origin github repository id
+ github: null
+ });
+
+ if (!options.github) return Q.reject(new Error("Need options.github for specifing the github origin"));
+
+ // List all files in the repository
+ return Q.nfcall(glob, "**/*", {
+ cwd: root,
+ mark: true
+ })
+
+ // Check repository is valid
+ .then(function(_files) {
+ files = _files;
+
+ if (!_.contains(files, "SUMMARY.md") || !_.contains(files, "README.md")) {
+ return Q.reject(new Error("Invalid gitbook repository, need SUMMARY.md and README.md"));
+ }
+ })
+
+ // Get summary
+ .then(function() {
+ return fs.readFile(path.join(root, "SUMMARY.md"), "utf-8")
+ .then(function(_summary) {
+ summary = parse.summary(_summary);
+ });
+ })
+
+ // Create template
+ .then(function() {
+ tpl = template({
+ root: root,
+ output: output,
+ locals: {
+ githubId: options.github,
+ title: options.title,
+ summary: summary
+ }
+ })
+ })
+
+ // Copy file and replace markdown file
+ .then(function() {
+ console.log(files, summary);
+ return Q.all(
+ _.chain(files)
+ .map(function(file) {
+ if (!file) return;
+
+ // Folder
+ if (file[file.length -1] == "/") {
+ return fs.mkdirp(
+ path.join(output, file)
+ );
+ }
+
+ // Markdown file
+ else if (path.extname(file) == ".md") {
+ return tpl(file, file.replace(".md", ".html"));
+ }
+
+ // Copy file
+ else {
+ return fs.copy(
+ path.join(root, file),
+ path.join(output, file)
+ );
+ }
+ })
+ .value()
+ )
+ })
+};
+
+module.exports = {
+ folder: generate
+} \ No newline at end of file
diff --git a/lib/generate/template.js b/lib/generate/template.js
new file mode 100644
index 0000000..8f63190
--- /dev/null
+++ b/lib/generate/template.js
@@ -0,0 +1,53 @@
+var swig = require('swig');
+var path = require('path');
+var _ = require("lodash");
+
+var parse = require("../parse");
+
+var fs = require('./fs');
+
+// return a templeter for page
+var initTemplate = function(options) {
+ var tpl = swig.compileFile(path.resolve(__dirname, '../../templates/page.html'));
+
+ options = _.defaults(options || {}, {
+ // Base folder for input
+ root: "./",
+
+ // Base folder for output
+ output: "./",
+
+ // Locals for templates
+ locals: {}
+ });
+
+ return function(input, output, local) {
+ input = path.join(options.root, input);
+ output = path.join(options.output, output);
+
+ // Read markdown file
+ return fs.readFile(input, "utf-8")
+
+ // Parse sections
+ .then(function(markdown) {
+ return parse.page(markdown);
+ })
+
+ //Calcul template
+ .then(function(sections) {
+ return tpl(
+ _.extend(local || {}, options.locals, {
+ _input: input,
+ content: sections
+ })
+ );
+ })
+
+ // Write html
+ .then(function(html) {
+ return fs.writeFile(output, html);
+ })
+ }
+};
+
+module.exports = initTemplate; \ No newline at end of file
diff --git a/lib/index.js b/lib/index.js
index 8278529..ba240ce 100644
--- a/lib/index.js
+++ b/lib/index.js
@@ -1,4 +1,5 @@
module.exports = {
parse: require('./parse/'),
+ generate: require('./generate/')
};