summaryrefslogtreecommitdiff
path: root/src/jsMain/kotlin/moe/nea89/website/defaultCommands.kt
blob: 2c90dc2b3ece7930bda8d775a8ef1d08591c47c6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
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 <directory>")
        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}")
        }
    }