From 4024eed50ffe8bd8e370c55bcf6aaaba45a9fd2d Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 26 Jun 2022 13:14:57 +0300 Subject: [PATCH 1/5] Update readme --- README.md | 2 +- build.gradle.kts | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9dc14b2..23342f3 100644 --- a/README.md +++ b/README.md @@ -19,4 +19,4 @@ The idea is the following: ## References -Currently we use two different designs from https://html5up.net/ \ No newline at end of file +Currently, we use two different designs from https://html5up.net/ \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 5fb6820..8ae028e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -12,7 +12,7 @@ repositories { } group = "ru.mipt.npm" -version = "0.1.0-SNAPSHOT" +version = "0.1.0" application { mainClass.set("io.ktor.server.netty.EngineMain") @@ -58,6 +58,20 @@ sourceSets { } } +readme { + maturity = ru.mipt.npm.gradle.Maturity.EXPERIMENTAL + feature("data") { "Data-based processing. Instead of traditional layout-based" } + feature("layouts") { "Use custom layouts to represent a data tree" } + feature("parsers") { "Add custom file formats and parsers using DataForge dependency injection" } + feature("preprocessor") { "Preprocessing text files using templates" } + feature("metadata") { "Trademark DataForge metadata layering and transformations" } + feature("dynamic") { "Generating dynamic site using KTor server" } + feature("static") { "Generating static site" } +} + +/** + * This task updates the site build date in resource automatically + */ val writeBuildDate: Task by tasks.creating { doLast { val deployDate = LocalDateTime.now() From eb81d46238dd4ce2cbc7006631c07c7b15c197cc Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Thu, 30 Jun 2022 20:51:57 +0300 Subject: [PATCH 2/5] Spliting site and the snark project --- build.gradle.kts | 57 ++----- buildSrc/build.gradle.kts | 12 -- buildSrc/settings.gradle.kts | 7 - buildSrc/src/main/kotlin/uploads.kt | 99 ------------ settings.gradle.kts | 8 +- src/main/kotlin/html5up/forty/common.kt | 4 +- src/main/kotlin/html5up/forty/landing.kt | 4 +- src/main/kotlin/html5up/forty/page.kt | 4 +- src/main/kotlin/ru/mipt/spc/Application.kt | 4 +- src/main/kotlin/ru/mipt/spc/master.kt | 22 +-- src/main/kotlin/ru/mipt/spc/spcCollection.kt | 4 +- src/main/kotlin/ru/mipt/spc/spcHome.kt | 6 +- src/main/kotlin/ru/mipt/spc/spcMisc.kt | 14 +- src/main/kotlin/ru/mipt/spc/staticRender.kt | 6 +- .../kotlin/space/kscience/snark/HtmlData.kt | 34 ---- .../space/kscience/snark/KtorSiteBuilder.kt | 135 ---------------- .../space/kscience/snark/PageBuilder.kt | 65 -------- .../space/kscience/snark/SiteBuilder.kt | 97 ----------- .../kotlin/space/kscience/snark/SiteLayout.kt | 150 ------------------ .../space/kscience/snark/SnarkPlugin.kt | 146 ----------------- .../space/kscience/snark/SnarkTextParser.kt | 68 -------- .../space/kscience/snark/StaticSiteBuilder.kt | 126 --------------- .../kscience/snark/TextTransformation.kt | 38 ----- 23 files changed, 53 insertions(+), 1057 deletions(-) delete mode 100644 buildSrc/build.gradle.kts delete mode 100644 buildSrc/settings.gradle.kts delete mode 100644 buildSrc/src/main/kotlin/uploads.kt delete mode 100644 src/main/kotlin/space/kscience/snark/HtmlData.kt delete mode 100644 src/main/kotlin/space/kscience/snark/KtorSiteBuilder.kt delete mode 100644 src/main/kotlin/space/kscience/snark/PageBuilder.kt delete mode 100644 src/main/kotlin/space/kscience/snark/SiteBuilder.kt delete mode 100644 src/main/kotlin/space/kscience/snark/SiteLayout.kt delete mode 100644 src/main/kotlin/space/kscience/snark/SnarkPlugin.kt delete mode 100644 src/main/kotlin/space/kscience/snark/SnarkTextParser.kt delete mode 100644 src/main/kotlin/space/kscience/snark/StaticSiteBuilder.kt delete mode 100644 src/main/kotlin/space/kscience/snark/TextTransformation.kt diff --git a/build.gradle.kts b/build.gradle.kts index 8ae028e..f1272e5 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,16 +1,16 @@ import ru.mipt.npm.gradle.KScienceVersions -import java.time.LocalDateTime +import space.kscience.snark.plugin.JSch +import space.kscience.snark.plugin.execute +import space.kscience.snark.plugin.uploadDirectory +import space.kscience.snark.plugin.useSession plugins { id("ru.mipt.npm.gradle.project") id("ru.mipt.npm.gradle.jvm") + id("space.kscience.snark") application } -repositories { - mavenLocal() -} - group = "ru.mipt.npm" version = "0.1.0" @@ -21,23 +21,14 @@ application { applicationDefaultJvmArgs = listOf("-Dio.ktor.development=$isDevelopment", "-Xmx200M") } - -val dataforgeVersion by extra("0.6.0-dev-9") +val snarkVersion by extra("0.1.0-dev-1") val ktorVersion = KScienceVersions.ktorVersion dependencies { - implementation("io.ktor:ktor-server-core:$ktorVersion") - implementation("org.jetbrains.kotlinx:kotlinx-html:0.7.5") - implementation("io.ktor:ktor-server-html-builder:$ktorVersion") - implementation("org.jetbrains.kotlin-wrappers:kotlin-css") - implementation("io.ktor:ktor-server-host-common:$ktorVersion") - implementation("io.ktor:ktor-server-status-pages:$ktorVersion") + implementation("space.kscience:snark-ktor:$snarkVersion") + implementation("io.ktor:ktor-server-netty:$ktorVersion") implementation("io.ktor:ktor-server-http-redirect:$ktorVersion") - implementation("ch.qos.logback:logback-classic:1.2.11") - implementation("space.kscience:dataforge-workspace:$dataforgeVersion") - implementation("space.kscience:dataforge-io-yaml:$dataforgeVersion") - implementation("org.jetbrains:markdown:0.3.1") testImplementation("io.ktor:ktor-server-tests:$ktorVersion") } @@ -46,6 +37,10 @@ kotlin { explicitApi = org.jetbrains.kotlin.gradle.dsl.ExplicitApiMode.Disabled } +apiValidation{ + validationDisabled = true +} + tasks.withType { kotlinOptions { freeCompilerArgs = freeCompilerArgs + "-Xcontext-receivers" @@ -58,34 +53,6 @@ sourceSets { } } -readme { - maturity = ru.mipt.npm.gradle.Maturity.EXPERIMENTAL - feature("data") { "Data-based processing. Instead of traditional layout-based" } - feature("layouts") { "Use custom layouts to represent a data tree" } - feature("parsers") { "Add custom file formats and parsers using DataForge dependency injection" } - feature("preprocessor") { "Preprocessing text files using templates" } - feature("metadata") { "Trademark DataForge metadata layering and transformations" } - feature("dynamic") { "Generating dynamic site using KTor server" } - feature("static") { "Generating static site" } -} - -/** - * This task updates the site build date in resource automatically - */ -val writeBuildDate: Task by tasks.creating { - doLast { - val deployDate = LocalDateTime.now() - val file = File(project.buildDir, "resources/main/buildDate") - file.parentFile.mkdirs() - file.writeText(deployDate.toString()) - } - outputs.file("resources/main/buildDate") - outputs.upToDateWhen { false } -} - -//write build time in build to check outdated external data directory -tasks.getByName("processResources").dependsOn(writeBuildDate) - /* Upload with JSch */ val host = System.getenv("SPC_HOST") diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts deleted file mode 100644 index 48b2cf5..0000000 --- a/buildSrc/build.gradle.kts +++ /dev/null @@ -1,12 +0,0 @@ -plugins{ - `kotlin-dsl` -} - -repositories{ - mavenCentral() - gradlePluginPortal() -} - -dependencies{ - implementation("com.github.mwiede:jsch:0.2.1") -} \ No newline at end of file diff --git a/buildSrc/settings.gradle.kts b/buildSrc/settings.gradle.kts deleted file mode 100644 index 10374ea..0000000 --- a/buildSrc/settings.gradle.kts +++ /dev/null @@ -1,7 +0,0 @@ -dependencyResolutionManagement { - repositories { - maven("https://repo.kotlin.link") - mavenCentral() - gradlePluginPortal() - } -} \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/uploads.kt b/buildSrc/src/main/kotlin/uploads.kt deleted file mode 100644 index 19df10a..0000000 --- a/buildSrc/src/main/kotlin/uploads.kt +++ /dev/null @@ -1,99 +0,0 @@ -import com.jcraft.jsch.* -import java.io.File -import java.io.FileInputStream -import java.util.* - - -/** - * https://kodehelp.com/java-program-uploading-folder-content-recursively-from-local-to-sftp-server/ - */ -private fun ChannelSftp.recursiveFolderUpload(sourceFile: File, destinationPath: String) { - if (sourceFile.isFile) { - // copy if it is a file - cd(destinationPath) - if (!sourceFile.name.startsWith(".")) put( - FileInputStream(sourceFile), - sourceFile.getName(), - ChannelSftp.OVERWRITE - ) - } else { - val files = sourceFile.listFiles() - if (files != null && !sourceFile.getName().startsWith(".")) { - cd(destinationPath) - var attrs: SftpATTRS? = null - // check if the directory is already existing - val directoryPath = destinationPath + "/" + sourceFile.getName() - try { - attrs = stat(directoryPath) - } catch (e: Exception) { - println("$directoryPath does not exist") - } - - // else create a directory - if (attrs != null) { - println("Directory $directoryPath exists IsDir=${attrs.isDir()}") - } else { - println("Creating directory $directoryPath") - mkdir(sourceFile.getName()) - } - for (f in files) { - recursiveFolderUpload(f, destinationPath + "/" + sourceFile.getName()) - } - } - } -} - -fun Session.uploadDirectory( - file: File, - targetDirectory: String, -) { - var channel: ChannelSftp? = null - try { - val config = Properties() - config["StrictHostKeyChecking"] = "no" - channel = openChannel("sftp") as ChannelSftp // Open SFTP Channel - channel.connect() - channel.cd(targetDirectory) // Change Directory on SFTP Server - channel.recursiveFolderUpload(file, targetDirectory) - } finally { - channel?.disconnect() - } -} - -fun Session.execute( - command: String, -): String { - var channel: ChannelExec? = null - try { - channel = openChannel("exec") as ChannelExec - channel.setCommand(command) - channel.inputStream = null - channel.setErrStream(System.err) - val input = channel.inputStream - channel.connect() - return input.use { it.readAllBytes().decodeToString() } - } finally { - channel?.disconnect() - } -} - -inline fun JSch.useSession( - host: String, - user: String, - port: Int = 22, - block: Session.() -> Unit, -) { - var session: Session? = null - try { - session = getSession(user, host, port) - val config = Properties() - config["StrictHostKeyChecking"] = "no" - session.setConfig(config) - session.connect() - session.block() - } finally { - session?.disconnect() - } -} - -fun JSch(configuration: JSch.() -> Unit): JSch = JSch().apply(configuration) diff --git a/settings.gradle.kts b/settings.gradle.kts index 5841487..285a551 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -8,7 +8,6 @@ pluginManagement { val toolsVersion: String by extra repositories { - mavenLocal() maven("https://repo.kotlin.link") mavenCentral() gradlePluginPortal() @@ -19,6 +18,7 @@ pluginManagement { id("ru.mipt.npm.gradle.mpp") version toolsVersion id("ru.mipt.npm.gradle.jvm") version toolsVersion id("ru.mipt.npm.gradle.js") version toolsVersion + id("space.kscience.snark") version "0.1.0-dev-1" } } @@ -27,7 +27,6 @@ dependencyResolutionManagement { val toolsVersion: String by extra repositories { - mavenLocal() maven("https://repo.kotlin.link") mavenCentral() } @@ -37,4 +36,9 @@ dependencyResolutionManagement { from("ru.mipt.npm:version-catalog:$toolsVersion") } } +} + +val snarkProjectDirectory = File("../snark") +if(snarkProjectDirectory.exists()) { + includeBuild("../snark") } \ No newline at end of file diff --git a/src/main/kotlin/html5up/forty/common.kt b/src/main/kotlin/html5up/forty/common.kt index 753294f..16c7be1 100644 --- a/src/main/kotlin/html5up/forty/common.kt +++ b/src/main/kotlin/html5up/forty/common.kt @@ -1,7 +1,7 @@ package html5up.forty import kotlinx.html.* -import space.kscience.snark.PageBuilder +import space.kscience.snark.html.Page internal fun FlowContent.fortyMenu() { @@ -200,7 +200,7 @@ internal fun FlowContent.fortyFooter() { } } -context(PageBuilder) internal fun BODY.fortyScripts() { +context(Page) internal fun BODY.fortyScripts() { script { src = resolveRef("assets/js/jquery.min.js") } diff --git a/src/main/kotlin/html5up/forty/landing.kt b/src/main/kotlin/html5up/forty/landing.kt index 6bd9f8d..82e18ef 100644 --- a/src/main/kotlin/html5up/forty/landing.kt +++ b/src/main/kotlin/html5up/forty/landing.kt @@ -1,9 +1,9 @@ package html5up.forty import kotlinx.html.* -import space.kscience.snark.PageBuilder +import space.kscience.snark.html.Page -context(PageBuilder) internal fun HTML.landing(){ +context(Page) internal fun HTML.landing(){ head { title { } diff --git a/src/main/kotlin/html5up/forty/page.kt b/src/main/kotlin/html5up/forty/page.kt index d7986df..7bb7724 100644 --- a/src/main/kotlin/html5up/forty/page.kt +++ b/src/main/kotlin/html5up/forty/page.kt @@ -1,9 +1,9 @@ package html5up.forty import kotlinx.html.* -import space.kscience.snark.PageBuilder +import space.kscience.snark.html.Page -context(PageBuilder) internal fun HTML.fortyPage(){ +context(Page) internal fun HTML.fortyPage(){ head { title { } diff --git a/src/main/kotlin/ru/mipt/spc/Application.kt b/src/main/kotlin/ru/mipt/spc/Application.kt index cdb0feb..d4d1fed 100644 --- a/src/main/kotlin/ru/mipt/spc/Application.kt +++ b/src/main/kotlin/ru/mipt/spc/Application.kt @@ -7,8 +7,8 @@ import kotlinx.html.CommonAttributeGroupFacade import kotlinx.html.style import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.fetch -import space.kscience.snark.SnarkPlugin -import space.kscience.snark.snarkSite +import space.kscience.snark.html.SnarkPlugin +import space.kscience.snark.ktor.snarkSite import java.net.URI import java.nio.file.FileSystems import java.nio.file.Files diff --git a/src/main/kotlin/ru/mipt/spc/master.kt b/src/main/kotlin/ru/mipt/spc/master.kt index f873a52..02a8ef3 100644 --- a/src/main/kotlin/ru/mipt/spc/master.kt +++ b/src/main/kotlin/ru/mipt/spc/master.kt @@ -14,6 +14,8 @@ import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.plus import space.kscience.dataforge.names.withIndex import space.kscience.snark.* +import space.kscience.snark.html.* +import space.kscience.snark.html.Page import java.nio.file.Path import kotlin.collections.component1 import kotlin.collections.component2 @@ -35,14 +37,14 @@ import kotlin.collections.set private val HtmlData.imagePath: String? get() = meta["image"]?.string ?: meta["image.path"].string private val HtmlData.name: String get() = meta["name"].string ?: error("Name not found") -context(PageBuilder) class MagProgSection( +context(Page) class MagProgSection( val id: String, val title: String, val style: String, val content: FlowContent.() -> Unit, ) -context(PageBuilder) private fun wrapSection( +context(Page) private fun wrapSection( id: String, title: String, sectionContent: FlowContent.() -> Unit, @@ -53,7 +55,7 @@ context(PageBuilder) private fun wrapSection( } } -context(PageBuilder) private fun wrapSection( +context(Page) private fun wrapSection( block: HtmlData, idOverride: String? = null, ): MagProgSection = wrapSection( @@ -71,7 +73,7 @@ private val PROGRAM_PATH: Name = CONTENT_NODE_NAME + "program" private val RECOMMENDED_COURSES_PATH: Name = CONTENT_NODE_NAME + "recommendedCourses" private val PARTNERS_PATH: Name = CONTENT_NODE_NAME + "partners" -context(PageBuilder) private fun FlowContent.programSection() { +context(Page) private fun FlowContent.programSection() { val programBlock = data.resolveHtml(PROGRAM_PATH)!! val recommendedBlock = data.resolveHtml(RECOMMENDED_COURSES_PATH)!! div("inner") { @@ -88,7 +90,7 @@ context(PageBuilder) private fun FlowContent.programSection() { } } -context(PageBuilder) private fun FlowContent.partners() { +context(Page) private fun FlowContent.partners() { //val partnersData: Meta = resolve(PARTNERS_PATH)?.meta ?: Meta.EMPTY val partnersData: Meta = runBlocking { data.getByType(PARTNERS_PATH)?.await() } ?: Meta.EMPTY div("inner") { @@ -118,7 +120,7 @@ context(PageBuilder) private fun FlowContent.partners() { // val photo: String? by meta.string() //} -context(PageBuilder) private fun FlowContent.team() { +context(Page) private fun FlowContent.team() { val team = data.findByContentType("magprog_team").values.sortedBy { it.order } div("inner") { @@ -173,7 +175,7 @@ context(PageBuilder) private fun FlowContent.team() { // } } -context(PageBuilder) private fun FlowContent.mentors() { +context(Page) private fun FlowContent.mentors() { val mentors = data.findByContentType("magprog_mentor").entries.sortedBy { it.value.id } div("inner") { @@ -211,7 +213,7 @@ context(PageBuilder) private fun FlowContent.mentors() { } } -context(PageBuilder) internal fun HTML.magProgHead(title: String) { +context(Page) internal fun HTML.magProgHead(title: String) { head { this.title = title meta { @@ -238,7 +240,7 @@ context(PageBuilder) internal fun HTML.magProgHead(title: String) { } } -context(PageBuilder) internal fun BODY.magProgFooter() { +context(Page) internal fun BODY.magProgFooter() { footer("wrapper style1-alt") { id = "footer" div("inner") { @@ -277,7 +279,7 @@ context(PageBuilder) internal fun BODY.magProgFooter() { } } -private val HtmlData.mentorPageId get() = "mentor-${id}" +context(SnarkContext) private val HtmlData.mentorPageId get() = "mentor-${id}" internal fun SiteBuilder.spcMaster(dataPath: Path, prefix: Name = "magprog".asName()) { diff --git a/src/main/kotlin/ru/mipt/spc/spcCollection.kt b/src/main/kotlin/ru/mipt/spc/spcCollection.kt index 74518c0..efcd0e4 100644 --- a/src/main/kotlin/ru/mipt/spc/spcCollection.kt +++ b/src/main/kotlin/ru/mipt/spc/spcCollection.kt @@ -10,12 +10,12 @@ import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.parseAsName import space.kscience.dataforge.names.withIndex import space.kscience.dataforge.values.string -import space.kscience.snark.* +import space.kscience.snark.html.* import kotlin.collections.component1 import kotlin.collections.component2 import kotlin.collections.set -context(PageBuilder) private fun FlowContent.spcSpotlightContent( +context(Page) private fun FlowContent.spcSpotlightContent( landing: HtmlData, content: Map, ) { diff --git a/src/main/kotlin/ru/mipt/spc/spcHome.kt b/src/main/kotlin/ru/mipt/spc/spcHome.kt index 2c22d09..850d247 100644 --- a/src/main/kotlin/ru/mipt/spc/spcHome.kt +++ b/src/main/kotlin/ru/mipt/spc/spcHome.kt @@ -10,12 +10,12 @@ import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.startsWith import space.kscience.dataforge.values.string -import space.kscience.snark.* +import space.kscience.snark.html.* import java.nio.file.Path import kotlin.reflect.typeOf -context(PageBuilder) internal fun HTML.spcPageContent( +context(Page) internal fun HTML.spcPageContent( meta: Meta, title: String = meta["title"].string ?: SPC_TITLE, fragment: FlowContent.() -> Unit, @@ -65,7 +65,7 @@ internal val FortyDataRenderer: DataRenderer = { name, data -> } -context(PageBuilder) private fun HTML.spcHome() { +context(Page) private fun HTML.spcHome() { spcHead() body("is-preload") { wrapper { diff --git a/src/main/kotlin/ru/mipt/spc/spcMisc.kt b/src/main/kotlin/ru/mipt/spc/spcMisc.kt index ffb9a10..042913c 100644 --- a/src/main/kotlin/ru/mipt/spc/spcMisc.kt +++ b/src/main/kotlin/ru/mipt/spc/spcMisc.kt @@ -1,14 +1,14 @@ package ru.mipt.spc import kotlinx.html.* -import space.kscience.snark.PageBuilder -import space.kscience.snark.homeRef -import space.kscience.snark.resolvePageRef +import space.kscience.snark.html.Page +import space.kscience.snark.html.homeRef +import space.kscience.snark.html.resolvePageRef internal const val SPC_TITLE = "Scientific Programming Centre" -context(PageBuilder) internal fun HTML.spcHead(title: String = SPC_TITLE) { +context(Page) internal fun HTML.spcHead(title: String = SPC_TITLE) { head { title { +title @@ -27,7 +27,7 @@ context(PageBuilder) internal fun HTML.spcHead(title: String = SPC_TITLE) { } } -context(PageBuilder) internal fun FlowContent.spcHomeMenu() { +context(Page) internal fun FlowContent.spcHomeMenu() { nav { id = "menu" ul("links") { @@ -79,7 +79,7 @@ context(PageBuilder) internal fun FlowContent.spcHomeMenu() { } } -context(PageBuilder) internal fun FlowContent.spcFooter() { +context(Page) internal fun FlowContent.spcFooter() { footer { id = "footer" div("inner") { @@ -129,7 +129,7 @@ context(PageBuilder) internal fun FlowContent.spcFooter() { } } -context(PageBuilder) internal fun FlowContent.wrapper(contentBody: FlowContent.() -> Unit) { +context(Page) internal fun FlowContent.wrapper(contentBody: FlowContent.() -> Unit) { div { id = "wrapper" // Header diff --git a/src/main/kotlin/ru/mipt/spc/staticRender.kt b/src/main/kotlin/ru/mipt/spc/staticRender.kt index 46dc7ad..c6f59ec 100644 --- a/src/main/kotlin/ru/mipt/spc/staticRender.kt +++ b/src/main/kotlin/ru/mipt/spc/staticRender.kt @@ -2,13 +2,13 @@ package ru.mipt.spc import space.kscience.dataforge.context.Global import space.kscience.dataforge.context.fetch -import space.kscience.snark.SnarkPlugin -import space.kscience.snark.static +import space.kscience.snark.html.SnarkPlugin +import space.kscience.snark.html.renderStatic import java.nio.file.Path import kotlin.io.path.toPath fun main() { - Global.fetch(SnarkPlugin).static(Path.of("build/out")) { + Global.fetch(SnarkPlugin).renderStatic(Path.of("build/out")) { spcHome(rootPath = javaClass.getResource("/home")!!.toURI().toPath()) spcMaster(dataPath = javaClass.getResource("/magprog")!!.toURI().toPath()) } diff --git a/src/main/kotlin/space/kscience/snark/HtmlData.kt b/src/main/kotlin/space/kscience/snark/HtmlData.kt deleted file mode 100644 index b64c3a1..0000000 --- a/src/main/kotlin/space/kscience/snark/HtmlData.kt +++ /dev/null @@ -1,34 +0,0 @@ -package space.kscience.snark - -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.runBlocking -import kotlinx.html.FlowContent -import kotlinx.html.TagConsumer -import space.kscience.dataforge.data.Data -import space.kscience.dataforge.data.await -import space.kscience.dataforge.meta.get -import space.kscience.dataforge.meta.int -import space.kscience.dataforge.meta.string - - -//TODO replace by VisionForge type -//typealias HtmlFragment = context(PageBuilder, TagConsumer<*>) () -> Unit - -fun interface HtmlFragment { - fun TagConsumer<*>.renderFragment(page: PageBuilder) - //TODO move pageBuilder to a context receiver after KT-52967 is fixed -} - -typealias HtmlData = Data - -//fun HtmlData(meta: Meta, content: context(PageBuilder) TagConsumer<*>.() -> Unit): HtmlData = -// Data(HtmlFragment(content), meta) - -internal val HtmlData.id: String get() = meta["id"]?.string ?: "block[${hashCode()}]" -internal val HtmlData.language: String? get() = meta["language"].string?.lowercase() - -internal val HtmlData.order: Int? get() = meta["order"]?.int - -context(PageBuilder) fun FlowContent.htmlData(data: HtmlData) = runBlocking(Dispatchers.IO) { - with(data.await()) { consumer.renderFragment(this@PageBuilder) } -} \ No newline at end of file diff --git a/src/main/kotlin/space/kscience/snark/KtorSiteBuilder.kt b/src/main/kotlin/space/kscience/snark/KtorSiteBuilder.kt deleted file mode 100644 index ad575f1..0000000 --- a/src/main/kotlin/space/kscience/snark/KtorSiteBuilder.kt +++ /dev/null @@ -1,135 +0,0 @@ -package space.kscience.snark - -import io.ktor.http.URLBuilder -import io.ktor.http.URLProtocol -import io.ktor.server.application.Application -import io.ktor.server.application.call -import io.ktor.server.html.respondHtml -import io.ktor.server.http.content.* -import io.ktor.server.plugins.origin -import io.ktor.server.request.host -import io.ktor.server.request.port -import io.ktor.server.routing.Route -import io.ktor.server.routing.createRouteFromPath -import io.ktor.server.routing.get -import io.ktor.server.routing.routing -import kotlinx.html.HTML -import space.kscience.dataforge.data.DataTree -import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.withDefault -import space.kscience.dataforge.names.Name -import space.kscience.dataforge.names.cutLast -import space.kscience.dataforge.names.endsWith -import java.nio.file.Path -import kotlin.contracts.InvocationKind -import kotlin.contracts.contract - -@PublishedApi -internal class KtorSiteBuilder( - override val snark: SnarkPlugin, - override val data: DataTree<*>, - override val meta: Meta, - private val baseUrl: String, - private val ktorRoute: Route, -) : SiteBuilder { - - override fun assetFile(remotePath: String, file: Path) { - ktorRoute.file(remotePath, file.toFile()) - } - - override fun assetDirectory(remotePath: String, directory: Path) { - ktorRoute.static(remotePath) { - files(directory.toFile()) - } - } - - private fun resolveRef(baseUrl: String, ref: String) = if (baseUrl.isEmpty()) { - ref - } else if (ref.isEmpty()) { - baseUrl - } else { - "${baseUrl.removeSuffix("/")}/$ref" - } - - - inner class KtorPageBuilder( - val pageBaseUrl: String, - override val meta: Meta = this@KtorSiteBuilder.meta, - ) : PageBuilder { - override val snark: SnarkPlugin get() = this@KtorSiteBuilder.snark - override val data: DataTree<*> get() = this@KtorSiteBuilder.data - - override fun resolveRef(ref: String): String = resolveRef(pageBaseUrl, ref) - - override fun resolvePageRef(pageName: Name): String = if (pageName.endsWith(SiteBuilder.INDEX_PAGE_TOKEN)) { - resolveRef(pageName.cutLast().toWebPath()) - } else { - resolveRef(pageName.toWebPath()) - } - } - - override fun page(route: Name, content: context(PageBuilder, HTML)() -> Unit) { - ktorRoute.get(route.toWebPath()) { - call.respondHtml { - val request = call.request - //substitute host for url for backwards calls - val url = URLBuilder(baseUrl).apply { - protocol = URLProtocol.createOrDefault(request.origin.scheme) - host = request.host() - port = request.port() - } - val pageBuilder = KtorPageBuilder(url.buildString()) - content(pageBuilder, this) - } - } - } - - override fun route( - routeName: Name, - dataOverride: DataTree<*>?, - metaOverride: Meta?, - setAsRoot: Boolean, - ): SiteBuilder = KtorSiteBuilder( - snark = snark, - data = dataOverride ?: data, - meta = metaOverride?.withDefault(meta) ?: meta, - baseUrl = if (setAsRoot) { - resolveRef(baseUrl, routeName.toWebPath()) - } else { - baseUrl - }, - ktorRoute = ktorRoute.createRouteFromPath(routeName.toWebPath()) - ) - - - override fun assetResourceFile(remotePath: String, resourcesPath: String) { - ktorRoute.resource(resourcesPath, resourcesPath) - } - - override fun assetResourceDirectory(resourcesPath: String) { - ktorRoute.resources(resourcesPath) - } -} - -inline fun Route.snarkSite( - snark: SnarkPlugin, - data: DataTree<*>, - meta: Meta = data.meta, - block: SiteBuilder.() -> Unit, -) { - contract { - callsInPlace(block, InvocationKind.EXACTLY_ONCE) - } - block(KtorSiteBuilder(snark, data, meta, "", this@snarkSite)) -} - -fun Application.snarkSite( - snark: SnarkPlugin, - data: DataTree<*> = DataTree.empty(), - meta: Meta = data.meta, - block: SiteBuilder.() -> Unit, -) { - routing { - snarkSite(snark, data, meta, block) - } -} \ No newline at end of file diff --git a/src/main/kotlin/space/kscience/snark/PageBuilder.kt b/src/main/kotlin/space/kscience/snark/PageBuilder.kt deleted file mode 100644 index d675f9e..0000000 --- a/src/main/kotlin/space/kscience/snark/PageBuilder.kt +++ /dev/null @@ -1,65 +0,0 @@ -package space.kscience.snark - -import space.kscience.dataforge.context.Context -import space.kscience.dataforge.context.ContextAware -import space.kscience.dataforge.data.* -import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.get -import space.kscience.dataforge.meta.string -import space.kscience.dataforge.names.* - -internal fun Name.toWebPath() = tokens.joinToString(separator = "/"){ - if (it.hasIndex()) { - "${it.body}[${it.index}]" - } else { - it.body - } -} - -interface PageBuilder : ContextAware { - - val snark: SnarkPlugin - - override val context: Context get() = snark.context - - val data: DataTree<*> - - val meta: Meta - - fun resolveRef(ref: String): String - - fun resolvePageRef(pageName: Name): String -} - - -fun PageBuilder.resolvePageRef(pageName: String) = resolvePageRef(pageName.parseAsName()) - -val PageBuilder.homeRef get() = resolvePageRef(SiteBuilder.INDEX_PAGE_TOKEN.asName()) - -/** - * Resolve a Html builder by its full name - */ -fun DataTree<*>.resolveHtml(name: Name): HtmlData? { - val resolved = (getByType(name) ?: getByType(name + SiteBuilder.INDEX_PAGE_TOKEN)) - - return resolved?.takeIf { - it.published //TODO add language confirmation - } -} - -/** - * Find all Html blocks using given name/meta filter - */ -fun DataTree<*>.resolveAllHtml(predicate: (name: Name, meta: Meta) -> Boolean): Map = - filterByType { name, meta -> - predicate(name, meta) - && meta["published"].string != "false" - //TODO add language confirmation - }.asSequence().associate { it.name to it.data } - - -fun DataTree<*>.findByContentType(contentType: String, baseName: Name = Name.EMPTY) = resolveAllHtml { name, meta -> - name.startsWith(baseName) && meta["content_type"].string == contentType -} - -internal val Data<*>.published: Boolean get() = meta["published"].string != "false" \ No newline at end of file diff --git a/src/main/kotlin/space/kscience/snark/SiteBuilder.kt b/src/main/kotlin/space/kscience/snark/SiteBuilder.kt deleted file mode 100644 index e6e96aa..0000000 --- a/src/main/kotlin/space/kscience/snark/SiteBuilder.kt +++ /dev/null @@ -1,97 +0,0 @@ -package space.kscience.snark - -import kotlinx.html.HTML -import space.kscience.dataforge.context.Context -import space.kscience.dataforge.context.ContextAware -import space.kscience.dataforge.data.DataTree -import space.kscience.dataforge.data.DataTreeItem -import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.names.Name -import space.kscience.dataforge.names.NameToken -import space.kscience.dataforge.names.parseAsName -import java.nio.file.Path -import kotlin.reflect.KType -import kotlin.reflect.typeOf - - -/** - * An abstraction, which is used to render sites to the different rendering engines - */ -interface SiteBuilder : ContextAware { - - val data: DataTree<*> - - val snark: SnarkPlugin - - override val context: Context get() = snark.context - - val meta: Meta - - fun assetFile(remotePath: String, file: Path) - - fun assetDirectory(remotePath: String, directory: Path) - - fun assetResourceFile(remotePath: String, resourcesPath: String) - - fun assetResourceDirectory(resourcesPath: String) - - fun page(route: Name = Name.EMPTY, content: context(PageBuilder, HTML) () -> Unit) - - /** - * Create a route with optional data tree override. For example one could use a subtree of the initial tree. - * By default, the same data tree is used for route - */ - fun route( - routeName: Name, - dataOverride: DataTree<*>? = null, - metaOverride: Meta? = null, - setAsRoot: Boolean = false, - ): SiteBuilder - - companion object { - val INDEX_PAGE_TOKEN: NameToken = NameToken("index") - val UP_PAGE_TOKEN: NameToken = NameToken("..") - } -} - -public inline fun SiteBuilder.route( - route: Name, - dataOverride: DataTree<*>? = null, - metaOverride: Meta? = null, - setAsRoot: Boolean = false, - block: SiteBuilder.() -> Unit, -) { - route(route, dataOverride, metaOverride, setAsRoot).apply(block) -} - -public inline fun SiteBuilder.route( - route: String, - dataOverride: DataTree<*>? = null, - metaOverride: Meta? = null, - setAsRoot: Boolean = false, - block: SiteBuilder.() -> Unit, -) { - route(route.parseAsName(), dataOverride, metaOverride, setAsRoot).apply(block) -} - - -///** -// * Create a stand-alone site at a given node -// */ -//public fun SiteBuilder.site(route: Name, dataRoot: DataTree<*>, block: SiteBuilder.() -> Unit) { -// val mountedData = data.copy( -// data = dataRoot, -// baseUrlPath = data.resolveRef(route.tokens.joinToString(separator = "/")), -// meta = Laminate(dataRoot.meta, data.meta) //layering dataRoot meta over existing data -// ) -// route(route) { -// withData(mountedData).block() -// } -//} - -//TODO move to DF -fun DataTree.Companion.empty(meta: Meta = Meta.EMPTY) = object : DataTree { - override val items: Map> get() = emptyMap() - override val dataType: KType get() = typeOf() - override val meta: Meta get() = meta -} \ No newline at end of file diff --git a/src/main/kotlin/space/kscience/snark/SiteLayout.kt b/src/main/kotlin/space/kscience/snark/SiteLayout.kt deleted file mode 100644 index f04f4f1..0000000 --- a/src/main/kotlin/space/kscience/snark/SiteLayout.kt +++ /dev/null @@ -1,150 +0,0 @@ -package space.kscience.snark - -import kotlinx.html.body -import kotlinx.html.head -import kotlinx.html.title -import space.kscience.dataforge.data.Data -import space.kscience.dataforge.data.DataTreeItem -import space.kscience.dataforge.data.getItem -import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.get -import space.kscience.dataforge.meta.getIndexed -import space.kscience.dataforge.meta.string -import space.kscience.dataforge.misc.Type -import space.kscience.dataforge.names.Name -import space.kscience.dataforge.names.NameToken -import space.kscience.dataforge.names.asName -import space.kscience.dataforge.names.parseAsName -import space.kscience.snark.SiteLayout.Companion.ASSETS_KEY -import space.kscience.snark.SiteLayout.Companion.INDEX_PAGE_TOKEN -import space.kscience.snark.SiteLayout.Companion.LAYOUT_KEY -import java.nio.file.Path -import kotlin.reflect.typeOf - -internal fun SiteBuilder.assetsFrom(rootMeta: Meta) { - rootMeta.getIndexed("resource".asName()).forEach { (_, meta) -> - - val path by meta.string() - val remotePath by meta.string() - - path?.let { resourcePath -> - //If remote path provided, use a single resource - remotePath?.let { - assetResourceFile(it, resourcePath) - return@forEach - } - - //otherwise use package resources - assetResourceDirectory(resourcePath) - } - } - - rootMeta.getIndexed("file".asName()).forEach { (_, meta) -> - val remotePath by meta.string { error("File remote path is not provided") } - val path by meta.string { error("File path is not provided") } - assetFile(remotePath, Path.of(path)) - } - - rootMeta.getIndexed("directory".asName()).forEach { (_, meta) -> - val path by meta.string { error("Directory path is not provided") } - assetDirectory("", Path.of(path)) - } -} - -typealias DataRenderer = SiteBuilder.(name: Name, data: Data) -> Unit - -/** - * Recursively renders the data items in [data]. If [LAYOUT_KEY] is defined in an item, use it to load - * layout from the context, otherwise render children nodes as name segments and individual data items using [dataRenderer]. - */ -fun SiteBuilder.pages( - data: DataTreeItem<*>, - dataRenderer: DataRenderer = SiteLayout.defaultDataRenderer, -) { - val layoutMeta = data.meta[LAYOUT_KEY] - if (layoutMeta != null) { - //use layout if it is defined - snark.layout(layoutMeta).render(data) - } else { - when (data) { - is DataTreeItem.Node -> { - data.tree.items.forEach { (token, item) -> - //Don't apply index token - if (token == INDEX_PAGE_TOKEN) { - pages(item, dataRenderer) - } else if (item is DataTreeItem.Leaf) { - dataRenderer(this, token.asName(), item.data) - } else { - route(token.asName()) { - pages(item, dataRenderer) - } - } - } - } - is DataTreeItem.Leaf -> { - dataRenderer.invoke(this, Name.EMPTY, data.data) - } - } - data.meta[ASSETS_KEY]?.let { - assetsFrom(it) - } - } - //TODO watch for changes -} - -/** - * Render all pages in a node with given name - */ -fun SiteBuilder.pages( - dataPath: Name, - remotePath: Name = dataPath, - dataRenderer: DataRenderer = SiteLayout.defaultDataRenderer, -) { - val item = data.getItem(dataPath) ?: error("No data found by name $dataPath") - route(remotePath) { - pages(item, dataRenderer) - } -} - -fun SiteBuilder.pages( - dataPath: String, - remotePath: Name = dataPath.parseAsName(), - dataRenderer: DataRenderer = SiteLayout.defaultDataRenderer, -) { - pages(dataPath.parseAsName(), remotePath, dataRenderer = dataRenderer) -} - - -@Type(SiteLayout.TYPE) -fun interface SiteLayout { - - context(SiteBuilder) fun render(item: DataTreeItem<*>) - - companion object { - const val TYPE = "snark.layout" - const val LAYOUT_KEY = "layout" - const val ASSETS_KEY = "assets" - val INDEX_PAGE_TOKEN = NameToken("index") - - val defaultDataRenderer: SiteBuilder.(name: Name, data: Data<*>) -> Unit = { name: Name, data: Data<*> -> - if (data.type == typeOf()) { - page(name) { - head { - title = data.meta["title"].string ?: "Untitled page" - } - body { - @Suppress("UNCHECKED_CAST") - htmlData(data as HtmlData) - } - } - } - } - } -} - - -object DefaultSiteLayout : SiteLayout { - context(SiteBuilder) override fun render(item: DataTreeItem<*>) { - pages(item) - } -} \ No newline at end of file diff --git a/src/main/kotlin/space/kscience/snark/SnarkPlugin.kt b/src/main/kotlin/space/kscience/snark/SnarkPlugin.kt deleted file mode 100644 index 547b2ad..0000000 --- a/src/main/kotlin/space/kscience/snark/SnarkPlugin.kt +++ /dev/null @@ -1,146 +0,0 @@ -package space.kscience.snark - -import io.ktor.util.extension -import io.ktor.utils.io.core.Input -import io.ktor.utils.io.core.readBytes -import space.kscience.dataforge.context.* -import space.kscience.dataforge.data.DataTree -import space.kscience.dataforge.io.IOReader -import space.kscience.dataforge.io.JsonMetaFormat -import space.kscience.dataforge.io.asBinary -import space.kscience.dataforge.io.readWith -import space.kscience.dataforge.io.yaml.YamlMetaFormat -import space.kscience.dataforge.io.yaml.YamlPlugin -import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.get -import space.kscience.dataforge.meta.string -import space.kscience.dataforge.misc.DFExperimental -import space.kscience.dataforge.misc.Type -import space.kscience.dataforge.names.Name -import space.kscience.dataforge.names.asName -import space.kscience.dataforge.names.parseAsName -import space.kscience.dataforge.workspace.FileData -import space.kscience.dataforge.workspace.readDataDirectory -import java.nio.file.Path -import kotlin.reflect.KClass -import kotlin.reflect.KType -import kotlin.reflect.typeOf - -/** - * A parser of binary content including priority flag and file extensions - */ -@Type(SnarkParser.TYPE) -interface SnarkParser { - val type: KType - - val fileExtensions: Set - - val priority: Int get() = DEFAULT_PRIORITY - - fun parse(context: Context, meta: Meta, bytes: ByteArray): R - - fun reader(context: Context, meta: Meta) = object : IOReader { - override val type: KType get() = this@SnarkParser.type - - override fun readObject(input: Input): R = parse(context, meta, input.readBytes()) - } - - companion object { - const val TYPE = "snark.parser" - const val DEFAULT_PRIORITY = 10 - } -} - -@PublishedApi -internal class SnarkParserWrapper( - val reader: IOReader, - override val type: KType, - override val fileExtensions: Set, -) : SnarkParser { - override fun parse(context: Context, meta: Meta, bytes: ByteArray): R = bytes.asBinary().readWith(reader) -} - -/** - * Create a generic parser from reader - */ -@Suppress("FunctionName") -inline fun SnarkParser( - reader: IOReader, - vararg fileExtensions: String, -): SnarkParser = SnarkParserWrapper(reader, typeOf(), fileExtensions.toSet()) - -@OptIn(DFExperimental::class) -class SnarkPlugin : AbstractPlugin() { - private val yaml by require(YamlPlugin) - val io get() = yaml.io - - override val tag: PluginTag get() = Companion.tag - - private val parsers: Map> by lazy { - context.gather(SnarkParser.TYPE, true) - } - - private val layouts: Map by lazy { - context.gather(SiteLayout.TYPE, true) - } - - private val textTransformations: Map by lazy { - context.gather(TextTransformation.TYPE, true) - } - - fun readDirectory(path: Path): DataTree = io.readDataDirectory(path) { dataPath, meta -> - val fileExtension = meta[FileData.META_FILE_EXTENSION_KEY].string ?: dataPath.extension - val parser: SnarkParser = parsers.values.filter { parser -> - fileExtension in parser.fileExtensions - }.maxByOrNull { - it.priority - } ?: run { - logger.warn { "The parser is not found for file $dataPath with meta $meta" } - byteArraySnarkParser - } - - parser.reader(context, meta) - } - - internal fun layout(layoutMeta: Meta): SiteLayout { - val layoutName = layoutMeta.string - ?: layoutMeta["name"].string ?: error("Layout name not defined in $layoutMeta") - return layouts[layoutName.parseAsName()] ?: error("Layout with name $layoutName not found in $this") - } - - internal fun textTransformation(transformationMeta: Meta): TextTransformation { - val transformationName = transformationMeta.string - ?: transformationMeta["name"].string ?: error("Transformation name not defined in $transformationMeta") - return textTransformations[transformationName.parseAsName()] - ?: error("Text transformation with name $transformationName not found in $this") - } - - override fun content(target: String): Map = when (target) { - SnarkParser.TYPE -> mapOf( - "html".asName() to SnarkHtmlParser, - "markdown".asName() to SnarkMarkdownParser, - "json".asName() to SnarkParser(JsonMetaFormat, "json"), - "yaml".asName() to SnarkParser(YamlMetaFormat, "yaml", "yml"), - "png".asName() to SnarkParser(ImageIOReader, "png"), - "jpg".asName() to SnarkParser(ImageIOReader, "jpg", "jpeg"), - "gif".asName() to SnarkParser(ImageIOReader, "gif"), - ) - TextTransformation.TYPE -> mapOf( - "basic".asName() to BasicTextTransformation - ) - else -> super.content(target) - } - - companion object : PluginFactory { - override val tag: PluginTag = PluginTag("snark") - override val type: KClass = SnarkPlugin::class - - override fun build(context: Context, meta: Meta): SnarkPlugin = SnarkPlugin() - - private val byteArrayIOReader = IOReader { - readBytes() - } - - private val byteArraySnarkParser = SnarkParser(byteArrayIOReader) - } -} \ No newline at end of file diff --git a/src/main/kotlin/space/kscience/snark/SnarkTextParser.kt b/src/main/kotlin/space/kscience/snark/SnarkTextParser.kt deleted file mode 100644 index ee8a0f7..0000000 --- a/src/main/kotlin/space/kscience/snark/SnarkTextParser.kt +++ /dev/null @@ -1,68 +0,0 @@ -package space.kscience.snark - -import io.ktor.util.asStream -import io.ktor.utils.io.core.Input -import kotlinx.html.div -import kotlinx.html.unsafe -import org.intellij.markdown.flavours.commonmark.CommonMarkFlavourDescriptor -import org.intellij.markdown.html.HtmlGenerator -import org.intellij.markdown.parser.MarkdownParser -import space.kscience.dataforge.context.Context -import space.kscience.dataforge.io.IOReader -import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.get -import java.awt.image.BufferedImage -import javax.imageio.ImageIO -import kotlin.reflect.KType -import kotlin.reflect.typeOf - -abstract class SnarkTextParser : SnarkParser { - abstract fun parseText(text: String, meta: Meta): R - - override fun parse(context: Context, meta: Meta, bytes: ByteArray): R = - parseText(bytes.decodeToString(), meta) - - fun transformText(text: String, meta: Meta, page: PageBuilder): String = - meta[TextTransformation.TEXT_TRANSFORMATION_KEY]?.let { - with(page){ page.snark.textTransformation(it).transform(text)} - } ?: text -} - - -internal object SnarkHtmlParser : SnarkTextParser() { - override val fileExtensions: Set = setOf("html") - override val type: KType = typeOf() - - override fun parseText(text: String, meta: Meta): HtmlFragment = HtmlFragment { page -> - div { - unsafe { +transformText(text, meta, page) } - } - } -} - -internal object SnarkMarkdownParser : SnarkTextParser() { - override val fileExtensions: Set = setOf("markdown", "mdown", "mkdn", "mkd", "md") - override val type: KType = typeOf() - - private val markdownFlavor = CommonMarkFlavourDescriptor() - private val markdownParser = MarkdownParser(markdownFlavor) - - override fun parseText(text: String, meta: Meta): HtmlFragment { - val parsedTree = markdownParser.buildMarkdownTreeFromString(text) - val htmlString = HtmlGenerator(text, parsedTree, markdownFlavor).generateHtml() - - return HtmlFragment { page -> - div { - unsafe { - +SnarkHtmlParser.transformText(htmlString, meta, page) - } - } - } - } -} - -internal object ImageIOReader : IOReader { - override val type: KType get() = typeOf() - - override fun readObject(input: Input): BufferedImage = ImageIO.read(input.asStream()) -} diff --git a/src/main/kotlin/space/kscience/snark/StaticSiteBuilder.kt b/src/main/kotlin/space/kscience/snark/StaticSiteBuilder.kt deleted file mode 100644 index dbc796b..0000000 --- a/src/main/kotlin/space/kscience/snark/StaticSiteBuilder.kt +++ /dev/null @@ -1,126 +0,0 @@ -package space.kscience.snark - -import kotlinx.html.HTML -import kotlinx.html.html -import kotlinx.html.stream.createHTML -import space.kscience.dataforge.data.DataTree -import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.withDefault -import space.kscience.dataforge.names.Name -import space.kscience.dataforge.names.isEmpty -import java.nio.file.Files -import java.nio.file.Path -import kotlin.contracts.InvocationKind -import kotlin.contracts.contract -import kotlin.io.path.* - - -internal class StaticSiteBuilder( - override val snark: SnarkPlugin, - override val data: DataTree<*>, - override val meta: Meta, - private val baseUrl: String, - private val path: Path, -) : SiteBuilder { - private fun Path.copyRecursively(target: Path) { - Files.walk(this).forEach { source: Path -> - val destination: Path = target.resolve(source.relativeTo(this)) - if (!destination.isDirectory()) { - //avoid re-creating directories - source.copyTo(destination, true) - } - } - } - - override fun assetFile(remotePath: String, file: Path) { - val targetPath = path.resolve(remotePath) - targetPath.parent.createDirectories() - file.copyTo(targetPath, true) - } - - override fun assetDirectory(remotePath: String, directory: Path) { - val targetPath = path.resolve(remotePath) - targetPath.parent.createDirectories() - directory.copyRecursively(targetPath) - } - - override fun assetResourceFile(remotePath: String, resourcesPath: String) { - val targetPath = path.resolve(remotePath) - targetPath.parent.createDirectories() - javaClass.getResource(resourcesPath)?.let { Path.of(it.toURI()) }?.copyTo(targetPath, true) - } - - override fun assetResourceDirectory(resourcesPath: String) { - path.parent.createDirectories() - javaClass.getResource(resourcesPath)?.let { Path.of(it.toURI()) }?.copyRecursively(path) - } - - private fun resolveRef(baseUrl: String, ref: String) = if (baseUrl.isEmpty()) { - ref - } else if (ref.isEmpty()) { - baseUrl - } else { - "${baseUrl.removeSuffix("/")}/$ref" - } - - inner class StaticPageBuilder : PageBuilder { - override val data: DataTree<*> get() = this@StaticSiteBuilder.data - override val meta: Meta get() = this@StaticSiteBuilder.meta - override val snark: SnarkPlugin get() = this@StaticSiteBuilder.snark - - - - override fun resolveRef(ref: String): String = resolveRef(baseUrl, ref) - - override fun resolvePageRef(pageName: Name): String = resolveRef( - pageName.toWebPath() + ".html" - ) - } - - - override fun page(route: Name, content: context(PageBuilder, HTML) () -> Unit) { - val htmlBuilder = createHTML() - - htmlBuilder.html { - content(StaticPageBuilder(), this) - } - - val newPath = if (route.isEmpty()) { - path.resolve("index.html") - } else { - path.resolve(route.toWebPath() + ".html") - } - - newPath.parent.createDirectories() - newPath.writeText(htmlBuilder.finalize()) - } - - override fun route( - routeName: Name, - dataOverride: DataTree<*>?, - metaOverride: Meta?, - setAsRoot: Boolean, - ): SiteBuilder = StaticSiteBuilder( - snark = snark, - data = dataOverride ?: data, - meta = metaOverride?.withDefault(meta) ?: meta, - baseUrl = if (setAsRoot) { - resolveRef(baseUrl, routeName.toWebPath()) - } else { - baseUrl - }, - path = path.resolve(routeName.toWebPath()) - ) -} - -fun SnarkPlugin.static( - outputPath: Path, - data: DataTree<*> = DataTree.empty(), - siteUrl: String = outputPath.absolutePathString().replace("\\", "/"), - block: SiteBuilder.() -> Unit, -) { - contract { - callsInPlace(block, InvocationKind.EXACTLY_ONCE) - } - StaticSiteBuilder(this, data, meta, siteUrl, outputPath).block() -} \ No newline at end of file diff --git a/src/main/kotlin/space/kscience/snark/TextTransformation.kt b/src/main/kotlin/space/kscience/snark/TextTransformation.kt deleted file mode 100644 index 09f453c..0000000 --- a/src/main/kotlin/space/kscience/snark/TextTransformation.kt +++ /dev/null @@ -1,38 +0,0 @@ -package space.kscience.snark - -import space.kscience.dataforge.misc.Type -import space.kscience.dataforge.names.NameToken - -@Type(TextTransformation.TYPE) -fun interface TextTransformation { - context(PageBuilder) fun transform(text: String): String - - companion object { - const val TYPE = "snark.textTransformation" - val TEXT_TRANSFORMATION_KEY = NameToken("transformation") - } -} - -object BasicTextTransformation : TextTransformation { - - private val regex = "\\\$\\{(\\w*)(?>\\(\"(.*)\"\\))?\\}".toRegex() - - context(PageBuilder) override fun transform(text: String): String { - return text.replace(regex) { match -> - when (match.groups[1]!!.value) { - "homeRef" -> homeRef - "resolveRef" -> { - val refString = match.groups[2]?.value ?: error("resolveRef requires a string (quoted) argument") - resolveRef(refString) - } - "resolvePageRef" -> { - val refString = match.groups[2]?.value ?: error("resolvePageRef requires a string (quoted) argument") - resolvePageRef(refString) - } - else -> match.value - } - } - } -} - - From 5e93f982f86f8ce0fe54a50757d1d554d8f7ff26 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 3 Jul 2022 16:28:53 +0300 Subject: [PATCH 3/5] Spliting site and the snark project complete --- build.gradle.kts | 3 +- data/common/android-chrome-192x192.png | Bin 0 -> 25270 bytes data/common/android-chrome-512x512.png | Bin 0 -> 99449 bytes data/common/apple-touch-icon.png | Bin 0 -> 22866 bytes data/common/favicon-16x16.png | Bin 0 -> 810 bytes data/common/favicon-32x32.png | Bin 0 -> 2077 bytes data/common/favicon.ico | Bin 0 -> 15406 bytes data/common/site.webmanifest | 1 + src/main/kotlin/html5up/forty/common.kt | 4 +- src/main/kotlin/html5up/forty/landing.kt | 4 +- src/main/kotlin/html5up/forty/page.kt | 4 +- src/main/kotlin/ru/mipt/spc/Application.kt | 17 ++----- src/main/kotlin/ru/mipt/spc/spcCollection.kt | 2 +- src/main/kotlin/ru/mipt/spc/spcHome.kt | 13 ++--- .../ru/mipt/spc/{master.kt => spcMasters.kt} | 48 +++++++++++++----- src/main/kotlin/ru/mipt/spc/spcMisc.kt | 35 ++++++++++--- src/main/kotlin/ru/mipt/spc/staticRender.kt | 12 ++--- 17 files changed, 90 insertions(+), 53 deletions(-) create mode 100644 data/common/android-chrome-192x192.png create mode 100644 data/common/android-chrome-512x512.png create mode 100644 data/common/apple-touch-icon.png create mode 100644 data/common/favicon-16x16.png create mode 100644 data/common/favicon-32x32.png create mode 100644 data/common/favicon.ico create mode 100644 data/common/site.webmanifest rename src/main/kotlin/ru/mipt/spc/{master.kt => spcMasters.kt} (91%) diff --git a/build.gradle.kts b/build.gradle.kts index f1272e5..b9d5b2d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -29,6 +29,7 @@ dependencies { implementation("io.ktor:ktor-server-netty:$ktorVersion") implementation("io.ktor:ktor-server-http-redirect:$ktorVersion") + implementation("ch.qos.logback:logback-classic:1.2.11") testImplementation("io.ktor:ktor-server-tests:$ktorVersion") } @@ -43,7 +44,7 @@ apiValidation{ tasks.withType { kotlinOptions { - freeCompilerArgs = freeCompilerArgs + "-Xcontext-receivers" + freeCompilerArgs = freeCompilerArgs + "-Xcontext-receivers" } } diff --git a/data/common/android-chrome-192x192.png b/data/common/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..6b59b367d6f41a99049ced2e244fe7660c7361d4 GIT binary patch literal 25270 zcmV*4Ky|-~P)PyA07*naRCr$Py?2yc=W*s;Jvrx`2f!fb$V`AFm~$2tEzz=~EwAm}_5ShgIqP%0 zwsx(RZP}J&Su#bDA}MAP3?K=RAPEwg$iM&?Ou*!v^YnLqb^8vRjhX5D&h#W;t~>@w z^mN~T?_2d&J@wR6F1Oq5mdog}zpY!`!vAp%4!NbZqhA_Y`{Y7Hr&Kp|OG9g~{xr7r zOH*5~{wcH1~BAyOaB0yc1XH<2c^4rPYMwdqP|lq>$|0@p+z>r%8-EJ8g za*NyZ&x3=X@1vj~P6C%21Ap@GAwky0#V~?{trH?NI7q_6f+Rd7Si<=;G*}|Sg46&o zh)hm}lqktcj*zUBNc~BO4O3&lxaO|FtiUB{0Bq9!{vi!dx_SoG)3Zu;{z zol;)YDP?tCQr&17L1)i^^z{wdQBh!4*YI5kp<*IKB{3#ca?+wCCpB7f(;_7=BUrLQf4nNy39AG9p;QLxR+(_}#h7d<8B!10WRX>K#z8US8WJC6yggTGJsH>WS-n zq`AFc>~KaynjS)-0qGxfYc4RImmNZdd-8_p$PkGkWQwwKh_r+V$xexsg3M?s$gqCW zk|H#unhTA__vB{10g%HF47xQo$J=*y4@hHMpHwz<$=M6-a;mIN&Qx}&F|@SzN_Q__ z-mNja{&D~HYe0X?sb?C#Pl;{S>`(pqLa$;p+ZmbmL#OleAnh-AWF=2wiM1%%u z;!XH9cllp|S#1Dp;DNy*_2{KFU2?9nUC!!e@09As9;t8bmFBiyO>Wz}`=z(nis5JD z#eR+m3s!HR5EEu4(6M2PAmwMqNKsCVEX;|O?6fF7DT0HoJY?<~dj)2l0kG)@2i*!i z61TT?_DM~1kDMrNlcOaqa=fHf%4$0`1Oo8^{bA2@Qp|S1S5F3)NRYV1rHQpmljeC@ zF|xEUURKRd(364C2qVE*!a{@fb#vFqD=_N}07Qn3f1$2hiZ8TDae2F(tLl&oB(zQ4 z($LZ?Egk)8Ak!VwPxhu`Taz!u$A(F2e7K}1M@mjgq~vEr%c=zlvaB#(GLj-CE-GX$ zBpT&m%nAdrLmf6X_&jLN@zOTgcdAJa7B{I8v~~4M-@uT1daoMSWbeTl@&2Hq7Ub%Z zgy>MoPK}c5SEtGKt5apgyaWx4K#S(!(~BS1j5h!~$t8|IUEU@q%dDUC)fTc-)7Y&^ zFPk51{&KzukEkb5WXn&FmgV!}<(7?^vT;eW<_f^4bC(a`FjFhRIC6?mJ$*x3jjgEb zl-)-gJ+viHZrhY8D;FeawR!HE1qNUxx1%p2Qo33YrATI7K=Bghs)AW3-cf zCB}xzH7ir)<_(#0=T+I79M4@d*Z}NUA1VUWgrg;`viD@8d~&Qoj-78+xRZ?p?jNXd zM?JgC@|Zw}&=!KAE%2uopNG&w32l*~5*Yz?AxOePf+f^Le)ByANWiH^Q=91U)F&vs z!9n8W!Z>)1{&(y;9rUqv2jfUAL5b_(_C#7>sp7@TV0vnXCb)Q(8i}T(>$+{^HRk zvTos=0r)(={ zFiD9Imz0EXt*j=-SajsLm@tWpwrI<6aftf~cLKpKz^mINJ!l*D34l>Fcl0TurTqu3 zebUfo8An|chSH-UAfSL#BcO5&Z-@}+yZ0_oNObO+At4YC(dOv$fIm7`FCQMRmyeFr z>nYIPJD{|M@rFEhY)@Q|w~q=Bk&NUBDa?$K#d)z(lp8DaGGmlmlad&ru{;G+JMJeh zAo=A_r8ft#n5u}7CsEc)HQwEm4-oqB-Jx!_vaD4fF5v;Fi0Orgw&Qv_sR(6YO|G18Q34=~K?~r&=L0(3bdVOF_;^NtO5$=#LK=LCrDyizU`W))I^^~Ae-r3zRt{{=9@K9}}S&|Xl?xKJI!qVZ+%-)GpfUfDTN>LeFZR}+D%rljM$T7tN>gjE^o;}JwBvkQ3KL_) zr64m(HZD$)wF?tvSwXy{CWfomBOKBgpI+TS2J=(Ao5+c1%LG>K?xu&iUoJFs$;r|- z1rbP;aRyX;R~045>iLPv1ERwWbZdX zOfQY|!-6!dp($j3w$&iAI6v0%`svY%;>@)0#`JrR_IjKNYYLnSd|KPot$729JKmmT zA3ji2q~-bNHvh;gIVA>w_h+M1(0cDcjlA^X1wFno2t1le!fSU+QIJZA36=GWlI5!9 z$+BTdiY&^F6=Gk)94fbX!%O+WV+2%>p<8H6=b&3TN<=!W54`}sMY=#4;HC0DlWqVc zaKx>kJ9|$ws^^E=Kpw!uGr7oBW1>Qp*@)Mlmldmw$K{3bvM?`Bi&r*L&E$ROUVHhj zz@!;~O$TV}7?5Me2!U#A5fJJv@|gyeSZq9ob06tABo8Htg4 z5>U~_>&+}Y=kncHv*nvlngKxSBE%s%`{1)W`S57H>^;$>l}!_li;eKW)q%~pv>;9m zVD*ATMLF2`5Z5l{P-nJmrrCI(lVSjPcG?z;E81kwiAH&Sca=h&AV6T&PA^+(5V`_Y z%p2FI%esZhGA}Dyi&!u-gM&xr<2(I~xz}CZD-du4us1)lBs8$>I8>|j29z31Xbr^s zaCgwXS&|>8(B`!((`0d8oFvDGX_7m4&8@&hS0La9Kv}+`wo5(!s~=a&jsrC+Ptx5p zXjJ5)ln+;D^}+<%x;|5`SeC4E9~84dH)dGzcB0Q=?)Rr@1p;OOTIKaLtsf|EmR*Ny z<-Ps2a_CI6V|50F@Pb{+&4;rCje&mFYgeW!odHO1rf_zq>3Pk4Y=BoFU9Yr&lz z^5&i@d3$fQoUiK8CJ(1zCmWnDCSXmPIMy#tlBEUlN@Rn>GY4@7`03BRodm=H2z#hX zo+@vbj}F(%+xw~%>!;JnY1~i9gZgnndbC`%JVkC=pP^nKi4TZtb12W;Zk>!32#5jD z=Zg0S?tE@XxwbPx*QE&N`sCogLpK34tx^soC@jTYK-*LJE z6EXmskahHYtGu-9g6uk6C&x=#R0Y9F=tInpheyiq_A9dF>J=#(|EDEJ%ngEY`UK}* zH=z}nkO2_)Giim5|J%1q$q8!_sxqw2bqkZ^;T!T~-J(QEiVatJ@2R@% zRzyxLrozBavYSghDvOhPEA}Z!@^8vsg+xea9rw-sTlemnUc+5~J_c>lzJpb-u|_{x z?W6ubigr+%{4L$2A#3suDj1$N(aFB=FNm5=L>Z0_rS1Ew<-Pqivg=5_3e-9ceP}eN zA9w4947q6?%4PA|z6f`Jswm8=KG%=R^q_L-3FTVa8I?4k-=m++H0VE+^Z&?4e+6A> zFj(hj#c1e}?Ui=!Kp=<$140=4{s_1W~P}`ZDeM+i2RGk^rXWywt^*((A{ui9iEFSW;t5Rj_`V6^pS+Xq7k5kzZC*EVC zYeK_09-dCLLuZ?%xT0NY8c33Kpgh-W%NKgo8Vt2~Oz$r#K1}- zR?)yq0yiTXMo%zOk=DkyW}#W3kkuc|Fh9Q@$@GRjuP21XVNtOBquUBKhht{hNF8^C znK%@T^|Le0I?Dm)S>M{DP&s3&=xLyzfl$a+%oyjb`TaHeMY2*NwBTxN09Z2WWuF{x zkazZ1%RBpPbrg{kZa<4g>tbO>wA^!Tj(QGjm_z8K>(?t{<#wy*WPrwj(@paJp*r12 zv}oEwyBdG8>HRKaU|v9-1K9VDE3)M7t8)ZpI^T(4{X?~~_f(S_ud08jXz-!XF^HG(m@j{LLAgF`ems!BP?OMyJ*~^{dikO;Mt5ez-l8 zeQDU%Gbm@P+U4y%H7dhmDbIE5JmB#tQ3T?i7i7oEt(!9BmJOM5{hD-5D19&DVKzC& zO05OsJ$}AbHx+G=(=qmm7@FRUHH#AE8@Co}{l*u(uoS+BRNiIB!CLw7aGk>C_5>fo zovCs(-fIf00MTI9-pBy3R%AGioNbZcy;CZ$eO&2S#>Cd?L8R%cw-hMFf!LRPV3Nar z{qBTqh)p4{{=}Olsz`wcGHJ{S#D@2M4;;dyH|EQhHEFV{C{cAteJ@TY62^D-Rm)S` z%Tz&+n4ehLpW~T~d*(ga> zF!^NNJBonRo5(?p3;=8X)T7&pp3k8(O`e!->{}(V%}$Au4NH?W*1dUshKe-tu&0XL zMx`3K_TBxpvh!fAhCLk3CjH2h@jxK^ednG9DqKZ9WF!a}*%M;t?fYuf=^&7W>hyGN ze%66Fn$Yd`E3@RrwHdmZd}op2bdb7y|Fc?odvA>#Jl&*yB2L2P$yjUqJt?w&^_D`p zVp)oF10b>L=o*k0c2&sl-!0Q47zoSX5k}}ktD=qgko*Go5r<7S;=>oVtJMs~e&X#? zdHv%`DXF&9=S((`jn~_ZRQq^0>2C9Vs2D$_zrT8Pv9ey_Lis|#gqpR zGP!r&ld3uhCC^J`*as}!eY_XYEg;6jH|ER6#Yw6{;eGGCH#y6jpH|B=JIb_1#6%y{ zP?I%M$kL;Rz?+szAIzV8z~7|`WtlN@ z^~zMa_nI8ls!WRy*U)DwE{;3}F;0e)DFDq7bH1>-J`44lj$xcS6H||EVUq(9o@7 zwx%12%?{<`=8c*1rw=UDoXFSv+Y>S0*;gY!{ljVXqG09z*4^Ix+EN-CB)MtP+Eam6 zC>s;#m(ZlS!)j4A+($}ICcK^P2ia{2gJy__m* zR}VPWWhpWT%e?GZdE|y%mFQkl5U1W~DlZ=J!81)7_rq7(f4a%&<9XOgap97m9;G__ zAXh+@RSi8_1xKTk)6n!p!LtD&@({j$YoUcm_@DvQD<~AbwWnHs`Px}IUD0lI+OUBV zQHfiSpxzqe#aQXq+jY2Jm8StUOv5;g7pcjw-C8K$xu-~5RDBa*>O}N|v*xdVQmKaP z^kNy+BV^6OMESw}3uW_~H2(&G7b1js zdtbHu?8P$*9XjFrz~N6%j*xXliSq5c7br@g3Jz1OPf3x5dd0R+suV)R`@eXb*jI&Yy|($QZMa0WrjHcAZ{1{&WG^F z$zzB|?Z!u0vfv!>F`^we=4S{G=^}Xl>s0D#&krTBUoD_k@RLaV?cD?Nhn?lRSr4CSQIBVG;WaiaPEwp3ynanl zl7j(~x(+dxmof;{(Y|4^bH)bj(ja<9;0YF#+&cE|et=28xJy4_n zZgLT)BOgPa@g>iE04mAk60dxCK|VNKFULyE4S zEz9TmfkAl)=W9BI7!(Y8=fOIq42%^s@(}TwC^Um_->*k+v`%0dX`HChHyFo@QK0+P zYbEm3JEh83;`B1Ps9(^O4_kH9(j*Nd5Sj%7{+E}|XmO{!)+_|V2>=W{dSijyvMED7 z9qZ$L*=zsO2Nx^|vA9urN+uWYdHtF+xn)C!+_ou8VOBy{)cNS!`1nY@))Y)(Nt_vl zOt5swjJ^auK$ABuMx0SbuKmledx{nzKp4Qtai?4)M|D#a6To|jiY zzMw{Bx*mj`H>^#QyROdBoQP*RY7U^Jv4J7^>|BdHwY^laT*3!`u^cx~ytZO~f;@5q zGitLmW}a$UazX{XPD4wtZq(mxFO}M6OH1G6;^7kdeCy76vN$hZ6JUz>pB`_Ne|YAk z9>v6>CYuN$uf+v%ivQodK2x$%BQNrzY$9TG&>!%BVruw4CKqAEz1L`UJ$FjpJy5GH zrzUYUp9xWo1e@a?<+J6H)YB_*W}2iC8)T?OnKbTL&D=Qfsy$9 zSFe}I%O6%as#|z(R?rT-=r?XFl<(bFq`Lc73uv#RN=tHB<{M0B7$Yh+6?*YuPl*e zg$YVq#u*c?;SfmRSq~HVR^i~(DEZc%^VKPE8mN}+X#D^bzCIuU+gBso_f{))V5~1f z?2l(-!+d#bzC3nwfj)qd$X(92%lKc(X2JV_cs%=Fxx9C<)^GUc>#0?bG&5ShdUJvN z5okwLs6JqDXp++ZeB-=66q5(R8m*ikFPm4BnC5GR+?NhQI0g8Cvc^9=drHGBn>FcV zMRfjgNRTYZq2RMr?ztvgV`#iHVg>NH2v6V_nba@rF;s+vfBx`dRqdeAX`k+_1C2SS z%i8267z6K>8z=5IXN<8<|Lw7*3KbKL0001I|MJyy+JE9yaDnw=J@EF7%p$Dfd4lBO zBrY-ln|e#U_4GTXs_4v7%wmmo*|9&}K@V=plRK`;lH|CsDTh7nd*rnG>}-p6tG)3_ zmFzj$XoS@h{$zr7EJ&0GH|NSjTkzA)siKNNJz0+4fa{Z%+7ik`b;Suft-#)XWTz>OLi7_C67mbSw zkq0;D$)7&3NDa&z*&}a(?f_k5+wMxOx^r5ZTp%?>4Gi}C-hB(T5N1p65RMaC5ssVW zTo(NyT2CxOw|lP69uC_sHUNfJ4_e;yC(oRgH}_U)BI&QtL)=Ee<<2X!HLfL5qSQat zu&2G)cnBak;>8b-)G43F1d8J*rZ@%KamUqJvUPpBO1D6tCMg9Lrmlcza(V)=F`*26 z{kB345lN~!ihVDLZU>8-HT(ohJW<+evWGMz$xDq=VX?>WnlGEzq^q_P2`|k{uY6c3 zFYc-^N~-aqz^ddyoB)sCF<((7@8?VCMxzTM3aH`kV~sio!sKE-i2E^sFWp$6p&NON z?Q}3IXyK-)5{?WevemtoGVGWyG5|IS@DgSBe}17@A2RvCSXsOsx4~!s`YnaBW?_=# zq($nYPuGRPQZ#wu?ejW{iHfR;*RTxQLOWPEY5~NI#I(=uELV~jRbb|uIf-#uBjyxC zd3f}Oe7Rv=x>6HH>H&tR_x{0Jd23&_)&QWPm|TQEE9S*(A_?L_5f4vIxc2UT%XrCQ zjA|DyQ3OnjQ&(rp!#Ct>lI?x5N8nsReP-V<`O_4+LIseup+AE9QCecSwo$&juU20A zutGjL-l*&0G#`RQ2ZDrChPDkFM&fRVofjDZi$b-R;|A>f!0Bd%L&ti^cCvWqRax@g zdy5p~=D|)C)p?}NL6Y?R&T@r7iP@}r_sxlNQlr$Utl7hvdYXA(Y)aZ>fhx&cm~U(fI}`HUe|?U=zcOTF z!ZdW_Bqw)a#vJtkC&(427Mq{q+OXN-iv9TMlghaQsx&!uc`r8Tx9*s)#>>z{ zoCHntzk9n>e!Z|+k-B_p2><{f07*naQ~{8* z5Fb9bvrLYcv?+Dg--pf5j?t1nbO9=lpe554`|}|1{&-E2cuoK?bf-rq55e*r!E)DC zS@K^WTdGa_JP6*Gu!jN|u_z~_Exh1s?0kPVB8@+IdkQ*)hRipBOG8pR(i(C901*H9 z{Aqdqg9}pQfhtW-0615V-ITADc&qa+T&wU176aYl{RwmZIX3Ul zY2@c~>l5cZHj;z?OFlgqAW+;?q`{PkCsD)Ec&$^%vo(6$owbi;9>o^~!BQcajd?t=j_ zpO++#2A~a#k|aMfT2IH(LPItS2vBKtr^25&B2zDFAwZ$>$9F9diat4M(F#@e_q*k_ z-IZ#*#ObCdBHomw`p+I*q@iJYVz_=s`?6Y2yESU~hi6Y~7;SQ~zP#W1g^BW)Us|Fu zJ5C4K`CL_p{KxC(v>ru5JlbXP{ardpk(v#hCBi5Y--Wr>U=`njNlL7ZQyXh)O6l*H0(T$77M(z5xrIodb@ zR7uR)+TJH6HJ!@;!N9x|BffKRNRSqB;-bSOH9lMuI9QB440t(gL@LRnosQf)iW`Jk z01(?gsnkT(#EY^4V44C`QoBI8L3?xC`{dP+D&?PEI4#8&+GNlL0P9<_s zLUPEMtL7)jf}A*YMtlcfKH9JWa2z7AMD-Ew58lFG{HDC{V?8cd$m08tBTviY6D+D3Na=smJ3L<;19R1qmRd5Dn_A?gHZ zyrvEk7Zv7M>JexUl!*}KSKCSy1~s8SU|1aSG~Lmb*b{#Us*1zJ;giU1{heT6irE3$-7K03Sc-Ioay6t&R5ipbG4$bQx2bNk?nhH z6j|yUuq;wy#D>be%vcTm!2LOO$^Zy$KwI#_9OvO7JeVNIXc)0A7&po4^E)fFc;_$P_5NObJ~Rt>|KGU1Q0}`n zSHn?^_E2$)Z2PoQNouB>lZ{0~&<$%dyiV^<20at%-wNk`Q3t*fmaL5RK zC_DnUvd!r`KUdYRq&n4~^1wf~ydfuQbY!sRotz*vFOg$$;-WLl-&yk|MuudD4S*zu z8z*eQ(vFw5`Aw2I;>oOmtboTj4W|3Tivq#X{s@(T#WU%lweO#eySgYr>j0aUrYM<= z1!gngeMXbcvXNf{74pvh8a)wBK>@@7V1QDby5p*B z$w|G~(UBAV+bd_4c0w5Ek2deSPuRToUzei}mGDPZ+gvUU0cqpp6z9~n>rtxk%!%uA zY52pY=QJSB=OlFMd(;3}Wa4BtKM73nh4wLdB3K`b4dU|`k64h^Oc-5iOO@b3|Nf~H z3R%(wZjwZLKN!2OneHbV`>$M{A}b0L6rP(5ng^h6(=_V_4(E7=d}7u71fEFhxaWXUmICq!!yT#&;pc# zKjFbR)x&pkDw1EIyY%m`ot1xo?VQHxrusj``?p?^Dc`)UP@fIF9WIjU|NHxs+5-$4 zWWuE6_c`flfTyvBBi*m)%WcibO7HEt--J73fu=PJ_nfsgH9#=0K zs0;53H~q@x$r=ifu;HZwLHWS5SsW~@dkr2v&%{LY6E6r`l{Ug3++QRMvSK7QI!wa` zy4U{px5s7o@p=s@{DrpOYepzIKPOgxa9@$!ab>nvu)X<9gq$R*gls>1saSS><{v!q zet$cfz@bodBmp)Z6f%)#>>3;za?@URs2H9|g}k=A%5UkN8-(pizvg|{SsD9u@_y_E zup3Db?fsi4jw^2@P!|SH63j`!=2y9n6={;29(9qRmFZ`yidu)ITK(^@pVM|lAXk%( zsyKRVnD!a}=%Iy5<>rLqWdG=Jo&4mv)5-->O(cgm$O%YHy)-{w{>!6_^#mYU^_D=y zz$kisc(`7EyS-Gkl1wVhtSgRWNkP2)@Bxf0OCqOWPK3P#u7SZJHwg^!Aqfn}B%1AG zUEJ_Z>!FrrEBZsz$W*sHj&y%^B^5gE|9q9`WqivIS6wn#>VXv06nAX*J+XyN!K z1oYL$^!I-D-?J%!5m9JB{1*91(P&PNRHw7 zT)Q$&DGzLx@i+p)h_e?ul%xg{_s)SDV-_Vy&62!04I$_^pm0Sq`hnAp^4|VhrEr6z zn_M7BG?HvumaLsrd{18^r^p8O|HdcP+Q5VIh6(6EF;!KjSEp&8frVU69gW`AKQQFR zf}eQnyyE6(D?7$ieZvdlX&%3Go_yuzLS@%YmC&t|hX>>d6A?58Or1OcI)MqC=F`Q~e|2f7IHjT!a79#%Y?UQvD@4hpox53R)ncRU@d2 zEcy2RHOlicx$yRA=WJe0UqQYqHTdRwG`!Gq3graUjfNo;1E2r~umF^S_JPOvK8LYmtbUi6M=j^@ia;hczRCBb(xQ#)ruRu={?O)J z?K7r-f#en8UYM)Q6gX3fq@@`riWW#J;p94~STM}oJH+F(#mIm^p`JsrHsLPuyr3;S zusKha8lYHHd>l_0>11z=^cq)PQ;++ty;bsePo2~lks)%U9bs1ZV>ODCu)wo+`jE$a zgX8%<9t;WKnTj^qf4W&?YkF)^a5L>u_4oO#NoYv00s(N@(L>s_Bt__v@Kt*o>Ai3^ z6s8b+`p4%_X$Y!b)WnU7$W<#+@VjWFK$WKxaFp-Gil%&S;)td|D+jq~`y*1V0w5zzH z%?;D;|2%U-%4@p(>i)p1zG`{0JiH}OZd{)+rN@=O&FKC2JRk~uP$72guT_-d;F)HH z8vFVf#c8<1#`tiXmB@yN%mq0RIxj}yFCU;{s&Vv=a{2KyC#0&r+c;^*V=`hD<|+(G z1h9BdD!~8x(ix>FLnkmXDk`clS_yTLx%qr^S|kJ2M{4fX3h>WgJ}a;7hN^5vIt1;3 zKStyJ_wFguK8C4wsIJ||>fIk4s?#EdKeb&D0H(UL*i1E~-OeP|HQB&{c&&XB;0f6b z2&$57o-A)ur3?N(aAqJ15z;nD?=N8k4J6P8#%d6v`U_d@`41|z2!^LN*{H$Q(AxZ!cbo@DUaSQp7Iu`Z|wdjA~xGuZ%i{HA9{ zEy)`3HAojcdj_{5^@!%YN#SO!_2J>M*^yJH2^-uTn3!P_qmi?KX`w)))(i*8RPYt3 zl8wXjpaBLtv{n47S4um)u6l<}{|9 zT`@2PhYEB{?*(kmslHr4{{0E}(UMkq_X@1?|sM zwQCx;nYvQfDIXtg(1&-TtWA*&j_*L71Z+aOo3?Jq)Orbx@T090N^MlGiPQ1e{$y50 zT0bihxB8HANaR0wV}3|VX?JycY4{TsELW~bm3ywr)-JH6BVhA11--GSN_)p4!i`5| znoto1LGXXV#i^_S+w0-_uRs6H4O&9$AOx(jE)3wyTMHBc!g}ernd+F$>4O~Yb!-Yy z7SI+7X4Xm2q8xTprG(KwBO)|NQW7GRE`q`Vq2g!;K=a5`@06+hJh8ed1!AJ>;rsi9 za5Oq0rwBGr_ZMN6cc_a!v4#x5gJwNmm1$@XC|7`7*#lGp{eAqspX>3z-{S_#+Iylw zkIu0!%GPMMFc+#Yi>l|;CoTTIkiWm@;SCK9Nq66nh6k`15xV8i;_@~{GE4-tM*2L! z0%`*s>wo>_Wy+-)$pE+)s__5%@>#7~<3&y5Xn)_=uLlbZJ@uGyUG9z1|kS zh3`-7Pf|@~d!)u6nx_!Kee&(|^7B{Dsv|MEZ}t)eRFdEC-@8zOf|%$p>h*ZvC(nu; z4oV9rBnh|`-g%jvHpmkO2B{(kd(}yF;=1jxcDmtnQ+|ipH|hd~SQ2yJxp#q1HsM&D zP4WLoT}4_o?i6&N?yMxVfWWLsa^L+q(KZl076i)^DN7L=uhTfm}!3!U;m@y6y+> zxcNei;2Euuq1yl9!IG8`p%purfh^8!xUA%tg|s}z7ZP1n5VIB@ssswss2YDvGks;d zHg=mF>-Ks;A)uF-xyV41l=yuO08hqA0}X`+aXj;}jV5Dmznfgo9O(6(cvSNgt87G}4;6)_&_vH%-#CL5@}`R}N5Q zh-9Zl$+vEwuXJ0Lt(#$&#`m6BQU4sW{+-Q+r^l0cLv?&FkQ2)9c#GEde%0cK9EdQj z4h0#91<;tXswhz_!c0;eX-W>pb-JQW4dBVQO66=-yYXjn&)Bc6fZ*?OK;VP6!N#Xr zjJg}4ED0#n-a)IF_`+#`mmbZ7(rWtNfm(U<(<)snlL|0vPH_+~O`gFl38D%6vWu4x z>j+Dsu+U=wk&h6a=QlV6Vu$np{NdpJLEd1j!cthj7)5OViGXYIW3Rb^29e4bl?Cb& ztpp;n%H~IR68`y2x(ElY-sT=@YVDJz_Fh$l!&}f8j{(rU?a@`zTc_-f-VGao4k{KA zCMgdUh9hCoc)T(iLf5bM)B!eRXm74}Jj!FEIJM_wgOcDNt5wvFO+)crYdjuQ1w1Jv zHR#X&E?Yzjqz9;$Z~?@Jd09v(0&9EgeUA2iY)rUImddnQ=!U`407Gv9Yy!eW_L2@} z8MGAaPL{XoMEC=znw4r%THT>x>R4PR$cIR`Fbe^73FJB*89?s+FS)yjgF8l7@>Q#i z4_AFf)SrRJ5FnZ<7halUlVcJ{6B+=00H7)uHYY&;z@T<2d3$scziU>&=g-#R9@!~T zniw-a^nX2ZOpzhe;toCsuZl7=MZ*n?Q`F;q!2sMMl?~PecuoL>u)4VaPN>K<9R2p~^O`fAtL)V9(&@!#FU+%4 zrosQw?u2y5v+0AtSlO;Ko#`z`6BKA3b}uKxSoAGUEvVbHZ33@yqB;34uGG6;aAR3x z(V(%~^rT2xRv4#KI~X+Jgz4yXQO5f^Z6+Tii5-yhRUJB3l(s+0|D`n@Dl4KY2>m0| zpz(xocD{Lgp)8x1AQ_2Bpo>D1|KG2VD3@kD20+LIw}mDTq+@*blK2enmn0GcfTv_C zfevvDZ)eQ_&eXxulYQACCYq)H_VQWn9>l?z6c8~yq!o!II0Y~UjM*Lwh0`IoV3JKk zYoB9SnDwBan94PI3K7E%7-#|jL4@K6294hOoO@ts zNczW+%fOOQ10%tpZxc(KZUe9z;6YCqn)cQnx}KV(wSyyb^qvO$S#k7}tinZyMTv?t z&>LYC(vXNe;o(e*VwzNkG6j+uz)R%TjdW&xv00waz$mFbfdA99Lsiw3NeRr#_*O=s zLRuq7o9s&=;|{9={Ljx9E7!;%`caw&Xd)_e|NYBLwXY;9GFTliXb+;yfDec?;KZC7 zmX4oFijZ&IK2N@N`#ecYiqwWAM+OjilUffzt;TBNLBl&l88(LUVP!nQo) z#>Nu!TWqK&@W*fEmDMv&-Gl~3}|tMZ2rBH1;>hYF#zB~Ccnc51$CHC1K?iKy8(_vjQ}`~T)?RaE=fJj z*HF6Ayd|ul=%zzKoN$vm0O6v^h4*J#4o&v-03#@1kDWrhh@u)NqY3bU zGvj?&YYJZI)@EUthHEFzv>^F=`lYUo1m8JP{ z+C{~~06rs8r5O19`xSZ&A3oEfH3bs`K#2ilg9zJ<_fx=6JYFNX0`z!T152@=xsVr0MG$2bh_9`R8409vx!h5 zV_q*4NtVxx)8rN8;Xht45wu0|cI}-5juSC9F|j8#g*$Z^bE=*)z89Ou5|XM?A{-S@ zlZ%JDavnlbsq(<})(l{i2X69N-mfKhA#wlJwsU%V5gv}k9UJL$2!BwSuvMl}6xTfN z<4RSPpzv7L*yA^c^L}qmL>hrO#i=Xc7@WrcypJnn%QI>KV}%cP4gg1lq-#2J0K5ZU z1HGG{y;!UqCKk~oiKGC864~Q-E|85&k~E=&^FnjVKRsWp20%VwQsQSZ0S1Uc@4Gfz zLm`B-d@tS?{GV|}gg=B`CKq8AUX=O2R8gT6m^^Tk&$3@@Hxq%)|G(#~yoH`>lSGyG zB5wh8!vLr$0Yp%-XRrqGKhzT(gvqJP-ehd+!&`FY%H^rr$!5}6?~2~~tecpNuwt}L zgq1;-TDLG!9@vtn9&S2NARGE*@saxb+4IFx)!02Ig5~?bHHi!j*6`=gA6cZ3B{TwR z1~jAqO%hrWQkfjZd=4J%`}ZxBhi}N0{IqDDR_J@dY5DmpXB10kkeojqR^Q(z!J{Xe zlb92k`h}B<=Xf^0{X2MnWM=4CLqCe}huGb8eL#JFaQ{MepioaRTnK?^7ybOzGnP>S zVH?~m-<`rNOPGLS0@Zm>2dyDuB(NCONB@ZbH8!6Vd1 zoUb}ghcFGg2_n0oK!l4p8DLeyPG%xF8G!x8@CWtkVCANL=iVY^-SWOBG<{dby)U?X zdxx|eY&45jDnw$0CL534G<{SE3;^0Pu_z+4&+I7I!k5WKA%-zW48i{1{czEvRU?RM zGDkc3HlEJpQnqYVsIn2M0He_ld)Bv&u(P{gC$#_cxzh^WLisf+Bn7$jeVNI?G!?i@ zFgr~ixXJgjUrVgdxF#lVqBCTixCgmZ^M^Xpj~-s6%{K6`Z~(_kTeSd2SZJD4SWP^k zD$$7nkaKxYfp_vz6qQUaS`|5p z3FE$g`#j~0P~lV>^ubz1IgFu6Dv^m1+W5leBq8&~q6s75&73&jD*y6Qu_8^q20~Ii z10F66&>!BvNQ*v}kkl936;0N{>1&D0S(A77)#$ul(;2|b@WNQNK5}o7T)o`VlcM+q z--?NzOqeuX4^BfUAm|FwS1_I-jjlyse$9RL0nAaiL1{btjlCMq6Qgm%7_4`VE;9Pj% z@Qa?@e%_jS+wYu3i2;yzamujyAKQvBF>>q%H#*Ljg7<^dL*1qaz;w(i&H(2LMI5O` z#MLkWFn`{UwTA>}l2ltx*%}FpLxu!5o+d5V>OXqJ4ZowZv3t}9!iRCxQ03(4#R#UO zAqE4W6Nw`eDDG5wyLJYdT+B8=(T-7^6!a3~!<65GCeNFDs8ty!mPEaQD4U_S$BzwS!s}{uTDGUdQaBeCtfQFZMUC7&GIe` zfGI-AMc#W|j&52`b7u{*VW(M?xxog`tVF|i3FTARk7_y2Xjg!-C6ostnE67KMUMo}BSu18fCrCU`A#*{^2K2~I?eCM9|^1b^ODwA@u3ozb`Os7^$ zd%qsT6l0E`w*+6!{J$vV$wI*w2QyZ7X6Jy^xAjU}$LEvCojhQRRT`obbKs$T?bZTG z*AbszY$m6EVb5Wv-~$rW+|CSOC!fMZbeA^OkhgsE_W4S&0F`sn@ZszeMt&9dM~I1Y zpgzI`8;~ngWo;V<#Zi!RK@kUdAe5pmVycA{7Q(>7aOGUF7YV6+hxa-C-mdTd-+gXW zeraz5V;}2+cFJUUP5_Rv2!yeme$oVAhX=)Lf)=284`*b&m-m!$z5wy4Hd&jLAi@5b zZ_CkMn4lUrBx2DK7sHZxde-)rubxu{==zp!MLZnte>E}+ktFTkzS}x|!M`Va?YVDY zW}N}7y$jVwd5iD!v6}c@!vnCbb$7Z7*1PeYVeT%-j?rS~AK$sa8r(5XG{E)WfAN{S zxV&B2k4~f!Nr1m~CsH4Aib^2sF6<{;3mgHWossPQ-EXau@*=f~ge8qD;Q)2vpo^RZ<3- zn2w8wfVZImg=Tk#gs>h=XoL#k>xuAkRGA@N4RP3HzfrLxyq%&QOH*WC*3``hMnwSv+4gIS<13 zL}bIDPI0ifNuJwLuFOY&0=PVELMa>!$Pda7csgc}A^tQK-kxB=>-4vAYO#bk1Yd}V-QhtHs zR!rf9ctRfVf4JzVD1hBh_65a&4QlD~*vo6JJ1*;QHLKE?t${C_)l)I?=ib)Vh%HlK4`!CJbW6nrX~# zd@r8$woh8t1GQ~tE-cE4)e{%`GhqJ(-~%kp{gIs}kJI1uaMI$PPUL-Kz7^a*Xw7%L~|Ap^l7 zCPgy_-f60iW13zVBXsm!tLj6VR1HlZg8h0H7|4#zhcH-vX0+s|MXB&DV~@f^f;CRp zlVX$)u}=UD7eQGdXYV)~BSW4sE;?j*<6~gC>CqZiVO(qoPM@g)9PFj8|6BS?yiP_9;fW|TSvs1DY8Sn}tAAOX7STYB7R)BNr4PH4eHvGq~D zr7e#_|0O-0P>LrKf0--~(&0LZys=w{z)kv5ES7Q_a3k?JY)_0JDLz~aUrrM*?i0>C z-Dc!itzG>(x6HnRT|xRlBf_ol3S$G~rdY?nPt^%K(z8HIl>#X+In{A$F~f4qCJ)cx zwR~UlEKXg%KkER0i*RQ$MyL)C%Kp2jPN+Jvzd_kFHZwJZAsGx%n5se9cukT=LJE_r zp~2c;^iq`&_r&JGE|)SdLxPFboeyAOt0Q|tg;|ANN1$$4d4~1Ayg%NauxL6rKZ{|@ z$72Y-vXT>7SAV~2tvPFAtph(q8k4aeuKs~RH>wJ>0@^Klqmi_{B{|U2`SQ&L!%D*b zzSP{`&#k~rTme`Az>uOqG?0Bzp)c&14Y zMkji+bH5+(70?_=2YUo2{^tf=1A{|u#ExFvRj$L1kr?qOFhv0f4R(8o8p+9ICukIu z;Lk&dLk8VSBquv13-~jfd&6KLBOCW6vM`wj06P)g=T%~6XkVXQdQqA4Q&j*=pPfU znnh1`?p7VH00sd2n8qwnA*j{B#mr)$elp(6H8kXQw{`aE27BVo^E&vzA0>ig2r2;F zlyBcTU*$OhaU6Mn3Du$*8q#JJ+7y{%Oevn$O^~4Bk(uND=5xO{t5(1h{wwT`lJ}Yg ziE{PIRJmzgx*EiIBM=v=Sd``)nfv-?iTvvI5~UrF)t?DIPE~Z}f<*bV2No(%g@REa zjer=xx}jTD187wwKVdkV3Mb8~M>lt~fnEW6Bj5o+%b~@R5m(d;#?zmo24G?A1M<}N zGL^nNQ_-&R_GlZ8T~DbXLhUrIVS``W-y?Tjnw6M)Cz|UfVi4i`<0KZrfotG ze{=(gVIV_)aVFMrxf@?#p{n~Czs@h-k1B9iu3lnAQdP@-jiyUt<;(OyDJ*bfV`|Iaa zw%k;x)^s7}UO&5500SWIr#14?8w=!1Tl1AXXnGAB0EH&tM&MA8AoN=N>DE9MrV@PP z+6?*beMPcre!@i~flP16emw^8FE18r8zDkWa|STpmAo{64+CH>8V11RQZ)dtf!j{M z^{@eu3UqW^b6Qa@c>3Kk=|BNs4BZ_|VIf56(ciy+p-x<3ddYaQao-yz1mZrPc&kLt zRdxC;&N=xjzX<;S@v(Xx6!*5L70w?TM58vU2uxi^A%Tu5dZZ>okQ*Fg zdSJI4Eoqh4KdF)r4%O-;$d2y0LYV18p7htd$45&X@BWC74wD5rNX4Y-a16T;Hl9&Y z7a0IeCp2->!uPxFr5b+tlM6&Ji@r@nN|C>wpB1ClI1zr3He>V;>Hy{U_SdR90aR@U zV(2VjyKQZ*EIjG^d#n%OIp8!ITZLkrla^uc9%ux9{UV266lhoojGkfy6;hEj$pgoa zmlSuA0Z

