UNPKG

pass-scene

Version:

Memorable passphrase generator

181 lines (154 loc) 4.7 kB
#!/usr/bin/env node /** * 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); },''); } } }