Some reorganization
This commit is contained in:
parent
d99656de66
commit
b980996a5e
@ -3,19 +3,13 @@
|
|||||||
*/
|
*/
|
||||||
import { ITerminalIO, ITerminalSize } from '../common/mod.ts';
|
import { ITerminalIO, ITerminalSize } from '../common/mod.ts';
|
||||||
|
|
||||||
export async function* inputLoop() {
|
const BunTerminalIO: ITerminalIO = {
|
||||||
|
inputLoop: async function* inputLoop() {
|
||||||
for await (const chunk of Bun.stdin.stream()) {
|
for await (const chunk of Bun.stdin.stream()) {
|
||||||
yield chunk;
|
yield chunk;
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
getSize: function getSize(): ITerminalSize {
|
||||||
export async function write(s: string): Promise<void> {
|
|
||||||
const buffer = new TextEncoder().encode(s);
|
|
||||||
|
|
||||||
await Bun.write(Bun.stdout, buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getSize(): ITerminalSize {
|
|
||||||
// @TODO implement
|
// @TODO implement
|
||||||
// Check for tput
|
// Check for tput
|
||||||
// If has tput, use it to get terminal size
|
// If has tput, use it to get terminal size
|
||||||
@ -24,12 +18,12 @@ export function getSize(): ITerminalSize {
|
|||||||
const fallback: ITerminalSize = { rows: 25, cols: 80 };
|
const fallback: ITerminalSize = { rows: 25, cols: 80 };
|
||||||
|
|
||||||
return fallback;
|
return fallback;
|
||||||
}
|
},
|
||||||
|
write: async function write(s: string): Promise<void> {
|
||||||
|
const buffer = new TextEncoder().encode(s);
|
||||||
|
|
||||||
const BunTerminalIO: ITerminalIO = {
|
await Bun.write(Bun.stdout, buffer);
|
||||||
inputLoop,
|
},
|
||||||
getSize,
|
|
||||||
write,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export default BunTerminalIO;
|
export default BunTerminalIO;
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
* Adapt the bun test interface to the shared testing interface
|
* Adapt the bun test interface to the shared testing interface
|
||||||
*/
|
*/
|
||||||
import { expect, test as btest } from 'bun:test';
|
import { expect, test as btest } from 'bun:test';
|
||||||
import { ITestBase } from '../common/mod';
|
import { ITestBase } from '../common/mod.ts';
|
||||||
|
|
||||||
class TestBase implements ITestBase {
|
class TestBase implements ITestBase {
|
||||||
test(name: string, fn: () => void) {
|
test(name: string, fn: () => void) {
|
||||||
|
24
src/common/editor/buffer.ts
Normal file
24
src/common/editor/buffer.ts
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
class Buffer {
|
||||||
|
#b = '';
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
}
|
||||||
|
|
||||||
|
append(s: string): void {
|
||||||
|
this.#b += s;
|
||||||
|
}
|
||||||
|
|
||||||
|
appendLine(s: string): void {
|
||||||
|
this.#b += s + '\r\n';
|
||||||
|
}
|
||||||
|
|
||||||
|
clear(): void {
|
||||||
|
this.#b = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
getBuffer(): string {
|
||||||
|
return this.#b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Buffer;
|
@ -1,29 +1,7 @@
|
|||||||
import { Ansi } from './ansi.ts';
|
import Ansi from './ansi.ts';
|
||||||
import { importForRuntime } from './runtime.ts';
|
import Buffer from './buffer.ts';
|
||||||
import { ctrl_key } from './strings.ts';
|
import { importDefaultForRuntime } from '../runtime.ts';
|
||||||
|
import { ctrl_key } from '../strings.ts';
|
||||||
class Buffer {
|
|
||||||
#b = '';
|
|
||||||
|
|
||||||
constructor() {
|
|
||||||
}
|
|
||||||
|
|
||||||
append(s: string): void {
|
|
||||||
this.#b += s;
|
|
||||||
}
|
|
||||||
|
|
||||||
appendLine(s: string): void {
|
|
||||||
this.#b += s + '\r\n';
|
|
||||||
}
|
|
||||||
|
|
||||||
clear(): void {
|
|
||||||
this.#b = '';
|
|
||||||
}
|
|
||||||
|
|
||||||
getBuffer(): string {
|
|
||||||
return this.#b;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export class Editor {
|
export class Editor {
|
||||||
#buffer: Buffer;
|
#buffer: Buffer;
|
||||||
@ -50,7 +28,7 @@ export class Editor {
|
|||||||
* Clear the screen and write out the buffer
|
* Clear the screen and write out the buffer
|
||||||
*/
|
*/
|
||||||
public async refreshScreen(): Promise<void> {
|
public async refreshScreen(): Promise<void> {
|
||||||
const { write } = await importForRuntime('terminal_io');
|
const { write } = await importDefaultForRuntime('terminal_io');
|
||||||
|
|
||||||
this.clearScreen();
|
this.clearScreen();
|
||||||
this.drawRows();
|
this.drawRows();
|
1
src/common/editor/mod.ts
Normal file
1
src/common/editor/mod.ts
Normal file
@ -0,0 +1 @@
|
|||||||
|
export * from './editor.ts';
|
@ -1,3 +1,5 @@
|
|||||||
|
export * from './editor/mod.ts';
|
||||||
export * from './runtime.ts';
|
export * from './runtime.ts';
|
||||||
export * from './strings.ts';
|
export * from './strings.ts';
|
||||||
|
export * from './termios.ts';
|
||||||
export type * from './types.ts';
|
export type * from './types.ts';
|
||||||
|
@ -1,35 +1,33 @@
|
|||||||
import { ITerminalIO, ITerminalSize } from '../common/types.ts';
|
import { ITerminalIO, ITerminalSize } from '../common/types.ts';
|
||||||
|
|
||||||
|
const DenoTerminalIO: ITerminalIO = {
|
||||||
/**
|
/**
|
||||||
* Wrap the runtime-specific hook into stdin
|
* Wrap the runtime-specific hook into stdin
|
||||||
*/
|
*/
|
||||||
export async function* inputLoop() {
|
inputLoop: async function* inputLoop(): AsyncGenerator<
|
||||||
|
Uint8Array,
|
||||||
|
void,
|
||||||
|
unknown
|
||||||
|
> {
|
||||||
for await (const chunk of Deno.stdin.readable) {
|
for await (const chunk of Deno.stdin.readable) {
|
||||||
yield chunk;
|
yield chunk;
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
getSize: function getSize(): ITerminalSize {
|
||||||
export async function write(s: string): Promise<void> {
|
|
||||||
const buffer = new TextEncoder().encode(s);
|
|
||||||
|
|
||||||
const stdout = Deno.stdout.writable.getWriter();
|
|
||||||
await stdout.write(buffer);
|
|
||||||
stdout.releaseLock();
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getSize(): ITerminalSize {
|
|
||||||
const size: { rows: number; columns: number } = Deno.consoleSize();
|
const size: { rows: number; columns: number } = Deno.consoleSize();
|
||||||
|
|
||||||
return {
|
return {
|
||||||
rows: size.rows,
|
rows: size.rows,
|
||||||
cols: size.columns,
|
cols: size.columns,
|
||||||
};
|
};
|
||||||
}
|
},
|
||||||
|
write: async function write(s: string): Promise<void> {
|
||||||
|
const buffer = new TextEncoder().encode(s);
|
||||||
|
|
||||||
const DenoTerminalIO: ITerminalIO = {
|
const stdout = Deno.stdout.writable.getWriter();
|
||||||
inputLoop,
|
await stdout.write(buffer);
|
||||||
getSize,
|
stdout.releaseLock();
|
||||||
write,
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
export default DenoTerminalIO;
|
export default DenoTerminalIO;
|
||||||
|
@ -1,14 +1,18 @@
|
|||||||
/**
|
/**
|
||||||
* The starting point for running scroll
|
* The starting point for running scroll
|
||||||
*/
|
*/
|
||||||
import { importForRuntime } from './common/mod.ts';
|
import {
|
||||||
import { getTermios } from './common/termios.ts';
|
Editor,
|
||||||
import { Editor } from './common/editor.ts';
|
getTermios,
|
||||||
|
importDefaultForRuntime,
|
||||||
|
importForRuntime,
|
||||||
|
} from './common/mod.ts';
|
||||||
|
|
||||||
const decoder = new TextDecoder();
|
const decoder = new TextDecoder();
|
||||||
|
|
||||||
export async function main() {
|
export async function main() {
|
||||||
const { inputLoop, onExit } = await importForRuntime('mod.ts');
|
const { inputLoop } = await importDefaultForRuntime('terminal_io.ts');
|
||||||
|
const { onExit } = await importForRuntime('mod.ts');
|
||||||
|
|
||||||
// Setup raw mode, and tear down on error or normal exit
|
// Setup raw mode, and tear down on error or normal exit
|
||||||
const t = await getTermios();
|
const t = await getTermios();
|
||||||
|
Loading…
Reference in New Issue
Block a user