scroll/src/common/editor/editor.ts

80 lines
1.9 KiB
JavaScript
Raw Normal View History

2023-11-08 18:07:34 -05:00
import Ansi from './ansi.ts';
import Buffer from './buffer.ts';
2023-11-09 12:05:30 -05:00
import {
ctrl_key,
importDefaultForRuntime,
ITerminalSize,
strlen,
truncate,
VERSION,
} from '../mod.ts';
2023-11-08 11:11:19 -05:00
export class Editor {
2023-11-08 11:11:19 -05:00
#buffer: Buffer;
#screenRows: number;
#screenCols: number;
constructor(terminalSize: ITerminalSize) {
2023-11-08 11:11:19 -05:00
this.#buffer = new Buffer();
this.#screenRows = terminalSize.rows;
this.#screenCols = terminalSize.cols;
2023-11-08 11:11:19 -05:00
}
/**
* Determine what to do based on input
* @param input - the decoded chunk of stdin
*/
public processKeyPress(input: string): boolean {
switch (input) {
case ctrl_key('q'):
this.clearScreen();
return false;
default:
return true;
}
}
2023-11-09 12:05:30 -05:00
// -------------------------------------------------------------------------------------------------------------------
// Terminal Output / Drawing
// -------------------------------------------------------------------------------------------------------------------
2023-11-08 11:11:19 -05:00
/**
* Clear the screen and write out the buffer
*/
public async refreshScreen(): Promise<void> {
2023-11-08 18:07:34 -05:00
const { write } = await importDefaultForRuntime('terminal_io');
2023-11-08 11:11:19 -05:00
2023-11-09 12:05:30 -05:00
this.#buffer.append(Ansi.HideCursor);
this.#buffer.append(Ansi.ResetCursor);
this.drawRows();
2023-11-09 12:05:30 -05:00
this.#buffer.append(Ansi.ShowCursor);
2023-11-08 11:11:19 -05:00
await write(this.#buffer.getBuffer());
this.#buffer.clear();
}
2023-11-08 11:11:19 -05:00
2023-11-09 12:05:30 -05:00
private clearScreen(): void {
importDefaultForRuntime('terminal_io').then(({ write }) => {
this.#buffer.append(Ansi.ClearScreen);
this.#buffer.append(Ansi.ResetCursor);
write(this.#buffer.getBuffer()).then(() => {});
});
}
2023-11-09 12:05:30 -05:00
private drawRows(): void {
for (let y = 0; y < this.#screenRows; y++) {
if (y === this.#screenRows / 3) {
const message = `Kilo editor -- version ${VERSION}`;
this.#buffer.append(truncate(message, this.#screenCols));
} else {
this.#buffer.append('~');
}
this.#buffer.append(Ansi.ClearLine);
if (y < this.#screenRows - 1) {
this.#buffer.append('\r\n');
}
}
}
}