From 35cd0e828a55e913b17c1dc547c7873e05a32cf9 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Fri, 23 Feb 2024 12:11:07 +0300 Subject: [PATCH] Update language management --- .../space/kscience/snark/html/Language.kt | 24 ++++++++++--------- .../kscience/snark/html/Postprocessor.kt | 7 ++++-- .../kscience/snark/ktor/KtorSiteContext.kt | 11 +++++---- 3 files changed, 25 insertions(+), 17 deletions(-) diff --git a/snark-html/src/jvmMain/kotlin/space/kscience/snark/html/Language.kt b/snark-html/src/jvmMain/kotlin/space/kscience/snark/html/Language.kt index 17adc70..ea09852 100644 --- a/snark-html/src/jvmMain/kotlin/space/kscience/snark/html/Language.kt +++ b/snark-html/src/jvmMain/kotlin/space/kscience/snark/html/Language.kt @@ -6,8 +6,8 @@ import space.kscience.dataforge.data.* import space.kscience.dataforge.meta.* import space.kscience.dataforge.names.* import space.kscience.snark.SnarkBuilder -import space.kscience.snark.html.Language.Companion.SITE_LANGUAGES_KEY import space.kscience.snark.html.Language.Companion.SITE_LANGUAGE_KEY +import space.kscience.snark.html.Language.Companion.SITE_LANGUAGE_MAP_KEY import kotlin.reflect.typeOf @@ -45,7 +45,7 @@ public class Language : Scheme() { public val SITE_LANGUAGE_KEY: Name = SiteContext.SITE_META_KEY + LANGUAGE_KEY - public val SITE_LANGUAGES_KEY: Name = SiteContext.SITE_META_KEY + LANGUAGE_MAP_KEY + public val SITE_LANGUAGE_MAP_KEY: Name = SiteContext.SITE_META_KEY + LANGUAGE_MAP_KEY public const val DEFAULT_LANGUAGE: String = "en" @@ -75,14 +75,16 @@ public class Language : Scheme() { public fun Language(prefix: String): Language = Language { this.prefix = prefix } -public val SiteContext.languages: Map - get() = siteMeta[SITE_LANGUAGES_KEY]?.items?.mapKeys { it.key.toStringUnescaped() } ?: emptyMap() +public val SiteContext.languageMap: Map + get() = siteMeta[SITE_LANGUAGE_MAP_KEY]?.items?.map { + it.key.toStringUnescaped() to Language.read(it.value) + }?.toMap() ?: emptyMap() public val SiteContext.language: String get() = siteMeta[SITE_LANGUAGE_KEY].string ?: Language.DEFAULT_LANGUAGE -// -//public val SiteContext.languagePrefix: Name -// get() = languages[language]?.let { it[Language::prefix.name].string ?: language }?.parseAsName() ?: Name.EMPTY + +public val SiteContext.languagePrefix: Name + get() = languageMap[language]?.let { it.prefix ?: language }?.parseAsName() ?: Name.EMPTY private class LanguageBranchAction(val prefix: Name) : AbstractAction(typeOf()) { @@ -127,7 +129,7 @@ public fun SiteContext.multiLanguageSite( val prefix = language.prefix ?: languageKey val languageSiteMeta = Meta { SITE_LANGUAGE_KEY put languageKey - SITE_LANGUAGES_KEY put Meta { + SITE_LANGUAGE_MAP_KEY put Meta { languageMap.forEach { it.key put it.value } @@ -151,11 +153,11 @@ public val PageContext.language: String /** * Mapping of language keys to other language versions of this page */ -public fun PageContext.getLanguageMap(): Map = - pageMeta[Language.LANGUAGE_MAP_KEY]?.items?.mapKeys { it.key.toStringUnescaped() } ?: emptyMap() +public val PageContext.languageMap: Map + get() = pageMeta[Language.LANGUAGE_MAP_KEY]?.items?.mapKeys { it.key.toStringUnescaped() } ?: emptyMap() public fun PageContext.localisedPageRef(pageName: Name, relative: Boolean = false): String { - val prefix = getLanguageMap()[language]?.get(Language::prefix.name)?.string?.parseAsName() ?: Name.EMPTY + val prefix = languageMap[language]?.get(Language::prefix.name)?.string?.parseAsName() ?: Name.EMPTY return resolvePageRef(prefix + pageName, relative) } diff --git a/snark-html/src/jvmMain/kotlin/space/kscience/snark/html/Postprocessor.kt b/snark-html/src/jvmMain/kotlin/space/kscience/snark/html/Postprocessor.kt index 7c23d6a..c77c61f 100644 --- a/snark-html/src/jvmMain/kotlin/space/kscience/snark/html/Postprocessor.kt +++ b/snark-html/src/jvmMain/kotlin/space/kscience/snark/html/Postprocessor.kt @@ -77,9 +77,12 @@ public class Postprocessor( } context(PageContext) -public inline fun FlowContent.postprocess(block: FlowContent.() -> Unit) { +public inline fun FlowContent.postprocess( + processor: TextProcessor = WebPageTextProcessor(page), + block: FlowContent.() -> Unit, +) { val fc = object : FlowContent by this { - override val consumer: TagConsumer<*> = Postprocessor(page, this@postprocess.consumer) + override val consumer: TagConsumer<*> = Postprocessor(page, this@postprocess.consumer, processor) } fc.block() } \ No newline at end of file diff --git a/snark-ktor/src/jvmMain/kotlin/space/kscience/snark/ktor/KtorSiteContext.kt b/snark-ktor/src/jvmMain/kotlin/space/kscience/snark/ktor/KtorSiteContext.kt index c0f8d4d..cad02fb 100644 --- a/snark-ktor/src/jvmMain/kotlin/space/kscience/snark/ktor/KtorSiteContext.kt +++ b/snark-ktor/src/jvmMain/kotlin/space/kscience/snark/ktor/KtorSiteContext.kt @@ -121,8 +121,11 @@ public class KtorSiteContext( "name" put route.toString() "url" put url.buildString() } - val pageContext = - KtorPageContext(this@KtorSiteContext, url.buildString(), Laminate(modifiedPageMeta, siteMeta)) + val pageContext = KtorPageContext( + site = this@KtorSiteContext, + pageBaseUrl = url.buildString(), + pageMeta = Laminate(modifiedPageMeta, siteMeta) + ) //render page in suspend environment val html = HtmlPage.createHtmlString(pageContext, data, content) @@ -157,7 +160,7 @@ public class KtorSiteContext( route = Name.EMPTY, ktorRoute = ktorRoute.createRouteFromPath(route.toWebPath()) ), - data?: DataTree.EMPTY + data ?: DataTree.EMPTY ) with(content) { with(siteContext) { @@ -177,7 +180,7 @@ public fun Route.site( ) { val siteContext = SiteContextWithData( KtorSiteContext(context, siteMeta, baseUrl, route = Name.EMPTY, this@Route), - data?: DataTree.EMPTY + data ?: DataTree.EMPTY ) with(content) { with(siteContext) {