diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/generate/fs.js | 10 | ||||
-rw-r--r-- | lib/generate/index.js | 93 | ||||
-rw-r--r-- | lib/generate/template.js | 53 | ||||
-rw-r--r-- | lib/index.js | 1 |
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/') }; |