Compare commits

..

No commits in common. "main" and "v1.0.4" have entirely different histories.
main ... v1.0.4

2 changed files with 25 additions and 48 deletions

View File

@ -43,64 +43,41 @@ export async function cliPrompt(
render(); render();
const buf = new Uint8Array(64); // large enough for most pastes const buf = new Uint8Array(6); // 6 bytes is enough for all the keys
inputLoop:
while (true) { while (true) {
const n = await Deno.stdin.read(buf); const n = await Deno.stdin.read(buf);
if (n === null) break; if (n === null) break;
const [a, b, c] = buf;
for (let i = 0; i < n; i++) { if (a === 3) { // Ctrl+C
const byte = buf[i];
// Ctrl+C
if (byte === 3) {
block?.clear(); block?.clear();
block?.["layout"]?.clearAll(); block?.["layout"]?.clearAll();
await Deno.stdin.setRaw(false); Deno.stdin.setRaw(false);
Deno.exit(130); Deno.exit(130);
} }
if (byte === 13) { // Enter if (a === 13) { // Enter
break inputLoop; break;
} } else if (a === 127 || a === 8) { // Backspace
// Escape sequence?
if (byte === 27 && i + 1 < n && buf[i + 1] === 91) {
const third = buf[i + 2];
if (third === 68 && cursorPos > 0) cursorPos--; // Left
else if (third === 67 && cursorPos < input.length) cursorPos++; // Right
else if (third === 51 && i + 3 < n && buf[i + 3] === 126) { // Delete
if (cursorPos < input.length) input.splice(cursorPos, 1);
i += 1; // consume tilde
}
i += 2; // consume ESC [ X
continue;
}
// Backspace
if (byte === 127 || byte === 8) {
if (cursorPos > 0) { if (cursorPos > 0) {
input.splice(cursorPos - 1, 1); input.splice(cursorPos - 1, 1);
cursorPos--; cursorPos--;
} }
continue; } else if (a === 46) { // Delete
} if (cursorPos < input.length) {
// Delete (ASCII 46)
if (byte === 46 && cursorPos < input.length) {
input.splice(cursorPos, 1); input.splice(cursorPos, 1);
continue;
} }
} else if (a === 27 && b === 91) { // Arrow keys
// Printable if (c === 51 && cursorPos < input.length) { // delete
if (byte >= 32 && byte <= 126) { input.splice(cursorPos, 1);
input.splice(cursorPos, 0, String.fromCharCode(byte)); }
if (c === 68 && cursorPos > 0) cursorPos--; // Left
if (c === 67 && cursorPos < input.length) cursorPos++; // Right
} else if (a >= 32 && a <= 126) { // Printable ASCII
input.splice(cursorPos, 0, String.fromCharCode(a));
cursorPos++; cursorPos++;
} }
// Other cases: ignore
}
render(); render();
} }

View File

@ -1,6 +1,6 @@
{ {
"name": "@bearmetal/pdf-tools", "name": "@bearmetal/pdf-tools",
"version": "1.0.7", "version": "1.0.4",
"license": "GPL 3.0", "license": "GPL 3.0",
"tasks": { "tasks": {
"dev": "deno run -A --env-file=.env main.ts", "dev": "deno run -A --env-file=.env main.ts",