diff --git a/lib/readline-sync.js b/lib/readline-sync.js index 7aeb492..305bd07 100644 --- a/lib/readline-sync.js +++ b/lib/readline-sync.js @@ -29,7 +29,9 @@ var noTrim: false, encoding: 'utf8', bufferSize: 1024, - print: void 0 + print: void 0, + isTrue: [], + isFalse: [] }, useExt = false, @@ -203,7 +205,7 @@ function _readlineSync(options) { options.encoding); } - return options.noTrim || options.keyIn ? input : input.trim(); + return (options.noTrim || options.keyIn ? input : input.trim()); } function readlineExt(options) { @@ -439,6 +441,8 @@ function margeOptions() { break; // array case 'limit': // * * readlineExt + case 'isTrue': // * + case 'isFalse': // * /* jshint eqnull:true */ options[optionName] = value != null ? flattenArray(value, function(value) { @@ -473,14 +477,14 @@ function flattenArray(array, validator) { return flatArray; } -function isMatchedLimit(res, limit, caseSensitive) { - return !limit.length || limit.some(function(valid) { - if (typeof valid === 'number') { valid += ''; } - return typeof valid === 'string' ? ( +function isMatched(res, comps, caseSensitive) { + return comps.some(function(comp) { + if (typeof comp === 'number') { comp += ''; } + return (typeof comp === 'string' ? ( caseSensitive ? - res === valid : res.toLowerCase() === valid.toLowerCase() + res === comp : res.toLowerCase() === comp.toLowerCase() ) : - valid instanceof RegExp ? valid.test(res) : false; + comp instanceof RegExp ? comp.test(res) : false); }); } @@ -490,13 +494,22 @@ function readlineWithOptions(options) { options.limit = ''; // for readlineExt while (true) { res = _readlineSync(options); - if (isMatchedLimit(res, limitSave, options.caseSensitive)) { break; } + if (!limitSave.length || + isMatched(res, limitSave, options.caseSensitive)) { break; } options.display += (options.display ? '\n' : '') + (options.limitMessage ? options.limitMessage + '\n' : '') + displaySave; } return res; } +function toBool(res, options) { + return ( + (options.isTrue.length && + isMatched(res, options.isTrue, options.caseSensitive)) ? true : + (options.isFalse.length && + isMatched(res, options.isFalse, options.caseSensitive)) ? false : res); +} + // for dev exports._useExtSet = function(use) { useExt = use; }; @@ -504,8 +517,7 @@ exports.prompt = function(options) { var readOptions = margeOptions(true, options), res; readOptions.display = readOptions.prompt; res = readlineWithOptions(readOptions); - - return res; + return toBool(res, readOptions); }; exports.question = function(query, options) { @@ -513,8 +525,7 @@ exports.question = function(query, options) { display: query }), res = readlineWithOptions(readOptions); - - return res; + return toBool(res, readOptions); }; exports.keyIn = function(query, options) { @@ -528,7 +539,20 @@ exports.keyIn = function(query, options) { { return typeof value === 'string' || typeof value === 'number'; }) .join('').replace(/\n/g, '').replace(/[^A-Za-z0-9_ ]/g, '\\$&'); res = _readlineSync(readOptions); - return res; + + ['isTrue', 'isFalse'].forEach(function(optionName) { + var comps = []; + readOptions[optionName].forEach(function(comp) { + if (typeof comp === 'string' || typeof comp === 'number') { + comps = comps.concat((comp + '').split('')); + } else if (comp instanceof RegExp) { + comps.push(comp); + } + }); + readOptions[optionName] = comps; + }); + + return toBool(res, readOptions); }; exports.setDefault = function(options) { diff --git a/package.json b/package.json index 558c513..f804e11 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "readline-sync", - "version": "0.11.0", + "version": "0.12.0", "title": "readlineSync", "description": "Synchronous Readline for interactively running to have a conversation with the user via a console(TTY).", "keywords": [