1
0
forked from SPC/spc-site

297 lines
10 KiB
Kotlin
Raw Normal View History

2022-05-13 17:21:06 +03:00
package ru.mipt.spc
import html5up.forty.fortyScripts
import kotlinx.html.*
2022-06-22 12:18:35 +03:00
import space.kscience.dataforge.data.Data
2023-01-08 15:58:20 +03:00
import space.kscience.dataforge.meta.*
2022-06-22 12:18:35 +03:00
import space.kscience.dataforge.names.Name
import space.kscience.dataforge.names.asName
import space.kscience.dataforge.names.startsWith
2022-06-30 20:51:57 +03:00
import space.kscience.snark.html.*
2022-05-13 17:21:06 +03:00
import java.nio.file.Path
2022-06-22 12:18:35 +03:00
import kotlin.reflect.typeOf
2022-05-13 17:21:06 +03:00
context(WebPage) internal fun HTML.spcPageContent(
2022-05-21 13:38:15 +03:00
meta: Meta,
fragment: FlowContent.() -> Unit,
) {
2022-10-04 12:55:05 +03:00
val title by meta.string { SPC_TITLE }
val pageName by meta.string { title }
spcHead(pageName)
2022-05-13 17:21:06 +03:00
body("is-preload") {
wrapper {
div("alt") {
id = "main"
// One
section {
div("inner") {
header("major") {
h1 { +title }
}
2022-05-21 19:21:21 +03:00
meta["image"]?.let { imageMeta ->
2022-05-21 20:10:44 +03:00
val imagePath =
imageMeta.value?.string ?: imageMeta["path"].string ?: error("Image path not provided")
2022-05-21 19:21:21 +03:00
val imageClass = imageMeta["position"].string ?: "main"
span("image $imageClass") {
2022-05-13 17:21:06 +03:00
img {
src = resolveRef(imagePath)
alt = imagePath
}
}
}
2022-05-21 13:38:15 +03:00
fragment()
2022-05-13 17:21:06 +03:00
}
}
}
}
fortyScripts()
}
}
2022-06-22 12:18:35 +03:00
@Suppress("UNCHECKED_CAST")
2023-01-08 15:58:20 +03:00
internal val FortyDataRenderer: DataRenderer = object : DataRenderer {
context(SiteBuilder)
override fun invoke(name: Name, data: Data<Any>) {
if (data.type == typeOf<HtmlFragment>()) {
data as Data<HtmlFragment>
val languageMeta: Meta = DataRenderer.buildLanguageMeta(name)
val dataMeta: Meta = if (languageMeta.isEmpty()) {
data.meta
} else {
data.meta.toMutableMeta().apply {
"language" put languageMeta
}
}
page(name, data.meta) {
spcPageContent(dataMeta) {
htmlData(data)
}
2022-06-22 12:18:35 +03:00
}
2022-06-15 14:53:36 +03:00
}
}
2022-05-13 17:21:06 +03:00
}
2022-05-21 13:38:15 +03:00
context(WebPage) private fun HTML.spcHome() {
2022-05-13 17:21:06 +03:00
spcHead()
body("is-preload") {
wrapper {
// Banner
section("major") {
id = "banner"
div("inner") {
header("major") {
2022-10-04 12:55:05 +03:00
h1 {
+"""Scientific Programming Centre"""
}
2022-05-13 17:21:06 +03:00
}
div("content") {
p {
2022-05-21 20:10:44 +03:00
+"Programming in Science"
2022-05-25 21:23:56 +03:00
br {}
2022-05-21 20:10:44 +03:00
entity(Entities.nbsp)
+"and Science in Programming"
2022-05-13 17:21:06 +03:00
}
ul("actions") {
li {
a(classes = "button next scrolly") {
href = "#master"
+"""Activities"""
}
}
}
}
}
}
// Main
div {
id = "main"
2022-05-25 21:23:56 +03:00
section {
div("inner home_creationinfo") {
2022-05-25 21:23:56 +03:00
a(href = "https://mipt.ru/education/departments/fpmi/") {
span("image") {
2022-05-25 21:23:56 +03:00
img {
src = "images/FPMI.jpg"
alt = "FPMI"
2022-10-04 12:55:05 +03:00
height = "60dp"
width = "60dp"
2022-05-25 21:23:56 +03:00
}
}
}
p {
+"Centre was created in 2022 based on the Phystech School of Applied Mathematics and Informatics at MIPT"
}
}
}
section {
div("inner") {
header("major") {
h2 { +"Science + education + industry" }
}
p {
+"""
Our mission is to bring together science, education and industry and
work on better software solutions for science and better science in
software development.
""".trimIndent()
}
// ul("actions") {
// li {
// a(classes = "button next") {
// href = "landing.html"
// +"""Get Started"""
// }
// }
// }
}
}
2022-05-13 17:21:06 +03:00
section("tiles") {
id = "master"
article {
span("image") {
img {
src = resolveRef("images/pic01.jpg")
alt = ""
}
}
header("major") {
h3 {
a(classes = "link") {
2022-09-03 18:39:06 +03:00
href = resolvePageRef("education")
+"""Education"""
2022-05-13 17:21:06 +03:00
}
}
2022-09-03 18:39:06 +03:00
p { +""" Educational projects""" }
2022-05-13 17:21:06 +03:00
}
}
article {
span("image") {
img {
src = resolveRef("images/pic02.jpg")
alt = ""
}
}
header("major") {
h3 {
a(classes = "link") {
2022-06-24 16:39:10 +03:00
href = resolvePageRef("research")
2022-05-13 17:21:06 +03:00
+"""Research"""
}
}
p {
2022-05-21 19:21:21 +03:00
+"""Fundamental and applied research in analysis, scientific software design and data acquisition and control systems."""
2022-05-13 17:21:06 +03:00
}
}
}
article {
span("image") {
img {
src = resolveRef("images/pic03.jpg")
alt = ""
}
}
header("major") {
h3 {
a(classes = "link") {
2022-06-24 18:46:15 +03:00
href = resolvePageRef("consulting.index")
2022-05-13 17:21:06 +03:00
+"""Consulting"""
}
}
p { +"""Consultations, review and support of scientific software systems.""" }
}
}
article {
span("image") {
img {
src = resolveRef("images/pic04.jpg")
alt = ""
}
}
header("major") {
h3 {
a(classes = "link") {
2022-06-24 16:39:10 +03:00
href = resolvePageRef("team")
2022-05-13 17:21:06 +03:00
+"""Team"""
}
}
}
}
// article {
// span("image") {
// img {
// src = "images/pic05.jpg"
// alt = ""
// }
// }
// header("major") {
// h3 {
// a(classes = "link") {
// href = "landing.html"
// +"""Consequat"""
// }
// }
// p { +"""Ipsum dolor sit amet""" }
// }
// }
// article {
// span("image") {
// img {
// src = "images/pic06.jpg"
// alt = ""
// }
// }
// header("major") {
// h3 {
// a(classes = "link") {
// href = "landing.html"
// +"""Etiam"""
// }
// }
// p { +"""Feugiat amet tempus""" }
// }
// }
}
}
}
fortyScripts()
}
}
internal fun SiteBuilder.spcHome(dataPath: Path, prefix: Name = Name.EMPTY) {
2022-05-13 17:21:06 +03:00
val homePageData = snark.readDirectory(dataPath.resolve("content"))
2022-05-13 17:21:06 +03:00
2023-01-08 15:58:20 +03:00
site(prefix, homePageData) {
file(dataPath.resolve("assets"))
file(dataPath.resolve("images"))
file(dataPath.resolve("../common"), "")
2022-05-13 17:21:06 +03:00
2023-01-08 15:58:20 +03:00
withLanguages(
"en" to "",
"ru" to "ru"
) {
page { spcHome() }
2022-05-13 17:21:06 +03:00
2023-01-08 15:58:20 +03:00
pages("consulting", dataRenderer = FortyDataRenderer)
2022-05-13 17:21:06 +03:00
2023-01-08 15:58:20 +03:00
pages("education", dataRenderer = FortyDataRenderer)
2022-09-03 18:39:06 +03:00
2023-01-08 15:58:20 +03:00
spcSpotlight("team") { _, meta ->
meta["type"].string == "team"
}
2022-09-03 18:39:06 +03:00
2023-01-08 15:58:20 +03:00
spcSpotlight("research") { name, meta ->
name.startsWith("projects".asName()) && meta["type"].string == "project"
}
2022-05-13 17:21:06 +03:00
}
}
}