mirror of
https://github.com/GitbookIO/gitbook.git
synced 2026-09-12 05:48:57 +00:00
216 lines
7.0 KiB
JavaScript
216 lines
7.0 KiB
JavaScript
/* eslint no-console: 0 */
|
|
|
|
var Q = require('q');
|
|
var _ = require('lodash');
|
|
var path = require('path');
|
|
var tinylr = require('tiny-lr');
|
|
var color = require('bash-color');
|
|
|
|
var Book = require('./book');
|
|
var initBook = require('./init');
|
|
var Server = require('./utils/server');
|
|
var stringUtils = require('./utils/string');
|
|
var watch = require('./utils/watch');
|
|
var logger = require('./utils/logger');
|
|
|
|
var LOG_OPTION = {
|
|
name: 'log',
|
|
description: 'Minimum log level to display',
|
|
values: _.chain(logger.LEVELS).keys().map(stringUtils.toLowerCase).value(),
|
|
defaults: 'info'
|
|
};
|
|
|
|
var FORMAT_OPTION = {
|
|
name: 'format',
|
|
description: 'Format to build to',
|
|
values: ['website', 'json', 'ebook'],
|
|
defaults: 'website'
|
|
};
|
|
|
|
// Export init to gitbook library
|
|
Book.init = initBook;
|
|
|
|
module.exports = {
|
|
Book: Book,
|
|
LOG_LEVELS: logger.LEVELS,
|
|
|
|
commands: _.flatten([
|
|
{
|
|
name: 'build [book] [output]',
|
|
description: 'build a book',
|
|
options: [
|
|
FORMAT_OPTION,
|
|
LOG_OPTION
|
|
],
|
|
exec: function(args, kwargs) {
|
|
var input = args[0] || process.cwd();
|
|
var output = args[1] || path.join(input, '_book');
|
|
|
|
var book = new Book(input, _.extend({}, {
|
|
'config': {
|
|
'output': output
|
|
},
|
|
'logLevel': kwargs.log
|
|
}));
|
|
|
|
return book.parse()
|
|
.then(function() {
|
|
return book.generate(kwargs.format);
|
|
})
|
|
.then(function(){
|
|
console.log('');
|
|
console.log(color.green('Done, without error'));
|
|
});
|
|
}
|
|
},
|
|
|
|
_.map(['pdf', 'epub', 'mobi'], function(ebookType) {
|
|
return {
|
|
name: ebookType+' [book] [output]',
|
|
description: 'build a book to '+ebookType,
|
|
options: [
|
|
LOG_OPTION
|
|
],
|
|
exec: function(args, kwargs) {
|
|
var input = args[0] || process.cwd();
|
|
var output = args[1];
|
|
|
|
var book = new Book(input, _.extend({}, {
|
|
'logLevel': kwargs.log
|
|
}));
|
|
|
|
return book.parse()
|
|
.then(function() {
|
|
return book.generateFile(output, {
|
|
ebookFormat: ebookType
|
|
});
|
|
})
|
|
.then(function(){
|
|
console.log('');
|
|
console.log(color.green('Done, without error'));
|
|
});
|
|
}
|
|
};
|
|
}),
|
|
|
|
{
|
|
name: 'serve [book]',
|
|
description: 'Build then serve a gitbook from a directory',
|
|
options: [
|
|
{
|
|
name: 'port',
|
|
description: 'Port for server to listen on',
|
|
defaults: 4000
|
|
},
|
|
{
|
|
name: 'lrport',
|
|
description: 'Port for livereload server to listen on',
|
|
defaults: 35729
|
|
},
|
|
{
|
|
name: 'watch',
|
|
description: 'Enable/disable file watcher',
|
|
defaults: true
|
|
},
|
|
FORMAT_OPTION,
|
|
LOG_OPTION
|
|
],
|
|
exec: function(args, kwargs) {
|
|
var input = args[0] || process.cwd();
|
|
var server = new Server();
|
|
|
|
// Init livereload server
|
|
var lrServer = tinylr({});
|
|
var lrPath;
|
|
|
|
var generate = function() {
|
|
if (server.isRunning()) console.log('Stopping server');
|
|
|
|
return server.stop()
|
|
.then(function() {
|
|
var book = new Book(input, _.extend({}, {
|
|
'config': {
|
|
'defaultsPlugins': ['livereload']
|
|
},
|
|
'logLevel': kwargs.log
|
|
}));
|
|
|
|
return book.parse()
|
|
.then(function() {
|
|
return book.generate(kwargs.format);
|
|
})
|
|
.thenResolve(book);
|
|
})
|
|
.then(function(book) {
|
|
console.log();
|
|
console.log('Starting server ...');
|
|
return server.start(book.options.output, kwargs.port)
|
|
.then(function() {
|
|
console.log('Serving book on http://localhost:'+kwargs.port);
|
|
|
|
if (lrPath) {
|
|
// trigger livereload
|
|
lrServer.changed({
|
|
body: {
|
|
files: [lrPath]
|
|
}
|
|
});
|
|
}
|
|
|
|
if (!kwargs.watch) return;
|
|
|
|
return watch(book.root)
|
|
.then(function(filepath) {
|
|
// set livereload path
|
|
lrPath = filepath;
|
|
console.log('Restart after change in file', filepath);
|
|
console.log('');
|
|
return generate();
|
|
});
|
|
});
|
|
});
|
|
};
|
|
|
|
return Q.nfcall(lrServer.listen.bind(lrServer), kwargs.lrport)
|
|
.then(function() {
|
|
console.log('Live reload server started on port:', kwargs.lrport);
|
|
console.log('Press CTRL+C to quit ...');
|
|
console.log('');
|
|
return generate();
|
|
});
|
|
}
|
|
},
|
|
|
|
{
|
|
name: 'install [book]',
|
|
description: 'install plugins dependencies',
|
|
exec: function(args) {
|
|
var input = args[0] || process.cwd();
|
|
|
|
var book = new Book(input);
|
|
|
|
return book.config.load()
|
|
.then(function() {
|
|
return book.plugins.install();
|
|
})
|
|
.then(function(){
|
|
console.log('');
|
|
console.log(color.green('Done, without error'));
|
|
});
|
|
}
|
|
},
|
|
|
|
{
|
|
name: 'init [directory]',
|
|
description: 'create files and folders based on contents of SUMMARY.md',
|
|
exec: function(args) {
|
|
return initBook(args[0] || process.cwd())
|
|
.then(function(){
|
|
console.log('');
|
|
console.log(color.green('Done, without error'));
|
|
});
|
|
}
|
|
}
|
|
])
|
|
};
|