Skip to content

Commit

Permalink
1. 使用commander 进行命令行操作.
Browse files Browse the repository at this point in the history
2. 帮助用语使用英文
  • Loading branch information
youxiachai committed Jul 12, 2014
1 parent 9da4231 commit b2ee280
Show file tree
Hide file tree
Showing 3 changed files with 172 additions and 210 deletions.
153 changes: 114 additions & 39 deletions bin/nodeppt
Original file line number Diff line number Diff line change
Expand Up @@ -2,46 +2,121 @@

var fs = require('fs');
var path = require('path');
var join = path.join;


var root = join(__dirname, '../');
var nodePPT = require(join(root, './lib/nodePPT'));


var opts = {
'-v': '--version',
'-p': '--port',
'-d': '--dir',
'-f': '--file',
'-o': '--output',
'-a': '--all',
'-h': '--help',
'-H': '--host',
'-c': '--controller'
};

var argv = parseArgs(process.argv);

var command = argv.slice(2, 3).toString();

if (typeof nodePPT[command] === 'function') {
nodePPT.cwd = process.cwd();
var args = argv.slice(3);
if (args.length === 1 && args[0] === '--help') {
//命令行帮助
return nodePPT.help(command);
}
nodePPT[command](args);
} else {
nodePPT.help();
}
var nodePPT = require('../lib/nodePPT');
var versions = require('../package').version;
var program = require('commander');

program
.version(versions);

program
.command('create')
.usage('[filename] [option]')
.description('create a slide')
.option('-d, --dir [path]','set slide file destination path')
.action(function (filename, options) {
if(typeof filename === 'object'){
console.log('ERROR: please input filename!'.bold.red);
this.commands[0].outputHelp()
return;
}

nodePPT.create(filename, options)
}).on('--help', function() {
console.log(' Examples:');
console.log();
console.log(' nodeppt create myslide');
console.log(' nodeppt create myslide -d D:/webppt');
console.log();
});

program
.command('generate')
.usage('[file_path] [save_path]')
.description('export html file')
.option('-o, --output [path]', 'output path')
.option('-a, --all [false]','output all style(include js,css) file', false)
.action(function (cmd, options){
var filename = '';
var shouldAll = false;
var output = '';

if(typeof cmd === 'string'){
filename = cmd;
shouldAll = options.all;
output = options.output;
}else if(typeof cmd === 'object'){
shouldAll = cmd.all;
output = cmd.output;
}

nodePPT.generate(filename, output, shouldAll);

})
.on('--help', function() {
console.log(' Examples:');
console.log();
console.log(' nodeppt generate D:/webppt/demo.md D:/output');
console.log(' nodeppt generate D:/webppt/ D:/output -a');
console.log();
});


program
.command('start')
.description('start local sever show slide')
.option('-d, --dir [dir]', 'set slide path')
.option('-p, --port [port]', 'set server port ', 8080)
.option('-c, --controller [socket]', 'support websocket mutil screen controller')
.option('-H, --host [host]', 'set host address', '0.0.0.0')
.action(function (cmd){
if(typeof cmd !== 'object'){
this.commands[2].outputHelp()
return;
}

nodePPT.start(cmd)
})
.on('--help', function() {
console.log(' Examples:');
console.log();
console.log(' nodeppt start -d D:/webppt -p 8080');
console.log(' nodeppt start -d D:/webppt -c socket');
console.log();
});