$A)o1%;4JjS*;+SK33=f1;UdIHh&WSOO@~y} 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 N002ovPDHLkV1ncPjMM-C literal 0 HcmV?d00001 diff --git a/data/common/android-chrome-512x512.png b/data/common/android-chrome-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..0eece2d2b0d23b5bee6d13b99f63a69e73ae1706 GIT binary patch literal 99449 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

    M1tLDB6CLir2lt7D-zT6gk-&&5Z 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

    8moVFze_{xgKNh(@Mb0-+$NWCWXLhr7B$YF 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 BPj~Px%j~YM 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 Hu0mjfCsE#! literal 0 HcmV?d00001 diff --git a/data/common/favicon.ico b/data/common/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..cef44111ea03cd3aeaefde598bffd80eb6d10984 GIT binary patch literal 15406 zcmeI333yfIna6L`Zg!?)H@i%y!*p@%EY>d5WjZR>T~M@I6_<)q7pPhlcTjP~1&hVH zFSITsgd~uKK-dxj1VTc9KuAIY31opJ1OnMeNb>gmz4v}6CpY(oEzr)>e$R7q&i&4J zzV%)H?~*_uCUAV}=A9}>9zgh1d&fk0r$kl^oAKN|?Vr*)^F9(sRDAdvILK;Tqu zqo3#(!Fs(#EaEGjt$U>C!%32U)9DiT^H0c(b3P>*xBXZ)CA}(L9qqoB{T~}Q6-dg} z-;f2rIYYM0dtY{!uM_Gv&3awZZ~SkWJNo<5vc01Jhg!2|TZtrH`Xwoee_49EyZg22 z?(C3)Ka7*qk>8emO$~kC_jGs3{4xJ4MITJ+Qy>1Lr>93&J~vu&p1QuztLmIINgwrH z>F(MuEjucuZtaq&SJkooMZ2Knu z{7=jN_Evjt+Ok2WpAjR=pSV_LoOhzstVoyXXC5cbHJk1I<~i?4+}R(Or4z1{j9Y)) z@B5yfZrSjsr)B-LC$yh{)aK4p8u+B-y);%T7fjbPEwp;hDdYB^7){vxt2S9*{Mof> zjm*02tCBG6bFx?K=iTx@vfz$0WX8FllFjMU^qfzY;<%T*_RF6bDP^JkqZ0ay9eRRP zE}9{2J8LEX_rI07H-BH|kNuhCK7Wg3JvdzFe}!zzN|4t2Dyd$cV)WXh=SSJGdXcS} zJxWn}saz0iw4D3Gtup6^|C9|MJZtBZ{m5mKJ^pg(>FSbsxBf^r#=dCZckOGFtotvP zdB6UFwP#Nk{q}5INBXGKq_MQXcw*k@ALzQyv~OsWc*z%yPa@H;H9Ekbokc5U_7z{3 zg?9~=ii{6s_vS*`Rkl{jQr^<>e=hrW*B_tQhGj3*ZgtYbIuw5g@z)P zh(h5IDv>io^ct!c@+n%0G`7Ev`RyuOBZcoxv^_`~@nxff*r6ZOefby3dSICGLd*6_ zftLrZXkR;vS6TniI&|+{XT~Tk>E)}NdEq}P58ke_tn!Gb0IjWi=TVa>Hiq(Q+V$U2 z{vRu4$#2TGB}pc0isPrqvWX*&uiRXcF8hk|NSy9Pe|dQ@6YFSclI#h;2(2&1_zQXA zWJ$k1bf5M$?NoXGnk4^ni0uioWW)QS7qf7 zt$5c<8Ec^B}di53aKeWAbd_9==^(sqU zDVh1Qjbr%7cSd`w%4G4q=j-15bWpE_svGMIm$~6(+2dE+_+WtWvZu0GWpG~aRg$Mz zY^!i)U7h<(5ANAoqIhGU)lu)Rj^-w5)b{@G(IcFzzkorJ7rYBE;3e>`U8)1(&iRBS zT>Lo!FTrDA;P~_ZL2=NSe)1Mfi%#%=57q(iBBxwQxcIY%rP_D((u8{l9&+ctdg|Sh zeC5B|@6>BgF^rY_;;r^OPUp5~Yq9&x?(73Nhwqv5y0<5IeHF(}_S(jtb-ZCRFhY1~ zSf8VE?0EZb?OTt?3dN@MhinC#Zh>z@Iws6>c;L>aiXxi}b>O)0QkwWmsC|rpkr&-_uKfl#IJ<@YXaD>>>F)foT`_n3NoB_Y1f}>d%WoGbL=_uwA5*^URIb2Ygh&e!0y9nN{%WeWt7DtBhuR zurWH%(aGvR+-tTFGK%+0)V5&`Jj26I4wt9Ct#vViTKJ~YHilO`LIW)ZXV4whLOyqlL(-rK-*rCU(too!> zWzTZe!Mp0k?W^X?ib*%g(nqf}I~iM!uhgte_ud_=2jqq0S7-+LiEcfX1wRhBgMEO;k!joW7aFfcn+JTm zdCoNRM<6ebv>tuk3Xnujem3sUn>Y@#d((6e4B$2il-2x6lM#0O-r@1$O&*U@mpDR&y#{4lqle{T+ z$`+OFyHy{;L(%*~k;WP9I&|)CwTp`5CQIgh7aD){;{nGD-aW>!IJhI{=^M<3HoMnn z(+u`JBlU;;0=I)14Db3do5!!pyWq4SR_n{hw1L0C?BJ~Gyv$E-8HXQCaua1X-zA7att40eqctYRh`-)U{Ao`0iuUR$o1! z58z1FfxO-__m37&VDD^voi}4=DL%$8UB7OrVxelY8}V=SUR`DrVn2R2Q=DU8SoBoiFfjVS|I+oJ$nhw=7!ylZl{DOVR9wBqFX`9tQaM)|m ze!=c(H+;vNd&d@Y(~tcu0Ain3=Ny4|TkKyBpLuaGl9H><;3C zwd()$+ogxv=YiUDrg>Awda@0Sjn4vnb4W$^1OE@-bDrEwW=>TZeeizjLmJQ5m^dV{ zDR>!Kv0&`~sUId7Z}c@A@UgY7%Ho=iUvr+k&TOOsKN_T$$elWkU3zf>^}B3%|Cxi9 zsqidzl#}t$4LIRg7Wk|1y~mA@*+b%-F6Mind0@xR9sNC{8+0tTcsS0&UWTu*TaVU7 z{4nkM{|L$>m8pelhl3Lt4_hjd3}K$gM(69mk4YTYU%EQmji<67xm+^uA9nPv`!2Rv ztIueN^3Wv~E5?@f7h)X5=b#;AFnI&$N`HaB=G^#So=kQ9AL~0g59Ay8 zON+*|iJ3E(#9?1BtP(CSTk5u%e;Jv2tmo_>51s0KOKuI|FYp-cutD&JhL>)|6JVa) z7jKiCXGZ-+u9eT-Y;mA)`q?z=RkL}S|1!-@h~^jR-rr#{d3^l+uN}r?_>J*Da}jTC z(|8a%798v9Bi+G@#9C<|sc-8;^<212VV}v>2%b@l<}^%>s%x7nHX5Jc7w&&uBl#N3 z+m@ARzHj9D_WVV%Lj9BEt$?%9FVPA-STbXZET4Ey#J=&b@!n$Ss%QNLKakB|<<<5) zd@Oz6yS96`m8vgMeSq+Jgey*YAOC-~Vtp_*xWoB0$eCHCwAbC$>ALH4N5|v$$G6<4 zZ`H@{H?{(JFC0TAU-b=}KXwIit!M=r@Ybrd#+r#KWNTcUaori>lSh7WUaU7*uXsfB zYZ^=QBX*C?vnlB{pFbV@>||S$*&m_tQm+1{>{cD&FYzJ#nl$1|1LioOqltgJ`EV!3 zSDTw*xm>P3X~b8gRsHku+2Xr{aT(r$@rk=ej6v&p;R|$fg!Y^z`|E@|y-K=vBF5_J}dCVZC`Oe#A~= zpYeA?zwX^!wdGxWDtsL16Pwz##a1Q9j`&(a$nVd)j4?m$gCpWY{(I;wTE3ruEau&3nKI9lNw$60Y8&Bx8RPm%pOK&5sUDjSGr=B*1D~R;c9Z`SkBr8&6o41A>`u~a9q>~?_G~>-t=Wn^2%EJ`m(=HB28_pY9;s0jwz31tE)R~T$b@^Al zz6|duK5&II3i>E|WjuL%!Le0;ft$6>feJYQ_&v?u2%CH2u+LjO8O%W;uh9AX83(^3 z`JBWB-I_TEeDcJ+GRIx$)uT7c)7}ZqIr6N?Eph!XQ~ehWKe(^qOL9OG*+ZR=|6)$W z!l5r$h&4mAt{rF7tg;5*oU0>8wQTkqmfN^i<&C2ua_QE*cE4c{*I)R(Uh!z+aEISc z*L<2S;Z6GdMh~og;~{ShHwXCC@`l5(H!_)APS-AR_!rb4nX7rHG^&gz-(>Z$kG zJc+@?t6$RE>)9d;I@ErFKa6(5=mTu*@{x#7R%^~KZKD(<(i|(IL>B*7qZkw=}-*URIx$nGMLXn-`E}4Q%$PNkXzt? zWR}Bn&>ZrK{_VV8ANagjTb0JBoS%X*pbz>a*EQ?GOU#E;vvRKa7g;a1wbL2MN3c-S zmLm1feA7D@d}LrO@aIC!f3^MBzF8x=$M{sx&q_-TRR7qF(Xe5K;T6+|x}VtJ@FeRchD(gz%_%rWxyBRE^Xk|S@|SHtHGig;2TqV; z#joU6BXjA4y(R~!GnDIqUzMD2-k}GIXZ%h?`7~MqtCI`t=EI!JlHV}<0$#LwT?2ZJ z{b#+-H^Mvi3ZFBW+ncA(3H%O5CC=dC6zyl(t)bTR5B^!#9zPXwapUyod*`WrfMubFnw(T` zulWYrBA#zDOV>l)OyxP~*p(Kw8);`_uy@b@T74G5Tol))_ugZ?bLLXch~a*Z+J!N6rJR97{E;A za^p*nREWi)``B;J8hI4Fg1MsD1YGt%63S=D5HJ(86RmBc(l>b`&;!2AWTg@IAX@vy zfJ<&5r)7*`^HR`X3B2USY0dv4F{2xK2t6FKn$?aB^)!3LDHUBqK zTYQGQ%huU==+Rx8d(R$HAE|w@+LZpnIN(YAhrzRpG5Jew4fgy0hk}2gJmpRG1qE|$ z&@IH^wr0jhwLSjY)`g8kE}|#1bq&NBkr(0r&-2$dcQ+sGeEv7V=?v%zIgok(MV7;Z zPZhbM#OgkYdWSAK*JjP7AioTo3XE~I3;an8(sXS|H-NdwwZdiuyEbgdu{?5Q2H4bp zp-b_Blf#ZpN!}OupFQc9OLdeM)2;i4FA6({d}=3?;R}2+-~@Crz6k8f!f6vVF8#Rq z#jr2uDjvZO>BT=m{a>0m^(f6aLbobETX$^JJ$y`3HILGCyUyQRi_(@oYn|ahJtMyz z>)L@8z&T4a&WKO@SQluxQE>~hnDfBa3(pI1bM3u{@;4Mq, ) { diff --git a/src/main/kotlin/ru/mipt/spc/spcHome.kt b/src/main/kotlin/ru/mipt/spc/spcHome.kt index 850d247..b9c1120 100644 --- a/src/main/kotlin/ru/mipt/spc/spcHome.kt +++ b/src/main/kotlin/ru/mipt/spc/spcHome.kt @@ -15,7 +15,7 @@ import java.nio.file.Path import kotlin.reflect.typeOf -context(Page) internal fun HTML.spcPageContent( +context(WebPage) internal fun HTML.spcPageContent( meta: Meta, title: String = meta["title"].string ?: SPC_TITLE, fragment: FlowContent.() -> Unit, @@ -65,7 +65,7 @@ internal val FortyDataRenderer: DataRenderer = { name, data -> } -context(Page) private fun HTML.spcHome() { +context(WebPage) private fun HTML.spcHome() { spcHead() body("is-preload") { wrapper { @@ -252,13 +252,14 @@ context(Page) private fun HTML.spcHome() { } -internal fun SiteBuilder.spcHome(rootPath: Path, prefix: Name = Name.EMPTY) { +internal fun SiteBuilder.spcHome(dataPath: Path, prefix: Name = Name.EMPTY) { - val homePageData = snark.readDirectory(rootPath.resolve("content")) + val homePageData = snark.readDirectory(dataPath.resolve("content")) route(prefix, homePageData, setAsRoot = true) { - assetDirectory("assets", rootPath.resolve("assets")) - assetDirectory("images", rootPath.resolve("images")) + file(dataPath.resolve("assets")) + file(dataPath.resolve("images")) + file(dataPath.resolve("../common"), "") page { spcHome() } diff --git a/src/main/kotlin/ru/mipt/spc/master.kt b/src/main/kotlin/ru/mipt/spc/spcMasters.kt similarity index 91% rename from src/main/kotlin/ru/mipt/spc/master.kt rename to src/main/kotlin/ru/mipt/spc/spcMasters.kt index 02a8ef3..19b702f 100644 --- a/src/main/kotlin/ru/mipt/spc/master.kt +++ b/src/main/kotlin/ru/mipt/spc/spcMasters.kt @@ -15,7 +15,7 @@ import space.kscience.dataforge.names.plus import space.kscience.dataforge.names.withIndex import space.kscience.snark.* import space.kscience.snark.html.* -import space.kscience.snark.html.Page +import space.kscience.snark.html.WebPage import java.nio.file.Path import kotlin.collections.component1 import kotlin.collections.component2 @@ -37,14 +37,14 @@ import kotlin.collections.set private val HtmlData.imagePath: String? get() = meta["image"]?.string ?: meta["image.path"].string private val HtmlData.name: String get() = meta["name"].string ?: error("Name not found") -context(Page) class MagProgSection( +context(WebPage) class MagProgSection( val id: String, val title: String, val style: String, val content: FlowContent.() -> Unit, ) -context(Page) private fun wrapSection( +context(WebPage) private fun wrapSection( id: String, title: String, sectionContent: FlowContent.() -> Unit, @@ -55,7 +55,7 @@ context(Page) private fun wrapSection( } } -context(Page) private fun wrapSection( +context(WebPage) private fun wrapSection( block: HtmlData, idOverride: String? = null, ): MagProgSection = wrapSection( @@ -73,7 +73,7 @@ private val PROGRAM_PATH: Name = CONTENT_NODE_NAME + "program" private val RECOMMENDED_COURSES_PATH: Name = CONTENT_NODE_NAME + "recommendedCourses" private val PARTNERS_PATH: Name = CONTENT_NODE_NAME + "partners" -context(Page) private fun FlowContent.programSection() { +context(WebPage) private fun FlowContent.programSection() { val programBlock = data.resolveHtml(PROGRAM_PATH)!! val recommendedBlock = data.resolveHtml(RECOMMENDED_COURSES_PATH)!! div("inner") { @@ -90,7 +90,7 @@ context(Page) private fun FlowContent.programSection() { } } -context(Page) private fun FlowContent.partners() { +context(WebPage) private fun FlowContent.partners() { //val partnersData: Meta = resolve(PARTNERS_PATH)?.meta ?: Meta.EMPTY val partnersData: Meta = runBlocking { data.getByType(PARTNERS_PATH)?.await() } ?: Meta.EMPTY div("inner") { @@ -120,7 +120,7 @@ context(Page) private fun FlowContent.partners() { // val photo: String? by meta.string() //} -context(Page) private fun FlowContent.team() { +context(WebPage) private fun FlowContent.team() { val team = data.findByContentType("magprog_team").values.sortedBy { it.order } div("inner") { @@ -175,7 +175,7 @@ context(Page) private fun FlowContent.team() { // } } -context(Page) private fun FlowContent.mentors() { +context(WebPage) private fun FlowContent.mentors() { val mentors = data.findByContentType("magprog_mentor").entries.sortedBy { it.value.id } div("inner") { @@ -213,7 +213,7 @@ context(Page) private fun FlowContent.mentors() { } } -context(Page) internal fun HTML.magProgHead(title: String) { +context(WebPage) internal fun HTML.magProgHead(title: String) { head { this.title = title meta { @@ -237,10 +237,31 @@ context(Page) internal fun HTML.magProgHead(title: String) { href = resolveRef("assets/css/noscript.css") } } + link { + rel = "apple-touch-icon" + sizes = "180x180" + href = "/apple-touch-icon.png" + } + link { + rel = "icon" + type = "image/png" + sizes = "32x32" + href = "/favicon-32x32.png" + } + link { + rel = "icon" + type = "image/png" + sizes = "16x16" + href = "/favicon-16x16.png" + } + link { + rel = "manifest" + href = "/site.webmanifest" + } } } -context(Page) internal fun BODY.magProgFooter() { +context(WebPage) internal fun BODY.magProgFooter() { footer("wrapper style1-alt") { id = "footer" div("inner") { @@ -281,13 +302,14 @@ context(Page) internal fun BODY.magProgFooter() { context(SnarkContext) private val HtmlData.mentorPageId get() = "mentor-${id}" -internal fun SiteBuilder.spcMaster(dataPath: Path, prefix: Name = "magprog".asName()) { +internal fun SiteBuilder.spcMasters(dataPath: Path, prefix: Name = "magprog".asName()) { val magProgData: DataTree = snark.readDirectory(dataPath.resolve("content")) route(prefix, magProgData, setAsRoot = true) { - assetDirectory("assets", dataPath.resolve("assets")) - assetDirectory("images", dataPath.resolve("images")) + file(dataPath.resolve("assets")) + file(dataPath.resolve("images")) + file(dataPath.resolve("../common"), "") page { val sections = listOf( diff --git a/src/main/kotlin/ru/mipt/spc/spcMisc.kt b/src/main/kotlin/ru/mipt/spc/spcMisc.kt index 042913c..36ca434 100644 --- a/src/main/kotlin/ru/mipt/spc/spcMisc.kt +++ b/src/main/kotlin/ru/mipt/spc/spcMisc.kt @@ -1,14 +1,14 @@ package ru.mipt.spc import kotlinx.html.* -import space.kscience.snark.html.Page +import space.kscience.snark.html.WebPage import space.kscience.snark.html.homeRef import space.kscience.snark.html.resolvePageRef internal const val SPC_TITLE = "Scientific Programming Centre" -context(Page) internal fun HTML.spcHead(title: String = SPC_TITLE) { +context(WebPage) internal fun HTML.spcHead(title: String = SPC_TITLE) { head { title { +title @@ -24,10 +24,31 @@ context(Page) internal fun HTML.spcHead(title: String = SPC_TITLE) { noScript { link(rel = "stylesheet", href = resolveRef("assets/css/noscript.css")) } + link { + rel = "apple-touch-icon" + sizes = "180x180" + href = "/apple-touch-icon.png" + } + link { + rel = "icon" + type = "image/png" + sizes = "32x32" + href = "/favicon-32x32.png" + } + link { + rel = "icon" + type = "image/png" + sizes = "16x16" + href = "/favicon-16x16.png" + } + link { + rel = "manifest" + href = "/site.webmanifest" + } } } -context(Page) internal fun FlowContent.spcHomeMenu() { +context(WebPage) internal fun FlowContent.spcHomeMenu() { nav { id = "menu" ul("links") { @@ -39,7 +60,7 @@ context(Page) internal fun FlowContent.spcHomeMenu() { } li { a { - href = resolvePageRef("magprog") + href = resolvePageRef("magprog.index") +"""Master""" } } @@ -51,7 +72,7 @@ context(Page) internal fun FlowContent.spcHomeMenu() { } li { a { - href = resolvePageRef("consulting") + href = resolvePageRef("consulting.index") +"""Consulting""" } } @@ -79,7 +100,7 @@ context(Page) internal fun FlowContent.spcHomeMenu() { } } -context(Page) internal fun FlowContent.spcFooter() { +context(WebPage) internal fun FlowContent.spcFooter() { footer { id = "footer" div("inner") { @@ -129,7 +150,7 @@ context(Page) internal fun FlowContent.spcFooter() { } } -context(Page) internal fun FlowContent.wrapper(contentBody: FlowContent.() -> Unit) { +context(WebPage) internal fun FlowContent.wrapper(contentBody: FlowContent.() -> Unit) { div { id = "wrapper" // Header diff --git a/src/main/kotlin/ru/mipt/spc/staticRender.kt b/src/main/kotlin/ru/mipt/spc/staticRender.kt index c6f59ec..4af783e 100644 --- a/src/main/kotlin/ru/mipt/spc/staticRender.kt +++ b/src/main/kotlin/ru/mipt/spc/staticRender.kt @@ -1,15 +1,13 @@ package ru.mipt.spc -import space.kscience.dataforge.context.Global -import space.kscience.dataforge.context.fetch -import space.kscience.snark.html.SnarkPlugin -import space.kscience.snark.html.renderStatic +import space.kscience.snark.SnarkEnvironment +import space.kscience.snark.html.static import java.nio.file.Path import kotlin.io.path.toPath fun main() { - Global.fetch(SnarkPlugin).renderStatic(Path.of("build/out")) { - spcHome(rootPath = javaClass.getResource("/home")!!.toURI().toPath()) - spcMaster(dataPath = javaClass.getResource("/magprog")!!.toURI().toPath()) + SnarkEnvironment.default.static(Path.of("build/out")) { + spcHome(dataPath = javaClass.getResource("/home")!!.toURI().toPath()) + spcMasters(dataPath = javaClass.getResource("/magprog")!!.toURI().toPath()) } } \ No newline at end of file From 7975a2072ea81d13b847dbca5a61ab223f399807 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 3 Jul 2022 16:39:38 +0300 Subject: [PATCH 4/5] Add publishing --- build.gradle.kts | 2 +- gradle.properties | 3 ++- settings.gradle.kts | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index b9d5b2d..43da64a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -21,7 +21,7 @@ application { applicationDefaultJvmArgs = listOf("-Dio.ktor.development=$isDevelopment", "-Xmx200M") } -val snarkVersion by extra("0.1.0-dev-1") +val snarkVersion: String by extra val ktorVersion = KScienceVersions.ktorVersion dependencies { diff --git a/gradle.properties b/gradle.properties index e2e0fd8..26b15c8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,4 @@ kotlin.code.style=official -toolsVersion=0.11.7-kotlin-1.7.0 \ No newline at end of file +toolsVersion=0.11.7-kotlin-1.7.0 +snarkVersion=0.1.0-dev-1 \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 285a551..ea2d6ee 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -6,6 +6,7 @@ enableFeaturePreview("VERSION_CATALOGS") pluginManagement { val toolsVersion: String by extra + val snarkVersion: String by extra repositories { maven("https://repo.kotlin.link") @@ -18,7 +19,7 @@ pluginManagement { id("ru.mipt.npm.gradle.mpp") version toolsVersion id("ru.mipt.npm.gradle.jvm") version toolsVersion id("ru.mipt.npm.gradle.js") version toolsVersion - id("space.kscience.snark") version "0.1.0-dev-1" + id("space.kscience.snark") version snarkVersion } } From 2b5af660afdd49fbbba0bbd2d0e661cb763809fb Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 3 Jul 2022 17:13:39 +0300 Subject: [PATCH 5/5] Quick-fix for sharing common data --- src/main/kotlin/ru/mipt/spc/Application.kt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/kotlin/ru/mipt/spc/Application.kt b/src/main/kotlin/ru/mipt/spc/Application.kt index dfd6c88..61e33eb 100644 --- a/src/main/kotlin/ru/mipt/spc/Application.kt +++ b/src/main/kotlin/ru/mipt/spc/Application.kt @@ -82,6 +82,12 @@ fun Application.spcModule() { } SnarkEnvironment.default.site { + + resolveData( + this@spcModule.javaClass.getResource("/common")!!.toURI(), + dataPath / "common" + ) + val homeDataPath = resolveData( this@spcModule.javaClass.getResource("/home")!!.toURI(), dataPath / "home"