jscoding
Version:
A envirement for coding and debugging javascript language.
102 lines (92 loc) • 2.84 kB
JavaScript
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,
}