12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- var fs = require('fs');
- // Collectable Mixin
- //
- // Provides utility methods to read from stdin and remaining arguments.
- var collectable = module.exports;
- // XXX: tomdocify, generate in readme
- collectable.stdin = function stdin(force, done) {
- if(!done) done = force, force = false;
- var argv = this.nopt.argv;
- var self = this;
- done = done || function(err) { err && self.emit('error', err); };
- this._readFromStdin = true;
- // not parsed, register done to be read when parse is called
- if(!argv) {
- this.once('stdin', done);
- return this;
- }
- // only read from stdin when no reamining args and not forced
- if(!argv.remain.length || force) {
- this.readStdin(done);
- }
- return this;
- };
- // Read files from remaining args, concat the result and call back the `done`
- // function with the concatanated result and the list of files.
- collectable.files = function files(done) {
- var argv = this.nopt.argv;
- var self = this;
- done = done || function(err) { err && self.emit('error', err); };
- // not parsed, register done to be read when parse is called
- if(!argv) {
- this.once('files', done);
- return this;
- }
- // only read files when we actually have files to read from
- if(argv.remain.length) {
- this.readFiles(argv.remain, done);
- }
- return this;
- };
- collectable.readStdin = function readStdin(done) {
- var data = '';
- var self = this;
- process.stdin.setEncoding('utf8');
- process.stdin.on('error', done);
- process.stdin.on('data', function(chunk){
- data += chunk;
- self.emit('stdin:data', chunk);
- }).on('end', function(){
- self.emit('stdin', null, data);
- done(null, data);
- }).resume();
- return this;
- };
- // Asynchronous walk of the remaining args, reading the content and returns
- // the concatanated result.
- collectable.readFiles = function readFiles(filepaths, done) {
- var data = '';
- var self = this;
- var files = filepaths.slice(0);
- (function read(file) {
- if(!file) {
- self.emit('files', null, data, filepaths);
- return done(null, data, filepaths);
- }
- fs.readFile(file, 'utf8', function(err, body) {
- if(err) return done(err);
- data += body;
- self.emit('files:data', body);
- read(files.shift());
- });
- })(files.shift());
- return this;
- };
- // Collect data either from stdin or the list of remaining args
- collectable.collect = function collect(done) {
- return this.stdin(done).files(done);
- };
|