From 36374a03516517a89bbb74ce58053ac5ca44f752 Mon Sep 17 00:00:00 2001 From: nea Date: Fri, 26 Aug 2022 15:12:25 +0200 Subject: default commands --- .../main/kotlin/moe/nea89/website/test/index.kt | 90 ++------------------ src/jsMain/kotlin/moe/nea89/website/KFiles.kt | 5 +- .../moe/nea89/website/ShellExecutionContext.kt | 1 + .../kotlin/moe/nea89/website/defaultCommands.kt | 96 ++++++++++++++++++++++ 4 files changed, 105 insertions(+), 87 deletions(-) create mode 100644 src/jsMain/kotlin/moe/nea89/website/defaultCommands.kt diff --git a/example/src/main/kotlin/moe/nea89/website/test/index.kt b/example/src/main/kotlin/moe/nea89/website/test/index.kt index c558868..846b0db 100644 --- a/example/src/main/kotlin/moe/nea89/website/test/index.kt +++ b/example/src/main/kotlin/moe/nea89/website/test/index.kt @@ -4,15 +4,9 @@ import kotlinext.js.require import kotlinx.browser.document import kotlinx.css.* import kotlinx.html.dom.append -import kotlinx.html.dom.create -import kotlinx.html.img -import kotlinx.html.js.a import kotlinx.html.js.div -import kotlinx.html.js.onLoadFunction -import kotlinx.html.js.p import moe.nea89.website.* import styled.injectGlobal -import kotlin.time.Duration.Companion.milliseconds val defaultFileSystem = fileSystem { "etc" { @@ -36,6 +30,7 @@ fun main() { val root = document.body!!.append.div() val console = KConsole.createFor(root, fileSystem = defaultFileSystem) console.text.id = "myconsole" + console.fileAccessor!!.cd("home/nea") injectGlobal { body { backgroundColor = Styles.bgColor.lighten(30) @@ -54,88 +49,13 @@ fun main() { console.addLine("Starting up terminal.") console.PS1 = { "${this.fileAccessor?.currentDir?.joinToString("/", "/") ?: ""} >" } console.rerender() - console.registerCommand(command("cwd", "pwd") { - val fa = requireFileAccessor() - console.addLine(fa.currentDir.joinToString(separator = "/", prefix = "/")) - }) - console.registerCommand(command("cd") { - val fa = requireFileAccessor() - val path = args.singleOrNull() - if (path == null) { - console.addLine("Usage: cd ") - return@command - } - val error = fa.cd(path) - if (error != null) { - console.addLine("cd: ${error.name}") - } - }) - console.registerCommand(command("ls") { - val fa = requireFileAccessor() - val path = when (args.size) { - 0 -> "." - 1 -> args[0] - else -> { - console.addLine("Usage: ls [directory or file]") - return@command - } - } - val file = fa.resolve(path) - if (file == null) { - console.addLine("ls: Could not find file or directory") - return@command - } - when (file) { - is KFile.Directory -> { - val longestName = file.files.keys.maxOf { it.length } - file.files.forEach { (name, file) -> - wait(200.milliseconds) - console.addLine( - name + " ".repeat(longestName + 1 - name.length) + file.fileType - ) - console.rerender() - } - } - - else -> console.addLine("ls: is a ${file.fileType}") - } - }) + console.registerCommand(defaultCwdCommand("cwd", "pwd")) + console.registerCommand(defaultCdCommand("cd")) + console.registerCommand(defaultLsCommand("ls")) console.registerCommand(command("color") { console.addLine("This is a ", red("red"), " word: ", green("1.0"), " ", blue("BLUUEEE")) }) - console.registerCommand(command("cat") { - val fa = requireFileAccessor() - val path = when (args.size) { - 1 -> args[0] - else -> { - console.addLine("Usage: cat [directory or file]") - return@command - } - } - val file = fa.resolve(path) - if (file == null) { - console.addLine("cat: Could not find file or directory") - return@command - } - when (file) { - is KFile.Directory -> console.addLine("cat: Is a directory") - is KFile.Text -> console.addMultilineText(file.text) - is KFile.Image -> console.addLine(document.create.p { - img(src = file.url) { - this.onLoadFunction = { console.scrollDown() } - } - }) - - is KFile.Download -> { - val link = document.create.a(file.url) - link.download = file.name.last() - document.body!!.append(link) - link.click() - link.remove() - console.addLine("Download started") - } - } - }) + console.registerCommand(defaultCatCommand("cat")) console.registerCommand(command("dick", "cock") { console.addMultilineText("Hehe") }) diff --git a/src/jsMain/kotlin/moe/nea89/website/KFiles.kt b/src/jsMain/kotlin/moe/nea89/website/KFiles.kt index aad3036..d5eff5a 100644 --- a/src/jsMain/kotlin/moe/nea89/website/KFiles.kt +++ b/src/jsMain/kotlin/moe/nea89/website/KFiles.kt @@ -151,10 +151,11 @@ class FileSystemBuilder { } } -suspend fun ShellExecutionContext.requireFileAccessor(): FileAccessor { +suspend fun ShellExecutionContext.requireFileAccessor(error: String? = "There is no file accessor present :("): FileAccessor { val fa = console.fileAccessor if (fa == null) { - console.addLine("There is no file accessor present :(") + if (error != null) + console.addLine(error) exit() } return fa diff --git a/src/jsMain/kotlin/moe/nea89/website/ShellExecutionContext.kt b/src/jsMain/kotlin/moe/nea89/website/ShellExecutionContext.kt index bd72421..b3a7bd8 100644 --- a/src/jsMain/kotlin/moe/nea89/website/ShellExecutionContext.kt +++ b/src/jsMain/kotlin/moe/nea89/website/ShellExecutionContext.kt @@ -13,6 +13,7 @@ class ShellExecutionContext( ) { suspend fun wait(duration: Duration) { + if (!duration.isPositive()) return suspendCancellableCoroutine { window.setTimeout({ it.resume(Unit) diff --git a/src/jsMain/kotlin/moe/nea89/website/defaultCommands.kt b/src/jsMain/kotlin/moe/nea89/website/defaultCommands.kt new file mode 100644 index 0000000..2c90dc2 --- /dev/null +++ b/src/jsMain/kotlin/moe/nea89/website/defaultCommands.kt @@ -0,0 +1,96 @@ +package moe.nea89.website + +import kotlinx.browser.document +import kotlinx.html.dom.create +import kotlinx.html.img +import kotlinx.html.js.a +import kotlinx.html.js.onLoadFunction +import kotlinx.html.js.p +import kotlin.time.Duration +import kotlin.time.Duration.Companion.milliseconds + +fun defaultCwdCommand(name: String, vararg names: String) = command(name, *names) { + val fa = requireFileAccessor() + console.addLine(fa.currentDir.joinToString(separator = "/", prefix = "/")) +} + +fun defaultCdCommand(name: String, vararg names: String) = command(name, *names) { + val fa = requireFileAccessor() + val path = args.singleOrNull() + if (path == null) { + console.addLine("Usage: cd ") + return@command + } + val error = fa.cd(path) + if (error != null) { + console.addLine("cd: ${error.name}") + } +} + +fun defaultCatCommand(name: String, vararg names: String) = command(name, *names) { + val fa = requireFileAccessor() + val path = when (args.size) { + 1 -> args[0] + else -> { + console.addLine("Usage: cat [directory or file]") + return@command + } + } + val file = fa.resolve(path) + if (file == null) { + console.addLine("cat: Could not find file or directory") + return@command + } + when (file) { + is KFile.Directory -> console.addLine("cat: Is a directory") + is KFile.Text -> console.addMultilineText(file.text) + is KFile.Image -> console.addLine(document.create.p { + img(src = file.url) { + this.onLoadFunction = { console.scrollDown() } + } + }) + + is KFile.Download -> { + val link = document.create.a(file.url) + link.download = file.name.last() + document.body!!.append(link) + link.click() + link.remove() + console.addLine("Download started") + } + } +} + + +fun defaultLsCommand(name: String, vararg names: String, delayBetweenLines: Duration = 200.milliseconds) = + command(name, *names) { + val fa = requireFileAccessor() + val path = when (args.size) { + 0 -> "." + 1 -> args[0] + else -> { + console.addLine("Usage: ls [directory or file]") + return@command + } + } + val file = fa.resolve(path) + if (file == null) { + console.addLine("ls: Could not find file or directory") + return@command + } + when (file) { + is KFile.Directory -> { + val longestName = file.files.keys.maxOf { it.length } + file.files.forEach { (name, file) -> + wait(delayBetweenLines) + console.addLine( + name + " ".repeat(longestName + 1 - name.length) + file.fileType + ) + console.rerender() + } + } + + else -> console.addLine("ls: is a ${file.fileType}") + } + } + -- cgit