pass-scene
Version:
Memorable passphrase generator
181 lines (154 loc) • 4.7 kB
JavaScript
/**
* wordpos.js
*
*
* Usage:
* wordpos -p <noun|verb|adj|adv|all> <get|is|lookup> <stdin|words*>
*
* Copyright (c) 2012 mooster@42at.com
* https://github.com/moos/wordpos
*
* Released under MIT license
*/
var program = require('commander'),
_ = require('underscore')._,
pos = 'noun verb adj adv all'.split(' ');
program
.version('0.1.0')
.usage('[options] <command> word ...')
// .option('-p, --pos <pos>', 'Get specific POS [noun|verb|adj|adv]', function(val){
// val = String(val).toLowerCase();
// return _.include(pos, val) && val;
// }, 'all')
.option('-a, --adj', 'Get adjectives')
.option('-r, --adv', 'Get adverbs')
.option('-n, --noun', 'Get nouns')
.option('-v, --verb', 'Get verbs')
.option('-b, --brief', 'brief (un-vebose)')
.option('-c, --column', 'column output')
.option('-F, --full', 'full definition object')
.option('-j, --json', 'full definition as JSON')
.option('-f, --file', 'input file')
//.parse(process.argv);
program.command('get')
.description('get pos from -f <file> or <stdin>')
.action(exec);
00 && program.command('is')
.description('is word a particular pos')
.action(exec);
program.command('lookup')
.description('lookup word')
.action(exec);
program.command('*')
.action(function(){
return console.log(program.helpInformation());
});
var
WordPos = require('../src/wordpos'),
fs = require('fs'),
util = require('util'),
results = {},
cmd;
program.parse(process.argv);
function exec(){
var args = _.initial(arguments);
cmd = _.last(arguments).name;
// console.log('executing %s', cmd, args)
if (program.file) {
fs.readFile(program.file, 'utf8', function(err, data){
if (err) return console.log(err);
run(data);
});
} else if (args.length){
run(args.join(' '));
} else {
read_stdin(run);
}
}
function read_stdin(callback) {
var data = '';
process.stdin.resume();
process.stdin.setEncoding('utf8');
process.stdin.on('data', function (chunk) {
//process.stdout.write('data: ' + chunk);
var c = chunk.charCodeAt(0);
if (c == 4 || c == 26) // ^c ^d
return process.stdin.emit('end') && process.stdin.pause();
data += chunk;
});
process.stdin.on('end', function () {
callback(data);
});
}
function optToFn() {
var cmds = {noun:'Noun', verb:'Verb', adj:'Adjective', adv:'Adverb'},
fns = _.reject(cmds, function(fn, opt) { return !program[opt] });
if (!fns.length) fns = _.values(cmds); //default to all
return fns;
}
function run(data) {
var
wordpos = new WordPos(),
// fns = program.pos == 'all' ? cmds : [cmds[program.pos]],
fns = optToFn(),
plural = (cmd=='get' ? 's':''),
collect = _.after(data.length, _.bind(output,null,fn)),
results = {};
data = wordpos.parse(data);
_(fns).each(function(fn){
var method = cmd + fn + plural;
// console.log(fn, plural, method, fns);
if (cmd=='get') {
wordpos[method](data, _.bind(output,null,fn));
} else {
data.forEach(function(word){
wordpos[method](word, function(result){
if (result && cmd != 'lookup' || result.length) {
results[word] = result;
}
collect(results);
});
});
}
});
}
function output(what, results) {
// console.log(what, cmd , results);
// return
var sep = program.column ? '\n' : ' ',
str = !program.brief ? util.format('# %s %d:\n', what, _(results).size()) : '';
// console.log(str + (results.length && results.join(sep) || results) + '\n');
console.log(str + print(results) + '\n');
}
function print(results) {
var sep = program.column ? '\n' : ' ';
switch (cmd) {
case 'is':
return _.keys(results).join(sep);
// return _.reduce(results, function(memo, v, k){
// return memo + k +" "+ v +"\n";
// }, '');
case 'lookup':
if (program.json) {
return util.format('%j',results);
} else if (program.full) {
return util.inspect(results,false,10);
return JSON.stringify(results);
}
return _.reduce(results, function(memo, v, k){
return (v.length && (memo + k +"\n"+ print_def(v) +"\n") ) || '';
}, '');
case 'get':
return results.join(sep);
}
function print_def(defs) {
if (program.full) {
return JSON.stringify(defs);
} else {
return _.reduce(defs, function(memo, v, k){
return memo + util.format(' %s: %s\n', v.pos, v.gloss);
},'');
}
}
}