diff options
author | Aaron O'Mullan <aaron.omullan@friendco.de> | 2014-04-12 12:27:13 -0700 |
---|---|---|
committer | Aaron O'Mullan <aaron.omullan@friendco.de> | 2014-04-12 12:27:13 -0700 |
commit | 555c0d63ee905f9a258cccf164b58b1e1e1bd950 (patch) | |
tree | 57e3b7e40c66ac973a7d50207ec0515fbb29f88b | |
parent | fb05609e09c4d3bab0d86dedc8306ecc9358793e (diff) | |
download | gitbook-555c0d63ee905f9a258cccf164b58b1e1e1bd950.zip gitbook-555c0d63ee905f9a258cccf164b58b1e1e1bd950.tar.gz gitbook-555c0d63ee905f9a258cccf164b58b1e1e1bd950.tar.bz2 |
Add gitbook init command, fixes #67
-rwxr-xr-x | bin/gitbook.js | 9 | ||||
-rw-r--r-- | lib/generate/fs.js | 5 | ||||
-rw-r--r-- | lib/generate/init.js | 69 |
3 files changed, 83 insertions, 0 deletions
diff --git a/bin/gitbook.js b/bin/gitbook.js index d147c65..6cf2f1a 100755 --- a/bin/gitbook.js +++ b/bin/gitbook.js @@ -7,6 +7,7 @@ var prog = require('commander'); var pkg = require('../package.json'); var generators = require("../lib/generate").generators; +var initDir = require("../lib/generate/init"); var fs = require('../lib/generate/fs'); var utils = require('./utils'); @@ -82,6 +83,14 @@ buildCommand(prog) }); }); +prog +.command('init [source_dir]') +.description('Create files and folders based on contents of SUMMARY.md') +.action(function(dir) { + dir = dir || process.cwd(); + return initDir(dir); +}); + // Parse and fallback to help if no args if(_.isEmpty(prog.parse(process.argv).args) && process.argv.length === 2) { prog.help(); diff --git a/lib/generate/fs.js b/lib/generate/fs.js index e06976b..f5f74a5 100644 --- a/lib/generate/fs.js +++ b/lib/generate/fs.js @@ -51,4 +51,9 @@ module.exports = { copy: Q.denodeify(fsExtra.copy), remove: Q.denodeify(fsExtra.remove), symlink: Q.denodeify(fsExtra.symlink), + exists: function(path) { + var d = Q.defer(); + fs.exists(path, d.resolve); + return d.promise; + }, }; diff --git a/lib/generate/init.js b/lib/generate/init.js new file mode 100644 index 0000000..705e6e7 --- /dev/null +++ b/lib/generate/init.js @@ -0,0 +1,69 @@ +var Q = require('q'); +var _ = require('lodash'); + +var path = require('path'); + +var fs = require('./fs'); +var parse = require('../parse'); + + +// Extract paths out of a summary +function paths(summary) { + return _.reduce(summary.chapters, function(accu, chapter) { + return accu.concat( + _.filter([chapter.path].concat(_.pluck(chapter.articles, 'path'))) + ); + }, []); +} + +// Get the parent folders out of a group of files +function folders(files) { + return _.chain(files) + .map(function(file) { + return path.dirname(file); + }) + .uniq() + .value(); +} + +function initDir(dir) { + return fs.readFile(path.join(dir, 'SUMMARY.md'), 'utf8') + .then(function(src) { + // Parse summary + return parse.summary(src); + }) + .then(function(summary) { + // Extract paths from summary + return paths(summary); + }) + .then(function(paths) { + // Convert to absolute paths + return _.map(paths, function(file) { + return path.resolve(file); + }); + }) + .then(function(files) { + // Create folders + return Q.all(_.map(folders(files), function(folder) { + return fs.mkdirp(folder); + })) + .then(_.constant(files)); + }) + .then(function(files) { + // Create files that don't exist + return Q.all(_.map(files, function(file) { + return fs.exists(file) + .then(function(exists) { + if(exists) return; + return fs.writeFile(file, ''); + }); + })); + }) + .fail(function(err) { + console.error(err.stack); + }); +} + + +// Exports +module.exports = initDir; |