1
0
forked from SPC/spc-site

39 lines
1.3 KiB
Kotlin
Raw Normal View History

2022-05-13 17:21:06 +03:00
package ru.mipt.spc
import kotlinx.html.TagConsumer
import space.kscience.dataforge.actions.AbstractAction
import space.kscience.dataforge.data.Data
import space.kscience.dataforge.data.DataSet
import space.kscience.dataforge.data.DataSetBuilder
import space.kscience.dataforge.meta.Meta
import space.kscience.dataforge.meta.copy
import space.kscience.dataforge.names.Name
2022-05-14 11:08:28 +03:00
import space.kscience.snark.HtmlData
import space.kscience.snark.HtmlFragment
import space.kscience.snark.PageContext
2022-05-13 17:21:06 +03:00
import kotlin.reflect.typeOf
2022-05-14 11:08:28 +03:00
class SiteBuilderAction : AbstractAction<Any, HtmlFragment>(typeOf<HtmlFragment>()) {
2022-05-13 17:21:06 +03:00
private val pageBuilders = HashMap<Name, (DataSet<*>) -> HtmlData>()
fun page(name: Name, meta: Meta = Meta.EMPTY, builder: context(PageContext) TagConsumer<*>.() -> Unit) {
val prefix = name.tokens.joinToString(separator = "/", prefix = "/")
pageBuilders[name] = { dataset ->
val fragment: HtmlFragment = {
2022-05-14 11:08:28 +03:00
builder.invoke(PageContext(prefix, dataset), this)
2022-05-13 17:21:06 +03:00
}
Data(fragment, meta.copy {
"name" put name.toString()
})
}
}
override fun DataSetBuilder<HtmlFragment>.generate(data: DataSet<Any>, meta: Meta) {
pageBuilders.forEach { (name, builder) ->
data(name, builder(data))
}
}
}