From 95d2e9f0885fa22871bad79704b6b74d7d19b6c8 Mon Sep 17 00:00:00 2001 From: anseki Date: Fri, 20 Mar 2015 20:34:18 +0900 Subject: [PATCH] Add `setMask`. --- README.md | 92 +++++++++++++++++++++++++++++-------------- cl_01.png | Bin 3920 -> 3943 bytes cl_02.png | Bin 0 -> 1668 bytes lib/readline-sync.js | 22 ++++------- package.json | 2 +- 5 files changed, 71 insertions(+), 45 deletions(-) create mode 100644 cl_02.png diff --git a/README.md b/README.md index 5838743..b47950f 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,8 @@ currentPrompt = readlineSync.setPrompt([newPrompt]) Set the prompt, for example when you run `node` on the command line, you see `> `, which is node's prompt. The default is `'> '`. (See `prompt` method) -The `newPrompt` may be string, or may not be (e.g. number, Date, Object, etc.). This is converted to string (i.e. `toString` method is called) before it is displayed every time. +The `newPrompt` may be string, or may not be (e.g. number, Date, Object, etc.). This is converted to string (i.e. `toString` method is called) before it is displayed every time. + For example, `[foo-directory]#` like a bash shell that show the current directory. ```js @@ -67,53 +68,85 @@ readlineSync.setPrompt({ }) ``` -### setEncoding - -```js -currentEncoding = readlineSync.setEncoding([newEncoding]) -``` - -Set the encoding method of input (user's response) and output (`prompt` method and `question` method). The default is `'utf8'`. - ### setPrint ```js readlineSync.setPrint([callback]) ``` -The specified `callback` Function is called when any outputs (`prompt` method and `question` method). -The `callback` is given two arguments the output text and `encoding`. +The specified `callback` Function is called when any outputs (`prompt` method and `question` method) are done. The `callback` is given two arguments the output text and `encoding`. + +For example: + +* This is used to pass plain texts to the Logger, when texts are colored. ![sample](cl_01.png) -For example, this is used to pass plain texts to the Logger, when texts are colored. +```js +var readlineSync = require('readline-sync'), + chalk = require('chalk'), + user, pw, command; + +readlineSync.setPrint(function(display, encoding) { + logger.log(chalk.stripColor(display)); // Remove control characters. +}); + +console.log(chalk.black.bold.bgYellow(' Your Account ')); +user = readlineSync.question(chalk.gray.underline(' USER NAME ') + ' :'); +pw = readlineSync.question(chalk.gray.underline(' PASSWORD ') + ' :', {noEchoBack: true}); +// Authorization ... +console.log(chalk.green('Welcome, ' + user + '!')); + +readlineSync.setPrompt(chalk.red.bold('> ')); +command = readlineSync.prompt(); +``` + +* When you do the redirecting that like `node yourscript.js > foo.log` to record into a file, this is used to output conversation to the file. That is, the conversation isn't outputted to `foo.log` without this code. + +```js +var readlineSync = require('readline-sync'); +readlineSync.setPrint(function(display, encoding) { + console.log(display); // Output to STDOUT (foo.log) +}); +``` + +### setMask + +```js +currentMask = readlineSync.setMask([newMask]) +``` + +Set the mask character that is shown instead of the secret text (e.g. password). (See `noEchoBack` option.) The default is `'*'`. If you want to show nothing, specify `''`. (But it's not user friendly.) +*Note:* The some platforms might use `'*'` or `''` always. + +For example: ```js var readlineSync = require('readline-sync'), - user, pw, command; -require('colors'); + chalk = require('chalk'), + secret; -readlineSync.setPrint(function(display, encoding) { - logger.log(display.stripColors); // Remove control characters. -}); - -console.log('Your account required.'.grey); -user = readlineSync.question('USER NAME'.white.inverse + ': '); -pw = readlineSync.question('PASSWORD'.white.inverse + ': ', {noEchoBack: true}); -// Authorization ... -console.log(('Welcome, ' + user + '!').green.bold); - -readlineSync.setPrompt('> '.bold.red); -command = readlineSync.prompt(); +readlineSync.setMask(chalk.magenta('\u2665')); +secret = readlineSync.question('Please whisper sweet words :', {noEchoBack: true}); ``` +![sample](cl_02.png) + ### setBufferSize ```js currentBufferSize = readlineSync.setBufferSize([newBufferSize]) ``` -When readlineSync reads from TTY directly (without reading by shell), a size `newBufferSize` buffer is used. Even if the user's response exceeds it, it's usually no problem, because the buffer is used repeatedly. But, some platforms's TTY may not accept user's response that is too long. And set an enough size. The default is `1024`. +When readlineSync reads from TTY directly (without reading by shell), a size `newBufferSize` buffer is used. Even if the user's response exceeds it, it's usually no problem, because the buffer is used repeatedly. But, some platforms's TTY might not accept user's response that exceeds it. And set an enough size. The default is `1024`. + +### setEncoding + +```js +currentEncoding = readlineSync.setEncoding([newEncoding]) +``` + +Set the encoding method of input (user's response) and output (`prompt` method and `question` method). The default is `'utf8'`. ## Options @@ -124,7 +157,8 @@ An `options` Object can be specified to `prompt` method and `question` method. T Type: Boolean Default: `false` -If `true` is specified, echo back is avoided. It is used to hide the secret text (e.g. password) which is typed by user on screen. +If `true` is specified, echo back is avoided. It is used to hide the secret text (e.g. password) which is typed by user on screen. (See `setMask` method) + For example: ```js @@ -135,7 +169,7 @@ console.log('Login ...'); The typed text is not shown on screen. ``` -PASSWORD : +PASSWORD :******** Login ... ``` diff --git a/cl_01.png b/cl_01.png index bdf9cd33f00bed7f6e118e72720a56a9137f7ff2..405bc01b9fcffe75566b1c9950f6b1fce859322a 100644 GIT binary patch literal 3943 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 BmjeI* literal 3920 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 F{~w;cK9c|d diff --git a/cl_02.png b/cl_02.png new file mode 100644 index 0000000000000000000000000000000000000000..dd7893d94ba8958f4b7cd8b2f6c150ba8e8cb6c2 GIT binary patch literal 1668 zcmV-~27CF5P)HYuwT>}6B0bFOn=+B+b|Ns9500=Av06soF01=ez!(pdoM#X6f29ww7{QvX* z|HAA4{p!P)767P04a;|b@$m4^n5<1^rzuaH{PEoX{`1@a|F@gYAva6ck^=YEk^ok| zj??tk*4dDP&Hw${>CvTgZNjhO|3#+Sq@$(Y?)==QHfuU9`{T0B@&4@G&C|P-!QSr+ zAvpi=%$sbSJtz(^ASkiUFU2o*~lB7y_at1zEG$Z z4fC;3xNEu>ldE9^r;gQ{ux&Tr=krCj1dlvt@I6KK_J;&l&emo74-B|%_T%p6V)7J% zt<88m_MC2$|C(=PUBQ!YsbJe0T#Vqy0^j*xoQJ~g#pEd~&(&Df+t%c?$jBuqemP z!w2W(2PYV>omTDI$wha7`A7*cE+juraJm0fBm~2uJy|{2K5Kf-Ah%tWY>WL#$ln*e z8r8u?%Xc39jl2PD?#7$E2L21v=|B?~5{&)Wz1F7MezsU2fPHrE``tx%+kOrkgt*ia zTM`S~5C`jr2T0pXVUQ%{O}6Rr|SRRcOu!1Si4{As`8wwfqRdyY@P4ZexN+ zeubSmGk*}bptIf}KFiD7qNIcGt0njWB1a#y*O&JrHx)%X@F-=qD%OX6lNKk`h1v#H`z zf&+1W;pU?5FPTDb87)PjBldp?TLf)u9X7A-@CRf){sM&+jQxZyZn+O-PJEX8Jyr9I zY)LF^OLJ2ajBU-S&=)6J64#uHe0i^kb3TT4N`Yl9R}`Ym8_FSx zg>9wW%6$dF*fvrSgeGyL{isW8Kc|mAXo0eppYwi*76f0`mcWqp9}Ad;wD>&)r_tUM zO%u@}K7ZcWL-;3vYB(S`Zf9dZaSm{fQ=dv+B-IJ3_XxLLdl^)T2+~Nsz=n zJ`#)$QE3d3wfsv2quQzanm+Evm@@mtHkzT=xpC|_xs)zbaB{;D~ zv9PU_o7xewO)9uc2#zb*qH8}j%nAu;URZuU!O=`LV?x%j@J0K29*Q#j&t0%}wnH*~WJ;@1qj+NIr9V5v}#a4w#DDUKI0zy+;zN{m0}1+azL@LEzQk^-{yO7nVzRPg?Dgg z&)@nuZoUEX_r<3#tzG)cL6b6&8!cr6l(qac!O^hE6;m7bE-(Wa=JYmvn!_3{m=JBm z)G5(99PNuTAOug7i4yi>=WZJi;b|rLL*3i(<(9qD((9qEMzvFMnvfOvLr+wJ~ O0000'); var res = _readlineShell(options); if (res.error) { throw res.error; } return res.input; @@ -66,29 +65,24 @@ function _readlineSync(options) { // options.display is string if (process.stdin.isTTY) { fdR = process.stdin.fd; ttyR = process.stdin._handle; - console.warn('OPENED: STDIN'); } else { try { // The stream by fs.openSync('\\\\.\\CON', 'r') can't switch to raw mode. // 'CONIN$' might fail on XP, 2000, 7 (x86). fdR = getFsB().open('CONIN$', constants.O_RDWR, parseInt('0666', 8)); ttyR = new TTY(fdR, true); - console.warn('OPENED: CONIN$'); } catch (e) {} } if (process.stdout.isTTY) { fdW = process.stdout.fd; - console.warn('OPENED: STDOUT'); } else { try { fdW = fs.openSync('\\\\.\\CON', 'w'); - console.warn('OPENED: \\\\.\\CON(W)'); } catch (e) {} if (typeof fdW !== 'number') { // Retry try { fdW = getFsB().open('CONOUT$', constants.O_RDWR, parseInt('0666', 8)); - console.warn('OPENED: CONOUT$'); } catch (e) {} } } @@ -98,24 +92,20 @@ function _readlineSync(options) { // options.display is string try { fdR = fs.openSync('/dev/tty', 'r'); // device file, not process.stdin ttyR = process.stdin._handle; - console.warn('OPENED: /dev/tty(R) and STDIN handle'); } catch (e) {} } else { // Node v0.12 read() fails. try { fdR = fs.openSync('/dev/tty', 'r'); ttyR = new TTY(fdR, false); - console.warn('OPENED: /dev/tty(R)'); } catch (e) {} } if (process.stdout.isTTY) { fdW = process.stdout.fd; - console.warn('OPENED: STDOUT'); } else { try { fdW = fs.openSync('/dev/tty', 'w'); - console.warn('OPENED: /dev/tty(W)'); } catch (e) {} } } @@ -147,9 +137,6 @@ function _readlineSync(options) { // options.display is string } buffer = new Buffer((reqSize = options.keyIn ? 1 : bufSize)); - console.warn('<>: ' + isEditable); - console.warn('--------'); - while (true) { readSize = 0; @@ -162,7 +149,6 @@ function _readlineSync(options) { // options.display is string return; } - console.warn('readSize: ' + readSize); if (readSize === 0) { break; } chunk = buffer.toString(encoding, 0, readSize); // other ctrl-chars @@ -176,7 +162,6 @@ function _readlineSync(options) { // options.display is string } input += chunk; - console.warn('<>: ' + input); if (/[\r\n]$/.test(input) || options.keyIn && input.length >= reqSize) { break; } } @@ -358,6 +343,13 @@ exports.setEncoding = function(newEncoding) { return encoding; }; +exports.setMask = function(newMask) { + if (typeof newMask === 'string') { + mask = newMask; + } + return mask; +}; + exports.setBufferSize = function(newBufSize) { newBufSize = parseInt(newBufSize, 10); if (!isNaN(newBufSize) && typeof newBufSize === 'number') { diff --git a/package.json b/package.json index bb4791d..6db1daf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "readline-sync", - "version": "0.7.9", + "version": "0.8.0", "title": "readlineSync", "description": "Synchronous Readline for interactively running to have a conversation with the user via a console(TTY).", "keywords": [