From: Lanius Trolling Date: Fri, 15 Sep 2023 14:45:16 +0000 (-0400) Subject: Make external links configurable X-Git-Url: https://gitweb.starshipfights.net/?a=commitdiff_plain;h=91cb936e4170cce14e9819ed4b7ed0ba23b94fed;p=factbooks Make external links configurable --- diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml index 9a55c2d..fdf8d99 100644 --- a/.idea/kotlinc.xml +++ b/.idea/kotlinc.xml @@ -1,6 +1,6 @@ - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 96c2c27..2e9b997 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,3 +1,4 @@ + @@ -87,6 +88,9 @@ + + diff --git a/build.gradle.kts b/build.gradle.kts index 84154dc..071745c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -24,8 +24,8 @@ buildscript { plugins { java - kotlin("jvm") version "1.8.22" - kotlin("plugin.serialization") version "1.8.22" + kotlin("jvm") version "1.9.0" + kotlin("plugin.serialization") version "1.9.0" id("com.github.johnrengelman.shadow") version "7.1.2" application } @@ -38,23 +38,23 @@ repositories { } dependencies { - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.7.2") - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.7.2") - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-reactive:1.7.2") - implementation("org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.5.1") - implementation("org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.5.1") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.7.3") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.7.3") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-reactive:1.7.3") + implementation("org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.6.0") + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.6.0") - implementation("io.ktor:ktor-server-core-jvm:2.3.3") - implementation("io.ktor:ktor-server-netty-jvm:2.3.3") + implementation("io.ktor:ktor-server-core-jvm:2.3.4") + implementation("io.ktor:ktor-server-netty-jvm:2.3.4") - implementation("io.ktor:ktor-server-caching-headers:2.3.3") - implementation("io.ktor:ktor-server-call-id:2.3.3") - implementation("io.ktor:ktor-server-call-logging:2.3.3") - implementation("io.ktor:ktor-server-conditional-headers:2.3.3") - implementation("io.ktor:ktor-server-forwarded-header:2.3.3") - implementation("io.ktor:ktor-server-html-builder:2.3.3") - implementation("io.ktor:ktor-server-sessions-jvm:2.3.3") - implementation("io.ktor:ktor-server-status-pages:2.3.3") + implementation("io.ktor:ktor-server-caching-headers:2.3.4") + implementation("io.ktor:ktor-server-call-id:2.3.4") + implementation("io.ktor:ktor-server-call-logging:2.3.4") + implementation("io.ktor:ktor-server-conditional-headers:2.3.4") + implementation("io.ktor:ktor-server-forwarded-header:2.3.4") + implementation("io.ktor:ktor-server-html-builder:2.3.4") + implementation("io.ktor:ktor-server-sessions-jvm:2.3.4") + implementation("io.ktor:ktor-server-status-pages:2.3.4") implementation("org.jetbrains.kotlinx:kotlinx-html-jvm:0.9.0") diff --git a/src/main/kotlin/info/mechyrdia/lore/view_nav.kt b/src/main/kotlin/info/mechyrdia/lore/view_nav.kt index 66241e5..30c0e04 100644 --- a/src/main/kotlin/info/mechyrdia/lore/view_nav.kt +++ b/src/main/kotlin/info/mechyrdia/lore/view_nav.kt @@ -1,17 +1,33 @@ package info.mechyrdia.lore -import info.mechyrdia.OWNER_NATION +import info.mechyrdia.Configuration +import info.mechyrdia.JsonFileCodec import info.mechyrdia.auth.createCsrfToken import info.mechyrdia.data.currentNation import io.ktor.server.application.* -import kotlinx.html.DIV -import kotlinx.html.a -import kotlinx.html.span -import kotlinx.html.style +import io.ktor.util.* +import kotlinx.html.* +import kotlinx.serialization.Serializable +import kotlinx.serialization.builtins.ListSerializer +import java.io.File import kotlin.collections.component1 import kotlin.collections.component2 import kotlin.collections.set +@Serializable +private data class ExternalLink( + val url: String, + val text: String +) + +fun loadExternalLinks(): List { + val extraLinksFile = File(Configuration.CurrentConfiguration.articleDir).parentFile.combineSafe("externalLinks.json") + val extraLinks = JsonFileCodec.decodeFromString(ListSerializer(ExternalLink.serializer()), extraLinksFile.readText()) + return if (extraLinks.isEmpty()) + emptyList() + else (listOf(NavHead("See Also")) + extraLinks.map { NavLink(it.url, it.text, textIsHtml = true) }) +} + suspend fun ApplicationCall.standardNavBar(path: List? = null) = listOf( NavLink("/", "Lore Intro"), NavLink("/lore", "Table of Contents") @@ -37,11 +53,7 @@ suspend fun ApplicationCall.standardNavBar(path: List? = null) = listOf( NavHead("Useful Links"), NavLink("/comment/help", "Commenting Help"), NavLink("/comment/recent", "Recent Comments"), - NavHead("See Also"), - NavLink("https://nationstates.net/$OWNER_NATION", "Mechyrdia on NationStates"), - NavLink("https://discord.gg/cvUZMVQsqD", "Forum 7 Discord Server"), - NavLink("https://laniustrolling.dev/", "The Man Behind Mechyrdia"), -) +) + loadExternalLinks() sealed class NavItem { protected abstract fun DIV.display() @@ -57,13 +69,22 @@ data class NavHead(val label: String) : NavItem() { } } -data class NavLink(val to: String, val text: String, val aClasses: String? = null, val linkAttributes: Map = emptyMap()) : NavItem() { +data class NavLink( + val to: String, + val text: String, + val textIsHtml: Boolean = false, + val aClasses: String? = null, + val linkAttributes: Map = emptyMap() +) : NavItem() { override fun DIV.display() { a(href = to, classes = aClasses) { for ((attrName, attrValue) in linkAttributes) attributes[attrName] = attrValue - +text + if (textIsHtml) + unsafe { raw(text) } + else + +text } } }