forked from SPC/spc-site
Complete refactor to new routing API
This commit is contained in:
parent
c15a0ea948
commit
218e76a2a8
@ -2,6 +2,7 @@ package ru.mipt.spc
|
|||||||
|
|
||||||
import kotlinx.coroutines.runBlocking
|
import kotlinx.coroutines.runBlocking
|
||||||
import kotlinx.html.*
|
import kotlinx.html.*
|
||||||
|
import space.kscience.dataforge.data.DataTree
|
||||||
import space.kscience.dataforge.data.await
|
import space.kscience.dataforge.data.await
|
||||||
import space.kscience.dataforge.data.getByType
|
import space.kscience.dataforge.data.getByType
|
||||||
import space.kscience.dataforge.meta.Meta
|
import space.kscience.dataforge.meta.Meta
|
||||||
@ -280,9 +281,9 @@ private val HtmlData.mentorPageId get() = "mentor-${id}"
|
|||||||
|
|
||||||
internal fun SiteBuilder.spcMaster(dataPath: Path, prefix: Name = "magprog".asName()) {
|
internal fun SiteBuilder.spcMaster(dataPath: Path, prefix: Name = "magprog".asName()) {
|
||||||
|
|
||||||
val magProgSiteContext = snark.readDirectory(dataPath.resolve("content"))
|
val magProgData: DataTree<Any> = snark.readDirectory(dataPath.resolve("content"))
|
||||||
|
|
||||||
route(prefix, magProgSiteContext, setAsRoot = true) {
|
route(prefix, magProgData, setAsRoot = true) {
|
||||||
assetDirectory("assets", dataPath.resolve("assets"))
|
assetDirectory("assets", dataPath.resolve("assets"))
|
||||||
assetDirectory("images", dataPath.resolve("images"))
|
assetDirectory("images", dataPath.resolve("images"))
|
||||||
|
|
||||||
@ -356,57 +357,57 @@ internal fun SiteBuilder.spcMaster(dataPath: Path, prefix: Name = "magprog".asNa
|
|||||||
magProgFooter()
|
magProgFooter()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
val mentors = data.findByContentType("magprog_mentor").values.sortedBy {
|
val mentors = data.findByContentType("magprog_mentor").values.sortedBy {
|
||||||
it.order
|
it.order
|
||||||
}
|
}
|
||||||
|
|
||||||
mentors.forEach { mentor ->
|
mentors.forEach { mentor ->
|
||||||
page(mentor.mentorPageId.asName()) {
|
page(mentor.mentorPageId.asName()) {
|
||||||
|
|
||||||
magProgHead("Научное программирование: ${mentor.name}")
|
magProgHead("Научное программирование: ${mentor.name}")
|
||||||
body("is-preload") {
|
body("is-preload") {
|
||||||
header {
|
header {
|
||||||
id = "header"
|
id = "header"
|
||||||
a(classes = "title") {
|
a(classes = "title") {
|
||||||
href = "$homeRef#mentors"
|
href = "$homeRef#mentors"
|
||||||
+"Научные руководители"
|
+"Научные руководители"
|
||||||
}
|
}
|
||||||
nav {
|
nav {
|
||||||
ul {
|
ul {
|
||||||
mentors.forEach {
|
mentors.forEach {
|
||||||
li {
|
li {
|
||||||
a {
|
a {
|
||||||
href = resolvePageRef(it.mentorPageId)
|
href = resolvePageRef(it.mentorPageId)
|
||||||
+it.name.substringAfterLast(" ")
|
+it.name.substringAfterLast(" ")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
div {
|
||||||
div {
|
id = "wrapper"
|
||||||
id = "wrapper"
|
section("wrapper") {
|
||||||
section("wrapper") {
|
id = "main"
|
||||||
id = "main"
|
div("inner") {
|
||||||
div("inner") {
|
h1("major") { +mentor.name }
|
||||||
h1("major") { +mentor.name }
|
val imageClass = mentor.meta["image.position"].string ?: "left"
|
||||||
val imageClass = mentor.meta["image.position"].string ?: "left"
|
span("image $imageClass") {
|
||||||
span("image $imageClass") {
|
mentor.imagePath?.let { photoPath ->
|
||||||
mentor.imagePath?.let { photoPath ->
|
img(
|
||||||
img(
|
src = resolveRef(photoPath),
|
||||||
src = resolveRef(photoPath),
|
alt = mentor.name
|
||||||
alt = mentor.name
|
)
|
||||||
)
|
}
|
||||||
}
|
}
|
||||||
|
htmlData(mentor)
|
||||||
}
|
}
|
||||||
htmlData(mentor)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
magProgFooter()
|
||||||
}
|
}
|
||||||
magProgFooter()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -150,7 +150,7 @@ context(PageBuilder) private fun HTML.spcHome() {
|
|||||||
header("major") {
|
header("major") {
|
||||||
h3 {
|
h3 {
|
||||||
a(classes = "link") {
|
a(classes = "link") {
|
||||||
href = resolvePageRef("magprog")
|
href = resolvePageRef("magprog.index")
|
||||||
+"""Master's program"""
|
+"""Master's program"""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,8 @@ import space.kscience.dataforge.data.DataTree
|
|||||||
import space.kscience.dataforge.meta.Meta
|
import space.kscience.dataforge.meta.Meta
|
||||||
import space.kscience.dataforge.meta.withDefault
|
import space.kscience.dataforge.meta.withDefault
|
||||||
import space.kscience.dataforge.names.Name
|
import space.kscience.dataforge.names.Name
|
||||||
|
import space.kscience.dataforge.names.cutLast
|
||||||
|
import space.kscience.dataforge.names.endsWith
|
||||||
import java.nio.file.Path
|
import java.nio.file.Path
|
||||||
import kotlin.contracts.InvocationKind
|
import kotlin.contracts.InvocationKind
|
||||||
import kotlin.contracts.contract
|
import kotlin.contracts.contract
|
||||||
@ -57,7 +59,11 @@ internal class KtorSiteBuilder(
|
|||||||
|
|
||||||
override fun resolveRef(ref: String): String = resolveRef(pageBaseUrl, ref)
|
override fun resolveRef(ref: String): String = resolveRef(pageBaseUrl, ref)
|
||||||
|
|
||||||
override fun resolvePageRef(pageName: Name): String = resolveRef(pageName.tokens.joinToString(separator = "/"))
|
override fun resolvePageRef(pageName: Name): String = if(pageName.endsWith(SiteBuilder.INDEX_PAGE_TOKEN)){
|
||||||
|
resolveRef(pageName.cutLast().tokens.joinToString(separator = "/"))
|
||||||
|
} else {
|
||||||
|
resolveRef(pageName.tokens.joinToString(separator = "/"))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun page(route: Name, content: context(PageBuilder, HTML)() -> Unit) {
|
override fun page(route: Name, content: context(PageBuilder, HTML)() -> Unit) {
|
||||||
|
@ -25,7 +25,7 @@ interface PageBuilder : ContextAware {
|
|||||||
|
|
||||||
fun PageBuilder.resolvePageRef(pageName: String) = resolvePageRef(pageName.parseAsName())
|
fun PageBuilder.resolvePageRef(pageName: String) = resolvePageRef(pageName.parseAsName())
|
||||||
|
|
||||||
val PageBuilder.homeRef get() = resolvePageRef(Name.EMPTY)
|
val PageBuilder.homeRef get() = resolvePageRef(Name.EMPTY).removeSuffix("/")
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Resolve a Html builder by its full name
|
* Resolve a Html builder by its full name
|
||||||
|
@ -56,19 +56,23 @@ internal class StaticSiteBuilder(
|
|||||||
javaClass.getResource(resourcesPath)?.let { Path.of(it.toURI()) }?.copyRecursively(path)
|
javaClass.getResource(resourcesPath)?.let { Path.of(it.toURI()) }?.copyRecursively(path)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun resolveRef(baseUrl: String, ref: String) = if (baseUrl.isEmpty()) {
|
||||||
|
ref
|
||||||
|
} else {
|
||||||
|
"${baseUrl.removeSuffix("/")}/$ref"
|
||||||
|
}
|
||||||
|
|
||||||
inner class StaticPageBuilder : PageBuilder {
|
inner class StaticPageBuilder : PageBuilder {
|
||||||
override val data: DataTree<*> get() = this@StaticSiteBuilder.data
|
override val data: DataTree<*> get() = this@StaticSiteBuilder.data
|
||||||
override val meta: Meta get() = this@StaticSiteBuilder.meta
|
override val meta: Meta get() = this@StaticSiteBuilder.meta
|
||||||
override val context: Context get() = this@StaticSiteBuilder.context
|
override val context: Context get() = this@StaticSiteBuilder.context
|
||||||
|
|
||||||
|
|
||||||
override fun resolveRef(ref: String): String {
|
override fun resolveRef(ref: String): String = resolveRef(baseUrl, ref)
|
||||||
TODO("Not yet implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun resolvePageRef(pageName: Name): String {
|
override fun resolvePageRef(pageName: Name): String = resolveRef(
|
||||||
TODO("Not yet implemented")
|
pageName.tokens.joinToString(separator = "/", postfix = ".html")
|
||||||
}
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -98,14 +102,23 @@ internal class StaticSiteBuilder(
|
|||||||
snark = snark,
|
snark = snark,
|
||||||
data = dataOverride ?: data,
|
data = dataOverride ?: data,
|
||||||
meta = metaOverride?.withDefault(meta) ?: meta,
|
meta = metaOverride?.withDefault(meta) ?: meta,
|
||||||
baseUrl = baseUrl,
|
baseUrl = if (setAsRoot) {
|
||||||
|
resolveRef(baseUrl, routeName.toWebPath())
|
||||||
|
} else {
|
||||||
|
baseUrl
|
||||||
|
},
|
||||||
path = path.resolve(routeName.toWebPath())
|
path = path.resolve(routeName.toWebPath())
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun SnarkPlugin.static(outputPath: Path, data: DataTree<*> = DataTree.empty(), block: SiteBuilder.() -> Unit) {
|
fun SnarkPlugin.static(
|
||||||
|
outputPath: Path,
|
||||||
|
data: DataTree<*> = DataTree.empty(),
|
||||||
|
siteUrl: String = outputPath.absolutePathString(),
|
||||||
|
block: SiteBuilder.() -> Unit,
|
||||||
|
) {
|
||||||
contract {
|
contract {
|
||||||
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
|
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
|
||||||
}
|
}
|
||||||
StaticSiteBuilder(this, data, meta, "", outputPath).block()
|
StaticSiteBuilder(this, data, meta, siteUrl, outputPath).block()
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user