summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAaron O'Mullan <aaron.omullan@friendco.de>2014-04-12 12:27:13 -0700
committerAaron O'Mullan <aaron.omullan@friendco.de>2014-04-12 12:27:13 -0700
commit555c0d63ee905f9a258cccf164b58b1e1e1bd950 (patch)
tree57e3b7e40c66ac973a7d50207ec0515fbb29f88b
parentfb05609e09c4d3bab0d86dedc8306ecc9358793e (diff)
downloadgitbook-555c0d63ee905f9a258cccf164b58b1e1e1bd950.zip
gitbook-555c0d63ee905f9a258cccf164b58b1e1e1bd950.tar.gz
gitbook-555c0d63ee905f9a258cccf164b58b1e1e1bd950.tar.bz2
Add gitbook init command, fixes #67
-rwxr-xr-xbin/gitbook.js9
-rw-r--r--lib/generate/fs.js5
-rw-r--r--lib/generate/init.js69
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;