function parseArgs(args) {
return args.map(function(v) {
if (v in opts) {
return opts[v];


program
.command('pdf')
.usage('[http_url] [save_path.pdf]')
.description('export pdf file')
.action(function (http_url, save_path) {
if(typeof http_url !== 'string' || typeof save_path !== 'string'){
console.log('ERROR: pdf need a URL'.bold.red);
this.commands[3].outputHelp()
return;
}
return v;

nodePPT.pdf([http_url,save_path])
})
.on('--help', function() {
console.log(' Examples:');
console.log();
console.log(' nodeppt pdf http://127.0.0.1:8080/md/demo.md demo.pdf\n');
console.log(' Notice: '.bold.red + 'should install phantomjs before');
console.log(' npm install -g phantomjs');
console.log();
});




program.parse(process.argv);


if (!program.args[0]) {
process.stdout.write(program.helpInformation());
program.emit('--help');
}
152 changes: 19 additions & 133 deletions lib/nodePPT.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,20 +13,20 @@ var templateDir = path.join(rootDir, 'template') + path.sep;

var templateQ = [{
name: 'filename',
prompt: 'html文件名称'.bold.green,
prompt: 'filename'.bold.green,
'default': 'demo'
}, {
name: 'title',
prompt: '演讲题目'.bold.green,
'default': '演讲题目'
prompt: 'title'.bold.green,
'default': 'slide title'
}, {
name: 'subtitle',
prompt: '副标题'.bold.green,
prompt: 'subtitle'.bold.green,
'default': ''
}, {
name: 'speaker',
prompt: '演讲者'.bold.green,
'default': '演讲者'
prompt: 'speaker'.bold.green,
'default': 'speaker'
}];
var ppt = module.exports = {
pdf: function(args) {
Expand All @@ -48,96 +48,16 @@ var ppt = module.exports = {
var child = exec('phantomjs ' + libDir + '/pdf.js ' + url + ' ' + output);
// child.stderr.setEncoding('utf8');
child.stderr.on('data', function(data) {
console.log('请安装phantomjs:npm install -g phantomjs'.red);
console.log('nodeppt pdf 功能需要 phantomjs 支持'.red);
console.log('please install phantomjs:npm install -g phantomjs'.red);
console.log('nodeppt pdf depend phantomjs '.red);
});
child.stdout.on('data', function(data) {
console.log(data);
});
},
'--version': function() {
console.log('v' + require('../package.json').version);
},
help: function(command) {
switch (command) {
case undefined:
console.log('\n 用法: nodeppt <command>\n');
console.log(' 命令:');
console.log(' start 启动nodeppt httpserver');
console.log(' create 创建一个ppt');
console.log(' generate 导出ppt为一个html文件,-a:导出全部文件');
console.log(' pdf 导出网页ppt为pdf文件\n');

console.log(' 选项:');
console.log(' -h 帮助');
console.log(' -v 版本信息\n');
console.log(' 查看命令帮助: nodeppt <command> -h');
console.log(' Example: nodeppt start -h 查看start命令帮助');
break;
case 'start':
console.log('\n 用法: nodeppt start [OPTION]');
console.log(' -d, --dir <ppt_path> 指定ppt的路径');
console.log(' -p, --port <port> 指定httpserver端口');
console.log(' -c, --controller <socket> 支持websocket双屏控制');
console.log(' -H, --host <host> httpserver绑定的host\n');
console.log(' Example: ');
console.log(' nodeppt start -d D:/webppt -p 8080');
console.log(' nodeppt start -d D:/webppt -c socket');
break;
case 'pdf':
console.log('\n 用法: nodeppt pdf <http_url> <save_path.pdf>\n');
console.log(' Example: ');
console.log(' nodeppt pdf http://127.0.0.1:8080/md/demo.md demo.pdf\n');
console.log(' 注意: '.bold.red + '此功能需要安装phantomjs');
console.log(' npm install -g phantomjs');
break;
case 'generate':
console.log('\n 用法: nodeppt generate <file_path> <save_path>');
console.log(' -a, --all 导出全部(包括nodeppt js和css)\n');
console.log(' Example: ');
console.log(' nodeppt generate D:/webppt/demo.md D:/output');
console.log(' nodeppt generate D:/webppt/ D:/output -a\n');
break;
case 'create':
console.log('\n 用法: nodeppt create <filename> [OPTION]');
console.log(' -d, --dir <ppt_path> 指定ppt的路径\n');
console.log(' Example: ');
console.log(' nodeppt create myslide');
console.log(' nodeppt create myslide -d D:/webppt');
break;
}
// console.log(' ________________|'.bold.green + 'nodePPT帮助'.bold.red + '|_______________'.bold.green);
// console.log(' | |'.bold.green);
// console.log(' | nodeppt start: 启动httpserver |'.bold.green);
// console.log(' | nodeppt start -p 8000: 启动8000端口 |'.bold.green);
// console.log(' | nodeppt start -p 8000 -d ./ 指定路径 |'.bold.green);
// console.log(' | nodeppt start -h 127.0.0.1 指定host |'.bold.green);
// console.log(' | nodeppt start -c socket 用socket双屏控制 |'.bold.green);
// console.log(' | nodeppt create fileName: 创建一个ppt |'.bold.green);
// console.log(' | nodeppt pdf url -o a.pdf: 输出一个pdf |'.bold.green);
// console.log(' | nodeppt generate path: 输导出html |'.bold.green);
// console.log(' |____________________________________________|'.bold.green);
},
start: function(args) {
start: function(argsObj) {
//启动
var self = this;
var argsObj = {
port: 8080,
dir: '',
host: '0.0.0.0',
file: ''
};
args = args.join(' ').split('--');
args.forEach(function(v, i) {
v = v.trim();
if (v !== '') {
v = v.split(/\s+/);
if (v.length === 2) {
argsObj[v[0]] = v[1];
}
}
});
// console.log(argsObj);

var dir = argsObj.dir;
if (dir === '') {
Expand All @@ -147,30 +67,23 @@ var ppt = module.exports = {
if (!fs.existsSync(dir)) {
dir = path.join(self.cwd, dir);
if (!fs.existsSync(dir)) {
return console.log('\nERROR: '.bold.red + dir + ' 不是一个正确路径');
return console.log('\nERROR: '.bold.red + dir + ' not a right path');
}

} else {
var stat = fs.statSync(dir);
if (!stat.isDirectory()) {
return console.log('\nERROR: '.bold.red + dir + ' 不是一个正确路径');
return console.log('\nERROR: '.bold.red + dir + ' not a right path');
}
}

require(libDir + '/server').start(argsObj.port, dir, argsObj.host, argsObj);
},
create: function(args) {
create: function(filename, options) {
var curRoot = process.cwd();
var filename = '';
for (var i = 0, len = args.length; i < len; i++) {
switch (args[i]) {
case '--dir':
curRoot = args[i + 1] ? args[i + 1] : null;
i++;
break;
default:
filename = args[i];
}

if(options && options.dir){
curRoot = options.dir;
}

var opts = {
Expand All @@ -183,20 +96,14 @@ var ppt = module.exports = {
opts.filepath = opts.isHTML ? path.join(curRoot, filename + '.html') : path.join(curRoot, filename + '.md');

if ($.exists(opts.filepath)) {
console.log('ERROR: '.bold.red + ' ' + filename + ' 已经存在!');
console.log('ERROR: '.bold.red + ' ' + filename + ' already exist!');
return false;
}
opts.filename = filename;

templateQ.splice(0, 1);
} else {
console.log('ERROR: 请输入一个名字!'.bold.red);
ppt.help('create');
return false;
}

console.log('请回答以下问题:'.bold.green);
var v = templateQ.unshift();
console.log('please input:'.bold.green);
(function next(prompt) {
if (!prompt) {
return doneTmpl(opts);
Expand Down Expand Up @@ -227,28 +134,7 @@ var ppt = module.exports = {
// require(libDir + '/init')(curRoot);
// }
// },
generate: function(args) {
var curRoot = process.cwd();
var filename = '';
var output = '';
var all = false;
for (var i = 0, len = args.length; i < len; i++) {
switch (args[i]) {
case '--all':
all = true;
break;
default:
filename = output;
output = args[i];
}
}
if (!filename) {
filename = output;
output = '';
}
output = output ? output : process.cwd();
filename = filename ? filename : process.cwd();

generate: function(filename, output, all) {
require(libDir + '/generate')(filename, output, all);
}
};
Expand All @@ -264,5 +150,5 @@ function doneTmpl(opts) {
var html = $.renderFile(templateDir + (opts.isHTML ? 'default.ejs' : 'defaultmd.ejs'), opts);

$.writeFile(opts.filepath, html);
console.log(('已经成功创建文件:' + opts.filename + (opts.isHTML ? '.html' : '.md') + ', 请继续编写您的幻灯片内容').bold.green);
console.log(('Success:' + opts.filename + (opts.isHTML ? '.html' : '.md') + ', please write your slide content').bold.green);
}
Loading

0 comments on commit b2ee280

Please sign in to comment.