+added console spport for lyngio
+added console support to lyng/jlyng CLI +added unicode escapes +created tetris console sample
This commit is contained in:
1 parent
1a080bc53e
commit
d9d7cafec8
44 files changed
+3842
-28
No files matched your search
@@ -0,0 +1,101 @@
|
||||
### lyng.io.console
|
||||
|
||||
`lyng.io.console` provides optional rich console support for terminal applications.
|
||||
|
||||
> **Note:** this module is part of `lyngio`. It must be explicitly installed into the import manager by host code.
|
||||
>
|
||||
> **CLI note:** the `lyng` CLI now installs `lyng.io.console` in its base scope by default, so scripts can simply `import lyng.io.console`.
|
||||
|
||||
#### Install in host
|
||||
|
||||
```kotlin
|
||||
import net.sergeych.lyng.Script
|
||||
import net.sergeych.lyng.io.console.createConsoleModule
|
||||
import net.sergeych.lyngio.console.security.PermitAllConsoleAccessPolicy
|
||||
|
||||
suspend fun initScope() {
|
||||
val scope = Script.newScope()
|
||||
createConsoleModule(PermitAllConsoleAccessPolicy, scope)
|
||||
}
|
||||
```
|
||||
|
||||
#### Use in Lyng script
|
||||
|
||||
```lyng
|
||||
import lyng.io.console
|
||||
|
||||
println("supported = " + Console.isSupported())
|
||||
println("tty = " + Console.isTty())
|
||||
println("ansi = " + Console.ansiLevel())
|
||||
println("geometry = " + Console.geometry())
|
||||
|
||||
Console.write("hello\n")
|
||||
Console.home()
|
||||
Console.clear()
|
||||
Console.moveTo(1, 1)
|
||||
Console.clearLine()
|
||||
Console.enterAltScreen()
|
||||
Console.leaveAltScreen()
|
||||
Console.setCursorVisible(true)
|
||||
Console.flush()
|
||||
```
|
||||
|
||||
Interactive sample script in this repo:
|
||||
|
||||
```bash
|
||||
lyng examples/tetris_console.lyng
|
||||
```
|
||||
|
||||
#### API
|
||||
|
||||
- `Console.isSupported(): Bool` — whether console control is available on this platform/runtime.
|
||||
- `Console.isTty(): Bool` — whether output is attached to a TTY.
|
||||
- `Console.ansiLevel(): String` — `NONE`, `BASIC16`, `ANSI256`, `TRUECOLOR`.
|
||||
- `Console.geometry(): ConsoleGeometry?` — `{columns, rows}` as typed object or `null`.
|
||||
- `Console.details(): ConsoleDetails` — consolidated capability object.
|
||||
- `Console.write(text: String)` — writes to console output.
|
||||
- `Console.flush()` — flushes buffered output.
|
||||
- `Console.home()` — moves cursor to top-left.
|
||||
- `Console.clear()` — clears visible screen.
|
||||
- `Console.moveTo(row: Int, column: Int)` — moves cursor to 1-based row/column.
|
||||
- `Console.clearLine()` — clears current line.
|
||||
- `Console.enterAltScreen()` — switch to alternate screen buffer.
|
||||
- `Console.leaveAltScreen()` — return to normal screen buffer.
|
||||
- `Console.setCursorVisible(visible: Bool)` — shows/hides cursor.
|
||||
- `Console.events(): ConsoleEventStream` — endless iterable source of typed events: `ConsoleResizeEvent`, `ConsoleKeyEvent`.
|
||||
- `Console.setRawMode(enabled: Bool): Bool` — requests raw input mode, returns `true` if changed.
|
||||
|
||||
#### Event Iteration
|
||||
|
||||
Use events from a loop, typically in a separate coroutine:
|
||||
|
||||
```lyng
|
||||
launch {
|
||||
for (ev in Console.events()) {
|
||||
if (ev is ConsoleKeyEvent) {
|
||||
// handle key
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### Event format
|
||||
|
||||
`Console.events()` emits `ConsoleEvent` with at least:
|
||||
|
||||
- `type: String` — `resize`, `keydown`, `keyup`
|
||||
|
||||
Additional fields:
|
||||
|
||||
- `ConsoleResizeEvent`: `columns`, `rows`
|
||||
- `ConsoleKeyEvent`: `key`, `code`, `ctrl`, `alt`, `shift`, `meta`
|
||||
|
||||
#### Security policy
|
||||
|
||||
The module uses `ConsoleAccessPolicy` with operations:
|
||||
|
||||
- `WriteText(length)`
|
||||
- `ReadEvents`
|
||||
- `SetRawMode(enabled)`
|
||||
|
||||
For permissive mode, use `PermitAllConsoleAccessPolicy`.
|
||||
Reference in new issue
Block a user