UNPKG

luhn-generator

Version:

A generator of numbers that passes the validation of Luhn algorithm or Luhn formula, also known as the 'modulus 10' or 'mod 10' algorithm

101 lines (82 loc) 2.35 kB
'use strict'; /** * Sticky bottom bar user interface */ var through = require('through'); var Base = require('./baseUI'); var rlUtils = require('../utils/readline'); var _ = require('lodash'); class BottomBar extends Base { constructor(opt) { opt = opt || {}; super(opt); this.log = through(this.writeLog.bind(this)); this.bottomBar = opt.bottomBar || ''; this.render(); } /** * Render the prompt to screen * @return {BottomBar} self */ render() { this.write(this.bottomBar); return this; } clean() { rlUtils.clearLine(this.rl, this.bottomBar.split('\n').length); return this; } /** * Update the bottom bar content and rerender * @param {String} bottomBar Bottom bar content * @return {BottomBar} self */ updateBottomBar(bottomBar) { rlUtils.clearLine(this.rl, 1); this.rl.output.unmute(); this.clean(); this.bottomBar = bottomBar; this.render(); this.rl.output.mute(); return this; } /** * Write out log data * @param {String} data - The log data to be output * @return {BottomBar} self */ writeLog(data) { this.rl.output.unmute(); this.clean(); this.rl.output.write(this.enforceLF(data.toString())); this.render(); this.rl.output.mute(); return this; } /** * Make sure line end on a line feed * @param {String} str Input string * @return {String} The input string with a final line feed */ enforceLF(str) { return str.match(/[\r\n]$/) ? str : str + '\n'; } /** * Helper for writing message in Prompt * @param {BottomBar} prompt - The Prompt object that extends tty * @param {String} message - The message to be output */ write(message) { var msgLines = message.split(/\n/); this.height = msgLines.length; // Write message to screen and setPrompt to control backspace this.rl.setPrompt(_.last(msgLines)); if (this.rl.output.rows === 0 && this.rl.output.columns === 0) { /* When it's a tty through serial port there's no terminal info and the render will malfunction, so we need enforce the cursor to locate to the leftmost position for rendering. */ rlUtils.left(this.rl, message.length + this.rl.line.length); } this.rl.output.write(message); } } module.exports = BottomBar;