From b90ec0fef85f7a8088e00c56ddae38a5a5f99fe0 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sat, 30 Apr 2022 10:32:00 +0300 Subject: [PATCH] Fully functional! --- build.gradle.kts | 44 +++++--- gradle.properties | 3 - src/main/kotlin/ru/mipt/Application.kt | 64 ++++++++++- src/main/kotlin/ru/mipt/plugins/Routing.kt | 36 ------- src/main/kotlin/ru/mipt/plugins/Templating.kt | 4 +- .../ru/mipt/spc/magprog/DataSetSiteContext.kt | 101 ++++++++++++++++++ .../ru/mipt/spc/magprog/DirectoryDataTree.kt | 78 ++++++++++++++ .../kotlin/ru/mipt/spc/magprog/HtmlBlock.kt | 5 + src/main/kotlin/ru/mipt/spc/magprog/Person.kt | 4 +- .../kotlin/ru/mipt/spc/magprog/SiteContext.kt | 14 +-- .../kotlin/ru/mipt/spc/magprog/magProgPage.kt | 69 ++++++------ src/main/kotlin/ru/mipt/spc/magprog/misc.kt | 6 +- .../images/mentors/Dolgonosov.jpg | Bin .../images/mentors/Gertsenberger.jpg | Bin .../{ => assets}/images/mentors/Grinis.jpg | Bin .../{ => assets}/images/mentors/Kalashev.jpg | Bin .../images/mentors/Khokhriakov.jpg | Bin .../{ => assets}/images/mentors/Klimai.jpg | Bin .../{ => assets}/images/mentors/Kostunin.jpg | Bin .../{ => assets}/images/mentors/Nozik.jpg | Bin .../images/mentors/Oliinychenko.jpg | Bin .../images/mentors/Pshenichnov.jpg | Bin .../{ => assets}/images/mentors/Shagalov.jpg | Bin .../images/mentors/Skasyrskaya.jpg | Bin .../{ => assets}/images/mentors/Template.jpg | Bin .../{ => assets}/images/mentors/Usmanov.jpg | Bin .../{ => assets}/images/partners/FPMI.jpg | Bin .../{ => assets}/images/partners/JBR.png | Bin .../{ => assets}/images/partners/LPI.jpg | Bin .../{ => assets}/images/partners/Tavrida.png | Bin .../{ => assets}/images/partners/aramco.jpg | Bin .../{ => assets}/images/partners/biotech.png | Bin .../{ => assets}/images/partners/desy.svg | 0 .../{ => assets}/images/partners/hse.jpg | Bin .../{ => assets}/images/partners/iki.jpg | Bin .../images/partners/jetbrains.png | Bin .../{ => assets}/images/partners/jinr.png | Bin .../{ => assets}/images/partners/tink.jpg | Bin .../{ => assets}/images/team/Aivazov.jpg | Bin .../magprog/content/mentors/Dolgonosov.md | 4 +- .../magprog/content/mentors/Gertsenberger.md | 4 +- .../magprog/content/mentors/Grinis.md | 4 +- .../magprog/content/mentors/Kalashev.md | 4 +- .../magprog/content/mentors/Khokhriakov.md | 4 +- .../magprog/content/mentors/Klimai.md | 4 +- .../magprog/content/mentors/Kostunin.md | 4 +- .../magprog/content/mentors/Nozik.md | 4 +- .../magprog/content/mentors/Oliinychenko.md | 4 +- .../magprog/content/mentors/Pshenichnov.md | 4 +- .../magprog/content/mentors/Shagalov.md | 4 +- .../magprog/content/mentors/Skasyrskaya.md | 4 +- .../magprog/content/mentors/Usmanov.md | 4 +- .../magprog/content/mentors/template.md | 4 +- .../resources/magprog/content/partners.yaml | 20 ++-- .../resources/magprog/content/team/Aivazov.md | 4 +- .../resources/magprog/content/team/nozik.md | 4 +- .../magprog/content/team/svetlichnii.md | 4 +- src/main/resources/magprog/elements.html | 24 ++--- src/main/resources/magprog/generic.html | 2 +- src/main/resources/magprog/index.html | 6 +- src/test/kotlin/ru/mipt/ApplicationTest.kt | 8 +- 61 files changed, 389 insertions(+), 167 deletions(-) delete mode 100644 src/main/kotlin/ru/mipt/plugins/Routing.kt create mode 100644 src/main/kotlin/ru/mipt/spc/magprog/DataSetSiteContext.kt create mode 100644 src/main/kotlin/ru/mipt/spc/magprog/DirectoryDataTree.kt rename src/main/resources/magprog/{ => assets}/images/mentors/Dolgonosov.jpg (100%) rename src/main/resources/magprog/{ => assets}/images/mentors/Gertsenberger.jpg (100%) rename src/main/resources/magprog/{ => assets}/images/mentors/Grinis.jpg (100%) rename src/main/resources/magprog/{ => assets}/images/mentors/Kalashev.jpg (100%) rename src/main/resources/magprog/{ => assets}/images/mentors/Khokhriakov.jpg (100%) rename src/main/resources/magprog/{ => assets}/images/mentors/Klimai.jpg (100%) rename src/main/resources/magprog/{ => assets}/images/mentors/Kostunin.jpg (100%) rename src/main/resources/magprog/{ => assets}/images/mentors/Nozik.jpg (100%) rename src/main/resources/magprog/{ => assets}/images/mentors/Oliinychenko.jpg (100%) rename src/main/resources/magprog/{ => assets}/images/mentors/Pshenichnov.jpg (100%) rename src/main/resources/magprog/{ => assets}/images/mentors/Shagalov.jpg (100%) rename src/main/resources/magprog/{ => assets}/images/mentors/Skasyrskaya.jpg (100%) rename src/main/resources/magprog/{ => assets}/images/mentors/Template.jpg (100%) rename src/main/resources/magprog/{ => assets}/images/mentors/Usmanov.jpg (100%) rename src/main/resources/magprog/{ => assets}/images/partners/FPMI.jpg (100%) rename src/main/resources/magprog/{ => assets}/images/partners/JBR.png (100%) rename src/main/resources/magprog/{ => assets}/images/partners/LPI.jpg (100%) rename src/main/resources/magprog/{ => assets}/images/partners/Tavrida.png (100%) rename src/main/resources/magprog/{ => assets}/images/partners/aramco.jpg (100%) rename src/main/resources/magprog/{ => assets}/images/partners/biotech.png (100%) rename src/main/resources/magprog/{ => assets}/images/partners/desy.svg (100%) rename src/main/resources/magprog/{ => assets}/images/partners/hse.jpg (100%) rename src/main/resources/magprog/{ => assets}/images/partners/iki.jpg (100%) rename src/main/resources/magprog/{ => assets}/images/partners/jetbrains.png (100%) rename src/main/resources/magprog/{ => assets}/images/partners/jinr.png (100%) rename src/main/resources/magprog/{ => assets}/images/partners/tink.jpg (100%) rename src/main/resources/magprog/{ => assets}/images/team/Aivazov.jpg (100%) diff --git a/build.gradle.kts b/build.gradle.kts index 64ee991..b1325e1 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,15 +1,18 @@ -val ktor_version: String by project -val kotlin_version: String by project -val logback_version: String by project +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile +import ru.mipt.npm.gradle.KScienceVersions plugins { id("ru.mipt.npm.gradle.project") - application id("ru.mipt.npm.gradle.jvm") + application +} + +repositories{ + mavenLocal() } group = "ru.mipt.npm" -version = "0.0.1" +version = "0.0.1-SNAPSHOT" application { mainClass.set("ru.mipt.ApplicationKt") @@ -18,20 +21,29 @@ application { applicationDefaultJvmArgs = listOf("-Dio.ktor.development=$isDevelopment") } +tasks.withType{ + kotlinOptions{ + freeCompilerArgs = freeCompilerArgs + "-Xcontext-receivers" + } +} + +val dataforgeVersion by extra("0.6.0-dev-3") +val ktorVersion = KScienceVersions.ktorVersion + dependencies { - implementation("io.ktor:ktor-server-core-jvm:$ktor_version") - implementation("org.jetbrains.kotlinx:kotlinx-html:0.7.3") - implementation("io.ktor:ktor-server-html-builder-jvm:$ktor_version") - implementation("org.jetbrains:kotlin-css-jvm") - implementation("io.ktor:ktor-server-host-common-jvm:$ktor_version") - implementation("io.ktor:ktor-server-status-pages-jvm:$ktor_version") - implementation("io.ktor:ktor-server-netty-jvm:$ktor_version") - implementation("ch.qos.logback:logback-classic:$logback_version") - implementation("space.kscience:dataforge-data:0.5.2") + 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("io.ktor:ktor-server-netty:$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-jvm:$ktor_version") - testImplementation("org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version") + testImplementation("io.ktor:ktor-server-tests:$ktorVersion") } kotlin { diff --git a/gradle.properties b/gradle.properties index 8f11136..7d0dfa5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,3 @@ -ktor_version=2.0.0 -kotlin_version=1.6.20 -logback_version=1.2.11 kotlin.code.style=official toolsVersion=0.11.4-kotlin-1.6.20 diff --git a/src/main/kotlin/ru/mipt/Application.kt b/src/main/kotlin/ru/mipt/Application.kt index 257b8c6..4f17931 100644 --- a/src/main/kotlin/ru/mipt/Application.kt +++ b/src/main/kotlin/ru/mipt/Application.kt @@ -1,13 +1,73 @@ package ru.mipt +import io.ktor.http.HttpStatusCode +import io.ktor.server.application.Application +import io.ktor.server.application.call +import io.ktor.server.application.install import io.ktor.server.engine.embeddedServer +import io.ktor.server.html.respondHtml +import io.ktor.server.http.content.resources +import io.ktor.server.http.content.static import io.ktor.server.netty.Netty -import ru.mipt.plugins.configureRouting +import io.ktor.server.plugins.statuspages.StatusPages +import io.ktor.server.response.respond +import io.ktor.server.routing.get +import io.ktor.server.routing.route +import io.ktor.server.routing.routing import ru.mipt.plugins.configureTemplating +import ru.mipt.spc.magprog.DataSetSiteContext +import ru.mipt.spc.magprog.DirectoryDataTree +import ru.mipt.spc.magprog.SiteContext +import ru.mipt.spc.magprog.magProgPage +import space.kscience.dataforge.context.Context +import space.kscience.dataforge.io.io +import space.kscience.dataforge.io.yaml.YamlPlugin +import java.nio.file.Path + + +class AuthenticationException : RuntimeException() +class AuthorizationException : RuntimeException() + +internal fun Application.magProgSite(prefix: String = "magprog"){ + val context = Context("spc-site"){ + plugin(YamlPlugin) + } + + val io = context.io + val directory = javaClass.getResource("/magprog/content")!!.toURI() + val content = DirectoryDataTree(io, Path.of(directory)) + + + val magprogSiteContext: SiteContext = DataSetSiteContext(context,"magprog", content) + + routing { + route(prefix){ + get { + call.respondHtml { + with(magprogSiteContext){ + magProgPage() + } + } + } + static { + resources("magprog/assets") + } + } + } +} + fun main() { embeddedServer(Netty, port = 8080, host = "0.0.0.0") { - configureRouting() + magProgSite() + install(StatusPages) { + exception { call, cause -> + call.respond(HttpStatusCode.Unauthorized) + } + exception { call, cause -> + call.respond(HttpStatusCode.Forbidden) + } + } configureTemplating() }.start(wait = true) } diff --git a/src/main/kotlin/ru/mipt/plugins/Routing.kt b/src/main/kotlin/ru/mipt/plugins/Routing.kt deleted file mode 100644 index e331ab6..0000000 --- a/src/main/kotlin/ru/mipt/plugins/Routing.kt +++ /dev/null @@ -1,36 +0,0 @@ -package ru.mipt.plugins - -import io.ktor.http.HttpStatusCode -import io.ktor.server.application.Application -import io.ktor.server.application.call -import io.ktor.server.application.install -import io.ktor.server.http.content.resources -import io.ktor.server.http.content.static -import io.ktor.server.plugins.statuspages.StatusPages -import io.ktor.server.response.respond -import io.ktor.server.response.respondText -import io.ktor.server.routing.get -import io.ktor.server.routing.routing - -fun Application.configureRouting() { - routing { - get("/") { - call.respondText("Hello World!") - } - // Static plugin. Try to access `/static/index.html` - static("/magprog") { - resources("magprog") - } - } - install(StatusPages) { - exception { call, cause -> - call.respond(HttpStatusCode.Unauthorized) - } - exception { call, cause -> - call.respond(HttpStatusCode.Forbidden) - } - } -} - -class AuthenticationException : RuntimeException() -class AuthorizationException : RuntimeException() diff --git a/src/main/kotlin/ru/mipt/plugins/Templating.kt b/src/main/kotlin/ru/mipt/plugins/Templating.kt index c05eee9..06eed6f 100644 --- a/src/main/kotlin/ru/mipt/plugins/Templating.kt +++ b/src/main/kotlin/ru/mipt/plugins/Templating.kt @@ -54,7 +54,7 @@ fun Application.configureTemplating() { } } -suspend inline fun ApplicationCall.respondCss(builder: CSSBuilder.() -> Unit) { - this.respondText(CSSBuilder().apply(builder).toString(), ContentType.Text.CSS) +suspend inline fun ApplicationCall.respondCss(builder: CssBuilder.() -> Unit) { + this.respondText(CssBuilder().apply(builder).toString(), ContentType.Text.CSS) } diff --git a/src/main/kotlin/ru/mipt/spc/magprog/DataSetSiteContext.kt b/src/main/kotlin/ru/mipt/spc/magprog/DataSetSiteContext.kt new file mode 100644 index 0000000..9976af0 --- /dev/null +++ b/src/main/kotlin/ru/mipt/spc/magprog/DataSetSiteContext.kt @@ -0,0 +1,101 @@ +package ru.mipt.spc.magprog + +import kotlinx.coroutines.runBlocking +import kotlinx.html.div +import kotlinx.html.unsafe +import kotlinx.serialization.json.Json +import org.intellij.markdown.flavours.commonmark.CommonMarkFlavourDescriptor +import org.intellij.markdown.html.HtmlGenerator +import org.intellij.markdown.parser.MarkdownParser +import ru.mipt.spc.magprog.DirectoryDataTree.Companion.META_FILE_EXTENSION_KEY +import space.kscience.dataforge.context.Context +import space.kscience.dataforge.data.* +import space.kscience.dataforge.io.asBinary +import space.kscience.dataforge.io.readObject +import space.kscience.dataforge.io.yaml.YamlMetaFormat +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.get +import space.kscience.dataforge.meta.string +import space.kscience.dataforge.meta.toMeta +import space.kscience.dataforge.misc.DFInternal +import space.kscience.dataforge.names.Name +import kotlin.reflect.KType +import kotlin.reflect.typeOf + +class DataSetSiteContext( + override val context: Context, + val prefix: String, + val dataSet: DataSet, +) : SiteContext { + + override fun resolveResource(name: String): String = "$prefix/$name" + + private val markdownFlavor = CommonMarkFlavourDescriptor() + private val markdownParser = MarkdownParser(markdownFlavor) + + //TODO replace by a plugin + private suspend fun Data.toHtmlBlock(): HtmlBlock { + val fileType = meta[META_FILE_EXTENSION_KEY].string + val src = await().decodeToString() + + return when (fileType) { + "html" -> HtmlBlock(meta) { + div { + unsafe { + +src + } + } + } + + "markdown", "mdown", "mkdn", "mkd", "md" -> HtmlBlock(meta) { + div("markdown") { + val parsedTree = markdownParser.buildMarkdownTreeFromString(src) + + unsafe { + +HtmlGenerator(src, parsedTree, markdownFlavor).generateHtml() + } + } + } + else -> error("Can't convert a data with file extension $fileType to html") + } + + } + + private val Data<*>.published: Boolean get() = meta["published"].string != "false" + + @DFInternal + override fun resolve(type: KType, name: Name): Data? = when (type) { + typeOf() -> { + val data = dataSet.selectOne(name) + if( data == null) null else { + when (data.meta[META_FILE_EXTENSION_KEY].string) { + "json" -> data.map { + Json.parseToJsonElement(it.decodeToString()).toMeta() + } + "yaml" -> data.map { + YamlMetaFormat.readObject(it.asBinary()) + } + else -> error("File with extension ${data.meta[META_FILE_EXTENSION_KEY]} could not be parsed as Meta") + } as Data? + } + } + else -> dataSet.selectOne(type, name) + } + + @DFInternal + override fun resolveAll(type: KType, filter: (name: Name, meta: Meta) -> Boolean): DataSet = + dataSet.select(type, filter = filter) + + override fun resolveHtml(name: Name): HtmlBlock? = runBlocking { + resolve(name)?.takeIf { it.published }?.toHtmlBlock() + } + + override fun resolveAllHtml(filter: (name: Name, meta: Meta) -> Boolean): Map = runBlocking { + buildMap { + resolveAll(filter).dataSequence().filter { it.published }.forEach { + put(it.name, it.toHtmlBlock()) + } + } + } + +} \ No newline at end of file diff --git a/src/main/kotlin/ru/mipt/spc/magprog/DirectoryDataTree.kt b/src/main/kotlin/ru/mipt/spc/magprog/DirectoryDataTree.kt new file mode 100644 index 0000000..75d4861 --- /dev/null +++ b/src/main/kotlin/ru/mipt/spc/magprog/DirectoryDataTree.kt @@ -0,0 +1,78 @@ +package ru.mipt.spc.magprog + +import space.kscience.dataforge.data.Data +import space.kscience.dataforge.data.DataTree +import space.kscience.dataforge.data.DataTreeItem +import space.kscience.dataforge.data.StaticData +import space.kscience.dataforge.io.IOPlugin +import space.kscience.dataforge.io.readEnvelopeFile +import space.kscience.dataforge.io.readMetaFile +import space.kscience.dataforge.io.toByteArray +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.copy +import space.kscience.dataforge.names.NameToken +import space.kscience.dataforge.names.asName +import space.kscience.dataforge.names.plus +import java.nio.file.Path +import kotlin.io.path.extension +import kotlin.io.path.isDirectory +import kotlin.io.path.listDirectoryEntries +import kotlin.io.path.nameWithoutExtension +import kotlin.reflect.KType +import kotlin.reflect.typeOf + +//internal object ByteArrayIOFormat : IOFormat { +// +// override val type: KType = typeOf() +// +// override fun writeObject(output: Output, obj: ByteArray) { +// output.writeFully(obj) +// } +// +// override fun readObject(input: Input): ByteArray = input.readBytes() +// +// override fun toMeta(): Meta = Meta { +// IOFormat.NAME_KEY put "ByteArray" +// } +// +//} + + +class DirectoryDataTree(val io: IOPlugin, val path: Path) : DataTree { + override val dataType: KType + get() = typeOf() + + override val meta: Meta get() = io.readMetaFile(path) + + private fun readFile(filePath: Path): Data { + val envelope = io.readEnvelopeFile(filePath, readNonEnvelopes = true) + val meta = envelope.meta.copy { + META_FILE_PATH_KEY put filePath.toString() + META_FILE_EXTENSION_KEY put filePath.extension + //TODO add other file information + } + return StaticData(typeOf(), envelope.data?.toByteArray() ?: ByteArray(0), meta) + } + + + override val items: Map> + get() = path.listDirectoryEntries().associate { childPath -> + val fileName = childPath.fileName.nameWithoutExtension + + val item: DataTreeItem = if (childPath.isDirectory()) { + DataTreeItem.Node(DirectoryDataTree(io, childPath)) + } else { + DataTreeItem.Leaf(readFile(childPath)) + } + + NameToken(fileName) to item + } + + companion object { + val META_FILE_KEY = "file".asName() + val META_FILE_PATH_KEY = META_FILE_KEY + "path" + val META_FILE_EXTENSION_KEY = META_FILE_KEY + "extension" + } +} + +//TODO add transforming provider instead of ByteArray DataSet \ No newline at end of file diff --git a/src/main/kotlin/ru/mipt/spc/magprog/HtmlBlock.kt b/src/main/kotlin/ru/mipt/spc/magprog/HtmlBlock.kt index e1c8874..168c3ca 100644 --- a/src/main/kotlin/ru/mipt/spc/magprog/HtmlBlock.kt +++ b/src/main/kotlin/ru/mipt/spc/magprog/HtmlBlock.kt @@ -13,6 +13,11 @@ interface HtmlBlock { val content: FlowContent.() -> Unit } +fun HtmlBlock(meta: Meta, content: FlowContent.() -> Unit ) = object: HtmlBlock{ + override val meta: Meta = meta + override val content: FlowContent.() -> Unit = content +} + val HtmlBlock.id: String get() = meta["id"]?.string ?: "block[${hashCode()}]" val HtmlBlock.language: Language get() = meta["language"]?.enum() ?: Language.RU diff --git a/src/main/kotlin/ru/mipt/spc/magprog/Person.kt b/src/main/kotlin/ru/mipt/spc/magprog/Person.kt index 80b3f1c..27e9bf4 100644 --- a/src/main/kotlin/ru/mipt/spc/magprog/Person.kt +++ b/src/main/kotlin/ru/mipt/spc/magprog/Person.kt @@ -36,7 +36,9 @@ private fun FlowContent.personCards(list: List, prefix: String) { context(SiteContext) fun FlowContent.mentors() { - val mentors = findByType("magprog_mentor").values.map { Person(it) }.sortedBy { it.order } + val mentors = findByType("magprog_mentor").values.map { + Person(it) + }.sortedBy { it.order } div("header") { css { diff --git a/src/main/kotlin/ru/mipt/spc/magprog/SiteContext.kt b/src/main/kotlin/ru/mipt/spc/magprog/SiteContext.kt index 63cfe34..61fa06a 100644 --- a/src/main/kotlin/ru/mipt/spc/magprog/SiteContext.kt +++ b/src/main/kotlin/ru/mipt/spc/magprog/SiteContext.kt @@ -1,26 +1,28 @@ package ru.mipt.spc.magprog -import io.ktor.util.InternalAPI +import space.kscience.dataforge.context.ContextAware import space.kscience.dataforge.data.Data import space.kscience.dataforge.data.DataSet import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.string +import space.kscience.dataforge.misc.DFInternal import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.startsWith import kotlin.reflect.KType import kotlin.reflect.typeOf -interface SiteContext { +interface SiteContext: ContextAware { + /** * Resolve a resource full path by its name */ fun resolveResource(name: String): String - @InternalAPI + @DFInternal fun resolve(type: KType, name: Name): Data? - @InternalAPI + @DFInternal fun resolveAll(type: KType, filter: (name: Name, meta: Meta) -> Boolean): DataSet /** @@ -34,10 +36,10 @@ interface SiteContext { fun resolveAllHtml(filter: (name: Name, meta: Meta) -> Boolean): Map } -@OptIn(InternalAPI::class) +@OptIn(DFInternal::class) inline fun SiteContext.resolve(name: Name): Data? = resolve(typeOf(), name) -@OptIn(InternalAPI::class) +@OptIn(DFInternal::class) inline fun SiteContext.resolveAll(noinline filter: (name: Name, meta: Meta) -> Boolean): DataSet = resolveAll(typeOf(), filter) diff --git a/src/main/kotlin/ru/mipt/spc/magprog/magProgPage.kt b/src/main/kotlin/ru/mipt/spc/magprog/magProgPage.kt index d088438..0a9b12e 100644 --- a/src/main/kotlin/ru/mipt/spc/magprog/magProgPage.kt +++ b/src/main/kotlin/ru/mipt/spc/magprog/magProgPage.kt @@ -1,15 +1,16 @@ package ru.mipt.spc.magprog +import kotlinx.coroutines.runBlocking import kotlinx.css.* import kotlinx.html.* +import space.kscience.dataforge.data.await import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.string import space.kscience.dataforge.names.Name -import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.plus -//fun CSSBuilder.magProgCss() { +//fun CssBuilder.magProgCss() { // rule(".magprog-body") { // rule(".magprog-header") { // display = Display.flex @@ -45,19 +46,21 @@ private fun wrapSection( } } -private fun wrapSection(block: HtmlBlock, idOverride: String? = null): MagProgSection = - wrapSection( - idOverride ?: block.id, - block.meta["section_title"]?.string ?: error("Section without title"), - block.content - ) +private fun wrapSection( + block: HtmlBlock, + idOverride: String? = null, +): MagProgSection = wrapSection( + idOverride ?: block.id, + block.meta["section_title"]?.string ?: error("Section without title"), + block.content +) -private val CONTENT_NODE_NAME = "content".asName() -private val INTRO_PATH: Name = TODO() -private val ENROLL_PATH: Name = TODO() -private val CONTACTS_PATH: Name = TODO() -private val PROGRAM_PATH: Name = TODO() -private val RECOMMENDED_COURSES_PATH: Name = TODO() +private val CONTENT_NODE_NAME = Name.EMPTY//"content".asName() +private val INTRO_PATH: Name = CONTENT_NODE_NAME + "intro" +private val ENROLL_PATH: Name = CONTENT_NODE_NAME + "enroll" +private val CONTACTS_PATH: Name = CONTENT_NODE_NAME + "contacts" +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(SiteContext) private fun FlowContent.programSection() { @@ -67,23 +70,24 @@ context(SiteContext) private fun FlowContent.programSection() { h2 { +"Учебная программа" } with(programBlock) { content() } button(classes = "fit btn btn-primary btn-lg") { - attributes["data-bs-toggle"]="collapse" - attributes["data-bs-target"]="#recommended-courses-collapse-text" - attributes["aria-expanded"]="false" - attributes["aria-controls"]="recommended-courses-collapse-text" + attributes["data-bs-toggle"] = "collapse" + attributes["data-bs-target"] = "#recommended-courses-collapse-text" + attributes["aria-expanded"] = "false" + attributes["aria-controls"] = "recommended-courses-collapse-text" +"Рекомендованные курсы" } div("collapse pt-3") { id = "recommended-courses-collapse-text" div("card card-body") { - with(recommendedBlock){content()} + with(recommendedBlock) { content() } } } } } context(SiteContext) private fun FlowContent.partners() { - val partnersData: Meta = resolve(PARTNERS_PATH)?.meta ?: Meta.EMPTY + //val partnersData: Meta = resolve(PARTNERS_PATH)?.meta ?: Meta.EMPTY + val partnersData: Meta = runBlocking { resolve(PARTNERS_PATH)?.await()} ?: Meta.EMPTY div("inner") { h2 { +"Партнеры" } div("features") { @@ -106,8 +110,7 @@ context(SiteContext) private fun FlowContent.partners() { } } -context(SiteContext) -fun HTML.magProgPage() { +context(SiteContext) fun HTML.magProgPage() { val sections = listOf( wrapSection(resolveHtml(INTRO_PATH)!!, "intro"), MagProgSection( @@ -140,7 +143,7 @@ fun HTML.magProgPage() { ) { team() }, - wrapSection(resolveHtml(CONTACTS_PATH)!!, "enroll"), + wrapSection(resolveHtml(CONTACTS_PATH)!!, "contacts"), ) head { @@ -154,12 +157,12 @@ fun HTML.magProgPage() { } link { rel = "stylesheet" - href = resolveResource("assets/css/main.css") + href = resolveResource("css/main.css") } noScript { link { rel = "stylesheet" - href = resolveResource("assets/css/noscript.css") + href = resolveResource("css/noscript.css") } } } @@ -171,7 +174,7 @@ fun HTML.magProgPage() { ul { sections.forEach { section -> li { - a(href = section.id) { + a(href = "#${section.id}") { +section.title } } @@ -214,25 +217,25 @@ fun HTML.magProgPage() { } } script { - src = resolveResource("assets/js/jquery.min.js") + src = resolveResource("js/jquery.min.js") } script { - src = resolveResource("assets/js/jquery.scrollex.min.js") + src = resolveResource("js/jquery.scrollex.min.js") } script { - src = resolveResource("assets/js/jquery.scrolly.min.js") + src = resolveResource("js/jquery.scrolly.min.js") } script { - src = resolveResource("assets/js/browser.min.js") + src = resolveResource("js/browser.min.js") } script { - src = resolveResource("assets/js/breakpoints.min.js") + src = resolveResource("js/breakpoints.min.js") } script { - src = resolveResource("assets/js/util.js") + src = resolveResource("js/util.js") } script { - src = resolveResource("assets/js/main.js") + src = resolveResource("js/main.js") } } } \ No newline at end of file diff --git a/src/main/kotlin/ru/mipt/spc/magprog/misc.kt b/src/main/kotlin/ru/mipt/spc/magprog/misc.kt index 5b6a305..e7fdb2b 100644 --- a/src/main/kotlin/ru/mipt/spc/magprog/misc.kt +++ b/src/main/kotlin/ru/mipt/spc/magprog/misc.kt @@ -1,9 +1,9 @@ package ru.mipt.spc.magprog -import kotlinx.css.CSSBuilder +import kotlinx.css.CssBuilder import kotlinx.html.CommonAttributeGroupFacade import kotlinx.html.style -fun CommonAttributeGroupFacade.css(block: CSSBuilder.() -> Unit) { - style = CSSBuilder().block().toString() +fun CommonAttributeGroupFacade.css(block: CssBuilder.() -> Unit) { + style = CssBuilder().block().toString() } \ No newline at end of file diff --git a/src/main/resources/magprog/images/mentors/Dolgonosov.jpg b/src/main/resources/magprog/assets/images/mentors/Dolgonosov.jpg similarity index 100% rename from src/main/resources/magprog/images/mentors/Dolgonosov.jpg rename to src/main/resources/magprog/assets/images/mentors/Dolgonosov.jpg diff --git a/src/main/resources/magprog/images/mentors/Gertsenberger.jpg b/src/main/resources/magprog/assets/images/mentors/Gertsenberger.jpg similarity index 100% rename from src/main/resources/magprog/images/mentors/Gertsenberger.jpg rename to src/main/resources/magprog/assets/images/mentors/Gertsenberger.jpg diff --git a/src/main/resources/magprog/images/mentors/Grinis.jpg b/src/main/resources/magprog/assets/images/mentors/Grinis.jpg similarity index 100% rename from src/main/resources/magprog/images/mentors/Grinis.jpg rename to src/main/resources/magprog/assets/images/mentors/Grinis.jpg diff --git a/src/main/resources/magprog/images/mentors/Kalashev.jpg b/src/main/resources/magprog/assets/images/mentors/Kalashev.jpg similarity index 100% rename from src/main/resources/magprog/images/mentors/Kalashev.jpg rename to src/main/resources/magprog/assets/images/mentors/Kalashev.jpg diff --git a/src/main/resources/magprog/images/mentors/Khokhriakov.jpg b/src/main/resources/magprog/assets/images/mentors/Khokhriakov.jpg similarity index 100% rename from src/main/resources/magprog/images/mentors/Khokhriakov.jpg rename to src/main/resources/magprog/assets/images/mentors/Khokhriakov.jpg diff --git a/src/main/resources/magprog/images/mentors/Klimai.jpg b/src/main/resources/magprog/assets/images/mentors/Klimai.jpg similarity index 100% rename from src/main/resources/magprog/images/mentors/Klimai.jpg rename to src/main/resources/magprog/assets/images/mentors/Klimai.jpg diff --git a/src/main/resources/magprog/images/mentors/Kostunin.jpg b/src/main/resources/magprog/assets/images/mentors/Kostunin.jpg similarity index 100% rename from src/main/resources/magprog/images/mentors/Kostunin.jpg rename to src/main/resources/magprog/assets/images/mentors/Kostunin.jpg diff --git a/src/main/resources/magprog/images/mentors/Nozik.jpg b/src/main/resources/magprog/assets/images/mentors/Nozik.jpg similarity index 100% rename from src/main/resources/magprog/images/mentors/Nozik.jpg rename to src/main/resources/magprog/assets/images/mentors/Nozik.jpg diff --git a/src/main/resources/magprog/images/mentors/Oliinychenko.jpg b/src/main/resources/magprog/assets/images/mentors/Oliinychenko.jpg similarity index 100% rename from src/main/resources/magprog/images/mentors/Oliinychenko.jpg rename to src/main/resources/magprog/assets/images/mentors/Oliinychenko.jpg diff --git a/src/main/resources/magprog/images/mentors/Pshenichnov.jpg b/src/main/resources/magprog/assets/images/mentors/Pshenichnov.jpg similarity index 100% rename from src/main/resources/magprog/images/mentors/Pshenichnov.jpg rename to src/main/resources/magprog/assets/images/mentors/Pshenichnov.jpg diff --git a/src/main/resources/magprog/images/mentors/Shagalov.jpg b/src/main/resources/magprog/assets/images/mentors/Shagalov.jpg similarity index 100% rename from src/main/resources/magprog/images/mentors/Shagalov.jpg rename to src/main/resources/magprog/assets/images/mentors/Shagalov.jpg diff --git a/src/main/resources/magprog/images/mentors/Skasyrskaya.jpg b/src/main/resources/magprog/assets/images/mentors/Skasyrskaya.jpg similarity index 100% rename from src/main/resources/magprog/images/mentors/Skasyrskaya.jpg rename to src/main/resources/magprog/assets/images/mentors/Skasyrskaya.jpg diff --git a/src/main/resources/magprog/images/mentors/Template.jpg b/src/main/resources/magprog/assets/images/mentors/Template.jpg similarity index 100% rename from src/main/resources/magprog/images/mentors/Template.jpg rename to src/main/resources/magprog/assets/images/mentors/Template.jpg diff --git a/src/main/resources/magprog/images/mentors/Usmanov.jpg b/src/main/resources/magprog/assets/images/mentors/Usmanov.jpg similarity index 100% rename from src/main/resources/magprog/images/mentors/Usmanov.jpg rename to src/main/resources/magprog/assets/images/mentors/Usmanov.jpg diff --git a/src/main/resources/magprog/images/partners/FPMI.jpg b/src/main/resources/magprog/assets/images/partners/FPMI.jpg similarity index 100% rename from src/main/resources/magprog/images/partners/FPMI.jpg rename to src/main/resources/magprog/assets/images/partners/FPMI.jpg diff --git a/src/main/resources/magprog/images/partners/JBR.png b/src/main/resources/magprog/assets/images/partners/JBR.png similarity index 100% rename from src/main/resources/magprog/images/partners/JBR.png rename to src/main/resources/magprog/assets/images/partners/JBR.png diff --git a/src/main/resources/magprog/images/partners/LPI.jpg b/src/main/resources/magprog/assets/images/partners/LPI.jpg similarity index 100% rename from src/main/resources/magprog/images/partners/LPI.jpg rename to src/main/resources/magprog/assets/images/partners/LPI.jpg diff --git a/src/main/resources/magprog/images/partners/Tavrida.png b/src/main/resources/magprog/assets/images/partners/Tavrida.png similarity index 100% rename from src/main/resources/magprog/images/partners/Tavrida.png rename to src/main/resources/magprog/assets/images/partners/Tavrida.png diff --git a/src/main/resources/magprog/images/partners/aramco.jpg b/src/main/resources/magprog/assets/images/partners/aramco.jpg similarity index 100% rename from src/main/resources/magprog/images/partners/aramco.jpg rename to src/main/resources/magprog/assets/images/partners/aramco.jpg diff --git a/src/main/resources/magprog/images/partners/biotech.png b/src/main/resources/magprog/assets/images/partners/biotech.png similarity index 100% rename from src/main/resources/magprog/images/partners/biotech.png rename to src/main/resources/magprog/assets/images/partners/biotech.png diff --git a/src/main/resources/magprog/images/partners/desy.svg b/src/main/resources/magprog/assets/images/partners/desy.svg similarity index 100% rename from src/main/resources/magprog/images/partners/desy.svg rename to src/main/resources/magprog/assets/images/partners/desy.svg diff --git a/src/main/resources/magprog/images/partners/hse.jpg b/src/main/resources/magprog/assets/images/partners/hse.jpg similarity index 100% rename from src/main/resources/magprog/images/partners/hse.jpg rename to src/main/resources/magprog/assets/images/partners/hse.jpg diff --git a/src/main/resources/magprog/images/partners/iki.jpg b/src/main/resources/magprog/assets/images/partners/iki.jpg similarity index 100% rename from src/main/resources/magprog/images/partners/iki.jpg rename to src/main/resources/magprog/assets/images/partners/iki.jpg diff --git a/src/main/resources/magprog/images/partners/jetbrains.png b/src/main/resources/magprog/assets/images/partners/jetbrains.png similarity index 100% rename from src/main/resources/magprog/images/partners/jetbrains.png rename to src/main/resources/magprog/assets/images/partners/jetbrains.png diff --git a/src/main/resources/magprog/images/partners/jinr.png b/src/main/resources/magprog/assets/images/partners/jinr.png similarity index 100% rename from src/main/resources/magprog/images/partners/jinr.png rename to src/main/resources/magprog/assets/images/partners/jinr.png diff --git a/src/main/resources/magprog/images/partners/tink.jpg b/src/main/resources/magprog/assets/images/partners/tink.jpg similarity index 100% rename from src/main/resources/magprog/images/partners/tink.jpg rename to src/main/resources/magprog/assets/images/partners/tink.jpg diff --git a/src/main/resources/magprog/images/team/Aivazov.jpg b/src/main/resources/magprog/assets/images/team/Aivazov.jpg similarity index 100% rename from src/main/resources/magprog/images/team/Aivazov.jpg rename to src/main/resources/magprog/assets/images/team/Aivazov.jpg diff --git a/src/main/resources/magprog/content/mentors/Dolgonosov.md b/src/main/resources/magprog/content/mentors/Dolgonosov.md index 57c9bc1..f0e4c16 100644 --- a/src/main/resources/magprog/content/mentors/Dolgonosov.md +++ b/src/main/resources/magprog/content/mentors/Dolgonosov.md @@ -1,8 +1,8 @@ --- content_type: magprog_mentor -title: Максим Сергеевич Долгоносов +name: Максим Сергеевич Долгоносов id: Dolgonosov -photo: Dolgonosov.jpg +photo: images/mentors/Dolgonosov.jpg language: ru --- diff --git a/src/main/resources/magprog/content/mentors/Gertsenberger.md b/src/main/resources/magprog/content/mentors/Gertsenberger.md index fb49207..6d29fdf 100644 --- a/src/main/resources/magprog/content/mentors/Gertsenberger.md +++ b/src/main/resources/magprog/content/mentors/Gertsenberger.md @@ -1,8 +1,8 @@ --- content_type: magprog_mentor -title: Константин Викторович Герценбергер +name: Константин Викторович Герценбергер id: Gertsenberger -photo: Gertsenberger.jpg +photo: images/mentors/Gertsenberger.jpg language: ru --- #### Организация diff --git a/src/main/resources/magprog/content/mentors/Grinis.md b/src/main/resources/magprog/content/mentors/Grinis.md index 6ce3868..c983ea7 100644 --- a/src/main/resources/magprog/content/mentors/Grinis.md +++ b/src/main/resources/magprog/content/mentors/Grinis.md @@ -1,8 +1,8 @@ --- content_type: magprog_mentor -title: Roland Grinis +name: Roland Grinis id: Grinis -photo: Grinis.jpg +photo: images/mentors/Grinis.jpg language: ru --- diff --git a/src/main/resources/magprog/content/mentors/Kalashev.md b/src/main/resources/magprog/content/mentors/Kalashev.md index 06d09f5..b91cc23 100644 --- a/src/main/resources/magprog/content/mentors/Kalashev.md +++ b/src/main/resources/magprog/content/mentors/Kalashev.md @@ -1,8 +1,8 @@ --- content_type: magprog_mentor -title: Олег Евгеньевич Калашев +name: Олег Евгеньевич Калашев id: Kalashev -photo: Kalashev.jpg +photo: images/mentors/Kalashev.jpg language: ru --- diff --git a/src/main/resources/magprog/content/mentors/Khokhriakov.md b/src/main/resources/magprog/content/mentors/Khokhriakov.md index c654c72..abb72f4 100644 --- a/src/main/resources/magprog/content/mentors/Khokhriakov.md +++ b/src/main/resources/magprog/content/mentors/Khokhriakov.md @@ -1,8 +1,8 @@ --- content_type: magprog_mentor -title: Igor Khokhriakov +name: Igor Khokhriakov id: Khokhriakov -photo: Khokhriakov.jpg +photo: images/mentors/Khokhriakov.jpg language: ru --- diff --git a/src/main/resources/magprog/content/mentors/Klimai.md b/src/main/resources/magprog/content/mentors/Klimai.md index 8b4e052..671aff9 100644 --- a/src/main/resources/magprog/content/mentors/Klimai.md +++ b/src/main/resources/magprog/content/mentors/Klimai.md @@ -1,8 +1,8 @@ --- content_type: magprog_mentor -title: Петр Климай +name: Петр Климай id: Klimai -photo: Klimai.jpg +photo: images/mentors/Klimai.jpg language: ru --- diff --git a/src/main/resources/magprog/content/mentors/Kostunin.md b/src/main/resources/magprog/content/mentors/Kostunin.md index 296e77d..080eb62 100644 --- a/src/main/resources/magprog/content/mentors/Kostunin.md +++ b/src/main/resources/magprog/content/mentors/Kostunin.md @@ -1,8 +1,8 @@ --- content_type: magprog_mentor -title: Dmitriy Kostunin +name: Dmitriy Kostunin id: Kostunin -photo: Kostunin.jpg +photo: images/mentors/Kostunin.jpg language: ru published: false --- diff --git a/src/main/resources/magprog/content/mentors/Nozik.md b/src/main/resources/magprog/content/mentors/Nozik.md index 52c8ee0..66ffd8a 100644 --- a/src/main/resources/magprog/content/mentors/Nozik.md +++ b/src/main/resources/magprog/content/mentors/Nozik.md @@ -1,8 +1,8 @@ --- content_type: magprog_mentor -title: Александр Нозик +name: Александр Нозик id: Nozik -photo: Nozik.jpg +photo: images/mentors/Nozik.jpg language: ru --- diff --git a/src/main/resources/magprog/content/mentors/Oliinychenko.md b/src/main/resources/magprog/content/mentors/Oliinychenko.md index a05aab0..30b7d16 100644 --- a/src/main/resources/magprog/content/mentors/Oliinychenko.md +++ b/src/main/resources/magprog/content/mentors/Oliinychenko.md @@ -1,8 +1,8 @@ --- content_type: magprog_mentor -title: Олийниченко Дмитрий Робертович +name: Олийниченко Дмитрий Робертович id: Oliinychenko -photo: Oliinychenko.jpg +photo: images/mentors/Oliinychenko.jpg language: ru published: false --- diff --git a/src/main/resources/magprog/content/mentors/Pshenichnov.md b/src/main/resources/magprog/content/mentors/Pshenichnov.md index 35dcfa9..526f1e2 100644 --- a/src/main/resources/magprog/content/mentors/Pshenichnov.md +++ b/src/main/resources/magprog/content/mentors/Pshenichnov.md @@ -1,8 +1,8 @@ --- content_type: magprog_mentor -title: Игорь Анатольевич Пшеничнов +name: Игорь Анатольевич Пшеничнов id: Pshenichnov -photo: Pshenichnov.jpg +photo: images/mentors/Pshenichnov.jpg language: ru --- diff --git a/src/main/resources/magprog/content/mentors/Shagalov.md b/src/main/resources/magprog/content/mentors/Shagalov.md index 35381e5..dd1bb56 100644 --- a/src/main/resources/magprog/content/mentors/Shagalov.md +++ b/src/main/resources/magprog/content/mentors/Shagalov.md @@ -1,8 +1,8 @@ --- content_type: magprog_mentor -title: Лев Михайлович Шагалов +name: Лев Михайлович Шагалов id: Shagalov -photo: Shagalov.jpg +photo: images/mentors/Shagalov.jpg language: ru --- diff --git a/src/main/resources/magprog/content/mentors/Skasyrskaya.md b/src/main/resources/magprog/content/mentors/Skasyrskaya.md index fba1a6e..6a78856 100644 --- a/src/main/resources/magprog/content/mentors/Skasyrskaya.md +++ b/src/main/resources/magprog/content/mentors/Skasyrskaya.md @@ -1,8 +1,8 @@ --- content_type: magprog_mentor -title: Айно Константиновна Скасырская +name: Айно Константиновна Скасырская id: Skasyrskaya -photo: Skasyrskaya.jpg +photo: images/mentors/Skasyrskaya.jpg language: ru --- diff --git a/src/main/resources/magprog/content/mentors/Usmanov.md b/src/main/resources/magprog/content/mentors/Usmanov.md index cfd09e8..c6b1f9f 100644 --- a/src/main/resources/magprog/content/mentors/Usmanov.md +++ b/src/main/resources/magprog/content/mentors/Usmanov.md @@ -1,8 +1,8 @@ --- content_type: magprog_mentor -title: Ильмир Усманов +name: Ильмир Усманов id: Usmanov -photo: Usmanov.jpg +photo: images/mentors/Usmanov.jpg language: ru --- diff --git a/src/main/resources/magprog/content/mentors/template.md b/src/main/resources/magprog/content/mentors/template.md index 55b2ee5..a9c99fe 100644 --- a/src/main/resources/magprog/content/mentors/template.md +++ b/src/main/resources/magprog/content/mentors/template.md @@ -1,8 +1,8 @@ --- content_type: magprog_mentor -title: Полиграф Шариков +name: Полиграф Шариков id: template -photo: Template.jpg +photo: images/mentors/Template.jpg published: false language: ru --- diff --git a/src/main/resources/magprog/content/partners.yaml b/src/main/resources/magprog/content/partners.yaml index a1352cd..45f3123 100644 --- a/src/main/resources/magprog/content/partners.yaml +++ b/src/main/resources/magprog/content/partners.yaml @@ -2,34 +2,34 @@ title: Партнеры content: - title: ЛФИ МФТИ link: https://mipt.ru/education/departments/lpr/ - logo: /images/magprog/partners/LPI.jpg + logo: /images/partners/LPI.jpg - title: ФПМИ МФТИ link: https://mipt.ru/education/departments/fpmi/ - logo: /images/magprog/partners/FPMI.jpg + logo: /images/partners/FPMI.jpg - title: JetBrains Research link: https://research.jetbrains.org/groups/npm/ - logo: /images/magprog/partners/JBR.png + logo: /images/partners/JBR.png - title: Таврида Электрик link: https://www.tavrida.com/ter/ - logo: /images/magprog/partners/Tavrida.png + logo: /images/partners/Tavrida.png - title: ИЯИ РАН link: https://www.inr.ru/ logo: /images/partners/inr_logo.png - title: ИКИ РАН link: http://www.iki.rssi.ru/ - logo: /images/magprog/partners/iki.jpg + logo: /images/partners/iki.jpg - title: ОИЯИ link: https://bmn.jinr.ru/ - logo: /images/magprog/partners/jinr.png + logo: /images/partners/jinr.png # - title: ВШЭ # link: https://www.hse.ru/en/ -# logo: /images/magprog/partners/hse.jpg +# logo: /images/partners/hse.jpg # - title: HZG-DESY # link: https://www.desy.de/research/cooperations__institutes/hzg/index_eng.html -# logo: /images/magprog/partners/desy.svg +# logo: /images/partners/desy.svg - title: Тинькофф link: https://fintech.tinkoff.ru/ - logo: /images/magprog/partners/tink.jpg + logo: /images/partners/tink.jpg - title: ФИЦ Биотехнологии РАН link: https://www.fbras.ru/ - logo: /images/magprog/partners/biotech.png + logo: /images/partners/biotech.png diff --git a/src/main/resources/magprog/content/team/Aivazov.md b/src/main/resources/magprog/content/team/Aivazov.md index 53cc7b9..c349aa9 100644 --- a/src/main/resources/magprog/content/team/Aivazov.md +++ b/src/main/resources/magprog/content/team/Aivazov.md @@ -1,9 +1,9 @@ --- content_type: magprog_team -title: Денис Айвазов +name: Денис Айвазов id: Aivazov order: 4 -photo: /images/magprog/team/Aivazov.jpg +photo: images/team/Aivazov.jpg language: ru --- **Консультант от ФПМИ** diff --git a/src/main/resources/magprog/content/team/nozik.md b/src/main/resources/magprog/content/team/nozik.md index f076c63..418cd03 100644 --- a/src/main/resources/magprog/content/team/nozik.md +++ b/src/main/resources/magprog/content/team/nozik.md @@ -1,9 +1,9 @@ --- content_type: magprog_team -title: Александр Нозик +name: Александр Нозик id: nozik order: 1 -photo: /images/members/nozik.png +photo: images/mentors/Nozik.jpg language: ru --- **Руководитель программы** diff --git a/src/main/resources/magprog/content/team/svetlichnii.md b/src/main/resources/magprog/content/team/svetlichnii.md index 16b8c9d..c499ad1 100644 --- a/src/main/resources/magprog/content/team/svetlichnii.md +++ b/src/main/resources/magprog/content/team/svetlichnii.md @@ -1,9 +1,9 @@ --- content_type: magprog_team -title: Александр Светличный +name: Александр Светличный id: svetlichnii order: 2 -photo: /images/members/svetlichny.jpeg +photo: images/members/svetlichny.jpeg language: ru --- **Заместитель руководителя** diff --git a/src/main/resources/magprog/elements.html b/src/main/resources/magprog/elements.html index c66715a..892d2fd 100644 --- a/src/main/resources/magprog/elements.html +++ b/src/main/resources/magprog/elements.html @@ -319,21 +319,21 @@ print 'It took ' + i + ' iterations to sort the deck.';

Fit

-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+

Left & Right

-

Fringilla nisl. Donec accumsan interdum nisi, quis tincidunt felis sagittis eget. tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent tincidunt felis sagittis eget. tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent. Donec accumsan interdum nisi, quis tincidunt felis sagittis eget. tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent tincidunt felis sagittis eget. tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent tincidunt felis sagittis eget. tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent.

-

Fringilla nisl. Donec accumsan interdum nisi, quis tincidunt felis sagittis eget. tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent tincidunt felis sagittis eget. tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent. Donec accumsan interdum nisi, quis tincidunt felis sagittis eget. tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent tincidunt felis sagittis eget. tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent tincidunt felis sagittis eget. tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent.

+

Fringilla nisl. Donec accumsan interdum nisi, quis tincidunt felis sagittis eget. tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent tincidunt felis sagittis eget. tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent. Donec accumsan interdum nisi, quis tincidunt felis sagittis eget. tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent tincidunt felis sagittis eget. tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent tincidunt felis sagittis eget. tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent.

+

Fringilla nisl. Donec accumsan interdum nisi, quis tincidunt felis sagittis eget. tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent tincidunt felis sagittis eget. tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent. Donec accumsan interdum nisi, quis tincidunt felis sagittis eget. tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent tincidunt felis sagittis eget. tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent tincidunt felis sagittis eget. tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent.

diff --git a/src/main/resources/magprog/generic.html b/src/main/resources/magprog/generic.html index d2776db..8b8f5a9 100644 --- a/src/main/resources/magprog/generic.html +++ b/src/main/resources/magprog/generic.html @@ -33,7 +33,7 @@

A Generic Page

- +

Donec eget ex magna. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque venenatis dolor imperdiet dolor mattis sagittis. Praesent rutrum sem diam, vitae egestas enim auctor sit amet. Pellentesque leo mauris, consectetur id ipsum sit amet, fergiat. Pellentesque in mi eu massa lacinia malesuada et a elit. Donec urna ex, lacinia in purus ac, pretium pulvinar mauris. Curabitur sapien risus, commodo eget turpis at, elementum convallis elit. Pellentesque enim turpis, hendrerit tristique.

Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque venenatis dolor imperdiet dolor mattis sagittis. Praesent rutrum sem diam, vitae egestas enim auctor sit amet. Pellentesque leo mauris, consectetur id ipsum sit amet, fersapien risus, commodo eget turpis at, elementum convallis elit. Pellentesque enim turpis, hendrerit tristique lorem ipsum dolor.

diff --git a/src/main/resources/magprog/index.html b/src/main/resources/magprog/index.html index 8547177..cae8c9f 100644 --- a/src/main/resources/magprog/index.html +++ b/src/main/resources/magprog/index.html @@ -46,7 +46,7 @@
- +

Sed ipsum dolor

@@ -58,7 +58,7 @@
- +

Feugiat consequat

@@ -70,7 +70,7 @@
- +

Ultricies aliquam

diff --git a/src/test/kotlin/ru/mipt/ApplicationTest.kt b/src/test/kotlin/ru/mipt/ApplicationTest.kt index 4f6c071..e0a01a9 100644 --- a/src/test/kotlin/ru/mipt/ApplicationTest.kt +++ b/src/test/kotlin/ru/mipt/ApplicationTest.kt @@ -1,10 +1,8 @@ package ru.mipt import io.ktor.client.request.get -import io.ktor.client.statement.bodyAsText import io.ktor.http.HttpStatusCode import io.ktor.server.testing.testApplication -import ru.mipt.plugins.configureRouting import kotlin.test.Test import kotlin.test.assertEquals @@ -12,11 +10,11 @@ class ApplicationTest { @Test fun testRoot() = testApplication { application { - configureRouting() + magProgSite() } - client.get("/").apply { + client.get("/magprog").apply { assertEquals(HttpStatusCode.OK, status) - assertEquals("Hello World!", bodyAsText()) +// assertEquals("Hello World!", bodyAsText()) } } } \ No newline at end of file