31 lines
1.3 KiB
JavaScript
31 lines
1.3 KiB
JavaScript
// The interactive workload for scripts/orderfile/generate.ts. Reads stdin,
|
|||
|
|
// writes stdout, drives readline. Traced twice: once on a pipe, once on a
|
||
|
|
// terminal (ptyrun.c), which is the only way to reach isatty, the window size,
|
||
|
|
// raw mode, and readline's line editor with its cursor escapes.
|
||
|
|
//
|
||
|
|
// Fed "world\none\ntwo\nquit\n". `quit` is what makes it exit, so it never has
|
||
|
|
// to wait for an end-of-input that a terminal may not deliver.
|
||
|
|
const { createInterface } = require("node:readline");
|
||
|
|
|
||
|
|
const terminal = Boolean(process.stdin.isTTY && process.stdout.isTTY);
|
||
|
|
process.stdout.write(`tty=${terminal} ${process.stdout.columns ?? 0}x${process.stdout.rows ?? 0}\n`);
|
||
|
|
process.stdout.write(Buffer.alloc(8192, 0x2e)); // more than one write's worth
|
||
|
|
if (terminal) {
|
||
|
|
process.stdout.write(`\ncolors=${process.stdout.hasColors?.(256)}\n`);
|
||
|
|
process.stdin.setRawMode(true);
|
||
|
|
process.stdin.setRawMode(false);
|
||
|
|
}
|
||
|
|
|
||
|
|
const rl = createInterface({ input: process.stdin, output: process.stdout, terminal, prompt: "> " });
|
||
|
|
let lines = 0;
|
||
|
|
rl.question("\nname? ", name => {
|
||
|
|
process.stdout.write(`hi ${name.trim()}\n`);
|
||
|
|
rl.on("line", line => {
|
||
|
|
process.stdout.write(`${++lines}: ${line.trim()}\n`);
|
||
|
|
if (line.trim() === "quit") return rl.close();
|
||
|
|
rl.prompt();
|
||
|
|
});
|
||
|
|
rl.prompt();
|
||
|
|
});
|
||
|
|
rl.on("close", () => process.stdout.write(`read ${lines} lines\n`));
|