From 395fea432edde02545c44a798d16112c58e44745 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Thu, 29 Feb 2024 09:29:24 +0300 Subject: [PATCH] Implement parent context and proper language switch --- .../kotlin/space/kscience/snark/DataTreeWithDefault.kt | 2 +- .../kotlin/space/kscience/snark/html/Language.kt | 2 +- .../kotlin/space/kscience/snark/html/PageContext.kt | 6 +++--- .../kotlin/space/kscience/snark/html/SiteContext.kt | 3 +++ .../kscience/snark/html/static/StaticSiteContext.kt | 10 +++++++--- .../space/kscience/snark/ktor/KtorSiteContext.kt | 10 +++++++--- 6 files changed, 22 insertions(+), 11 deletions(-) diff --git a/snark-core/src/commonMain/kotlin/space/kscience/snark/DataTreeWithDefault.kt b/snark-core/src/commonMain/kotlin/space/kscience/snark/DataTreeWithDefault.kt index 2fc5aca..fb3dddc 100644 --- a/snark-core/src/commonMain/kotlin/space/kscience/snark/DataTreeWithDefault.kt +++ b/snark-core/src/commonMain/kotlin/space/kscience/snark/DataTreeWithDefault.kt @@ -6,7 +6,7 @@ import space.kscience.dataforge.data.GenericDataTree import space.kscience.dataforge.names.NameToken import kotlin.reflect.KType -public class DataTreeWithDefault(public val tree: DataTree, val default: DataTree) : +public class DataTreeWithDefault(public val tree: DataTree, public val default: DataTree) : DataTree { override val dataType: KType get() = tree.dataType 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 d18cd9a..452ce8a 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 @@ -115,7 +115,7 @@ private class LanguageMapAction(val languages: Set) : AbstractAction val languageMapMeta = Meta { languageMap.keys.forEach { language -> - set(language.key, (language.route + nodeName).toWebPath()) + set(language.key, (language.route + nodeName).toString()) } } languageMap.forEach { (language, node) -> diff --git a/snark-html/src/jvmMain/kotlin/space/kscience/snark/html/PageContext.kt b/snark-html/src/jvmMain/kotlin/space/kscience/snark/html/PageContext.kt index 32af306..d391441 100644 --- a/snark-html/src/jvmMain/kotlin/space/kscience/snark/html/PageContext.kt +++ b/snark-html/src/jvmMain/kotlin/space/kscience/snark/html/PageContext.kt @@ -56,7 +56,7 @@ public interface PageContext : SnarkContext { * * @param relative if true, add [SiteContext] route to the absolute page name */ - public fun resolvePageRef(pageName: Name): String + public fun resolvePageRef(pageName: Name, targetSite: SiteContext = site): String public fun resolveRelativePageRef(pageName: Name): String = resolvePageRef(pageRoute + pageName) @@ -66,8 +66,8 @@ context(PageContext) public val page: PageContext get() = this@PageContext -public fun PageContext.resolvePageRef(pageName: String): String = - resolvePageRef(pageName.parseAsName()) +public fun PageContext.resolvePageRef(pageName: String, targetSite: SiteContext = site): String = + resolvePageRef(pageName.parseAsName(), targetSite) public val PageContext.homeRef: String get() = resolvePageRef(Name.EMPTY) diff --git a/snark-html/src/jvmMain/kotlin/space/kscience/snark/html/SiteContext.kt b/snark-html/src/jvmMain/kotlin/space/kscience/snark/html/SiteContext.kt index 4cba079..3722902 100644 --- a/snark-html/src/jvmMain/kotlin/space/kscience/snark/html/SiteContext.kt +++ b/snark-html/src/jvmMain/kotlin/space/kscience/snark/html/SiteContext.kt @@ -15,6 +15,9 @@ import space.kscience.snark.SnarkContext */ @SnarkBuilder public interface SiteContext : SnarkContext { + + public val parent: SiteContext? + /** * A context path segments for this site */ diff --git a/snark-html/src/jvmMain/kotlin/space/kscience/snark/html/static/StaticSiteContext.kt b/snark-html/src/jvmMain/kotlin/space/kscience/snark/html/static/StaticSiteContext.kt index 89b6cce..dd40488 100644 --- a/snark-html/src/jvmMain/kotlin/space/kscience/snark/html/static/StaticSiteContext.kt +++ b/snark-html/src/jvmMain/kotlin/space/kscience/snark/html/static/StaticSiteContext.kt @@ -26,6 +26,7 @@ internal class StaticSiteContext( private val baseUrl: Url, override val path: List, override val siteRoute: Name, + override val parent: SiteContext?, private val outputPath: Path, ) : SiteContext { @@ -98,8 +99,9 @@ internal class StaticSiteContext( override val pageMeta: Meta, ) : PageContext { - override fun resolvePageRef(pageName: Name): String = resolveRef( - pageName.toWebPath() + ".html" + override fun resolvePageRef(pageName: Name, targetSite: SiteContext): String = resolveRef( + pageName.toWebPath() + ".html", + targetSite ) } @@ -129,6 +131,7 @@ internal class StaticSiteContext( baseUrl = baseUrl, path = emptyList(), siteRoute = route, + parent = parent, outputPath = outputPath.resolve(route.toWebPath()) ), data ?: DataTree.EMPTY @@ -147,6 +150,7 @@ internal class StaticSiteContext( baseUrl = baseUrl, path = emptyList(), siteRoute = route, + parent = this, outputPath = outputPath.resolve(route.toWebPath()) ), data ?: DataTree.EMPTY @@ -174,7 +178,7 @@ public suspend fun SnarkHtml.staticSite( content: HtmlSite, ) { val siteContextWithData = SiteContextWithData( - StaticSiteContext(siteMeta, siteUrl, emptyList(), Name.EMPTY, outputPath), + StaticSiteContext(siteMeta, siteUrl, emptyList(), Name.EMPTY, null, outputPath), data ?: DataTree.EMPTY ) with(content) { 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 ae753d4..ddd697d 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 @@ -39,6 +39,7 @@ internal class KtorSiteContext( override val siteMeta: Meta, override val path: List, override val siteRoute: Name, + override val parent: SiteContext?, private val ktorRoute: Route, ) : SiteContext, ContextAware { @@ -84,11 +85,12 @@ internal class KtorSiteContext( override fun resolvePageRef( pageName: Name, + targetSite: SiteContext, ): String { return if (pageName.endsWith(SiteContext.INDEX_PAGE_TOKEN)) { - resolveRef(pageName.cutLast().toWebPath()) + resolveRef(pageName.cutLast().toWebPath(), targetSite) } else { - resolveRef(pageName.toWebPath()) + resolveRef(pageName.toWebPath(), targetSite) } } } @@ -135,6 +137,7 @@ internal class KtorSiteContext( siteMeta = Laminate(siteMeta, this@KtorSiteContext.siteMeta), path = path, siteRoute = route, + parent, ktorRoute = ktorRoute.createRouteFromPath(route.toWebPath()) ), data ?: DataTree.EMPTY @@ -153,6 +156,7 @@ internal class KtorSiteContext( siteMeta = Laminate(siteMeta, this@KtorSiteContext.siteMeta), path = path + route.tokens.map { it.toStringUnescaped() }, siteRoute = Name.EMPTY, + this, ktorRoute = ktorRoute.createRouteFromPath(route.toWebPath()) ), data ?: DataTree.EMPTY @@ -174,7 +178,7 @@ public fun Route.site( content: HtmlSite, ) { val siteContext = SiteContextWithData( - KtorSiteContext(context, siteMeta, path = path, siteRoute = Name.EMPTY, this@Route), + KtorSiteContext(context, siteMeta, path = path, siteRoute = Name.EMPTY, null, this@Route), data ?: DataTree.EMPTY ) with(content) {