Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 29 additions & 6 deletions src/jsMain/kotlin/toc.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import kotlinx.browser.document
import kotlinx.browser.localStorage
import kotlinx.browser.window
import org.w3c.dom.*
import org.w3c.dom.url.URLSearchParams

val DEFAULT_INPUT_MARKDOWN = """
# Paste Your Document In Here
Expand Down Expand Up @@ -85,6 +86,11 @@ class TocHandler(
fun getSelectProfile(): HTMLSelectElement =
(document.getElementById("profile") as HTMLSelectElement)

fun maybeSetProfile(value: String) = value.uppercase().let { profile ->
runCatching { BitProfiles.valueOf(profile) }
.onSuccess { getSelectProfile().value = profile }
}

fun generateOptions(): String =
BitOptions.list.map { it.toHtml() }.joinToString("") { "<div>$it</div>" }

Expand All @@ -103,24 +109,32 @@ fun resetOptions() {
}
localStorage.removeItem("profile")
getSelectProfile().reset()
window.location.hash = ""
console.log("options reset")
}

fun loadOptions() {
BitOptions.list.forEach { bitOption ->
(localStorage.getItem(bitOption.id))?.let { value ->
bitOption.setValue(value)
}
BitOptions.setFrom { localStorage.getItem(it) }
window.location.hash.substring(1).takeIf { it.isNotBlank() }?.let { hash ->
val urlParams = URLSearchParams(hash)
console.log("loading options from URL", urlParams)
BitOptions.setFrom { urlParams.get(it) }
}
localStorage.getItem("profile")?.let { getSelectProfile().value = it }
console.log("options saved")
}

fun writeOptionsInUrlHash() {
val params = URLSearchParams()
BitOptions.list.forEach { bitOption -> params.set(bitOption.id, bitOption.getValue().toString()) }
params.set("profile", getSelectProfile().value)
window.location.hash = params.toString()
}

fun generate(text: String): String = try {
BitGenerator.generate(text, getParams())
} catch (e: BitException) {
"\nError!\n${e.message}"
}.also {
writeOptionsInUrlHash()
console.log("returned $it")
}

Expand All @@ -137,6 +151,15 @@ fun getParams() = BitGenerator.Params(
maxLevel = BitOptions.maxLevel.getValue()
)

fun BitOptions.setFrom(getter: (String) -> String?) {
list.forEach { bitOption ->
getter(bitOption.id)?.let {
bitOption.setValue(it)
}
}
getter("profile")?.let { maybeSetProfile(it) }
}

fun BitProfiles.apply() {
this.overriddenBitOptions().forEach { it.setValue(it.default.toString()) }
}
Expand Down