UNPKG

jscoding

Version:

A envirement for coding and debugging javascript language.

102 lines (92 loc) 2.84 kB
import fs from 'fs'; import readline from 'readline'; import hint from './hint'; const options = { buffer: null, readline: null, } /** * @method readFromBuffer * @param {Number} size * @returns {Promise} * @description 从缓冲区逐个读入 */ function readFromBuffer(size) { // size: 读取的个数 let buffer = options.buffer; return new Promise((resolve) => { let arr = []; size = size > buffer.length ? buffer.length : size; while (arr.length < size) { arr.push(buffer.shift()) } resolve(arr.join('\n')); // 多行数据之间以换行符 '\n' 分隔 }); } /** * @method readFromReadline * @param {Number} size * @returns {Promise} * @description 从命令行按行读入 */ function readFromReadline(size) { // size: 读取的行数 let readline = options.readline; return new Promise((resolve, reject) => { let arr = []; hint.warn("INPUT: "); readline && readline.on('line', (line) => { line || readline.close(); // 输入为空时退出程序 arr.push(line); if (arr.length >= size) { return resolve(arr.join('\n')); // 多行数据之间以换行符 '\n' 分隔 } }); }); } const input = (size = 1) => { // size: 读取的行数,默认取 1 行即返回数据,多行数据之间以换行符 '\n' 分隔 if (options.buffer) { return readFromBuffer(size); } else { return readFromReadline(size); } } const output = (msg) => { return hint.success("OUTPUT: ", msg); } const close = () => { options.readline && options.readline.close(); hint.success("Program closed!"); process.exit(0); } const initialize = (config = null) => { if (!(config.buffer || config.file)) { options.readline = readline.createInterface({ input: process.stdin, prompt: "> ", // 设置每当调用 rl.prompt() 时将写入 output 的提示。 }); options.readline.on('close', () => { hint.success("Program closed!"); process.exit(0); // readline 关闭时即退出程序 }); } else if (config && config.buffer && Array.isArray(config.buffer)) { options.buffer = config.buffer; } else if (config && config.filename && typeof config.filename == 'string') { if (fs.statSync(config.filename).isFile()) { options.buffer = fs.readFileSync(config.filename) .toString() .split(/ *\r*\n/ig); } else { hint.error("The input isn't a file!"); } } else { /* To do something */ } return true; } export { initialize as init, input as readline, output as print, close, }