From a27184b50bf1b335831bc5dd63cb63ad110d8813 Mon Sep 17 00:00:00 2001 From: Sebastian Aigner Date: Mon, 11 May 2020 16:36:58 +0200 Subject: [PATCH] Stub out master branch (use as template repository) Sort Gradle dependencies Version bump Crop ktor.png --- build.gradle | 2 +- gradle.properties | 4 +- .../jetbrains/handson/website/Application.kt | 41 ++---------------- .../jetbrains/handson/website/IndexData.kt | 3 -- src/main/resources/files/index.html | 17 -------- src/main/resources/files/ktor.png | Bin 6018 -> 6371 bytes src/main/resources/templates/index.ftl | 17 -------- 7 files changed, 7 insertions(+), 77 deletions(-) delete mode 100644 src/main/kotlin/com/jetbrains/handson/website/IndexData.kt delete mode 100644 src/main/resources/files/index.html delete mode 100644 src/main/resources/templates/index.ftl diff --git a/build.gradle b/build.gradle index 0cddde2..93715a3 100644 --- a/build.gradle +++ b/build.gradle @@ -16,8 +16,8 @@ dependencies { implementation "io.ktor:ktor-server-core:$ktor_version" implementation "io.ktor:ktor-server-netty:$ktor_version" implementation "io.ktor:ktor-html-builder:$ktor_version" - implementation "ch.qos.logback:logback-classic:$logback_version" implementation "io.ktor:ktor-freemarker:$ktor_version" + implementation "ch.qos.logback:logback-classic:$logback_version" } compileKotlin { diff --git a/gradle.properties b/gradle.properties index c378215..d2a4d18 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ ktor_version=1.3.2 kotlin.code.style=official -kotlin_version=1.3.70 -logback_version=1.2.1 +kotlin_version=1.3.72 +logback_version=1.2.3 diff --git a/src/main/kotlin/com/jetbrains/handson/website/Application.kt b/src/main/kotlin/com/jetbrains/handson/website/Application.kt index c7cc33c..fab81bf 100644 --- a/src/main/kotlin/com/jetbrains/handson/website/Application.kt +++ b/src/main/kotlin/com/jetbrains/handson/website/Application.kt @@ -1,10 +1,13 @@ package com.jetbrains.handson.website import freemarker.cache.* +import freemarker.core.HTMLOutputFormat import io.ktor.application.* import io.ktor.freemarker.* import io.ktor.html.respondHtml +import io.ktor.http.HttpStatusCode import io.ktor.http.content.* +import io.ktor.request.receiveParameters import io.ktor.response.* import io.ktor.routing.* import kotlinx.html.* @@ -13,41 +16,5 @@ import kotlinx.html.* fun main(args: Array): Unit = io.ktor.server.netty.EngineMain.main(args) fun Application.module() { - install(FreeMarker) { - templateLoader = ClassTemplateLoader(this::class.java.classLoader, "templates") - } - routing { - static("/static") { - resources("files") - } - get("/html") { - call.respondHtml { - head { - title { - +"Returning HTML using Kotlinx.HTML" - } - } - body { - h1 { - +"Kotlinx.Html" - } - p { - +"We're using a static HTML DSL" - } - val numbers = 1..10 - ul { - numbers.forEach { - li { - value = it.toString() - +"Item $it" - } - } - } - } - } - } - get("/freemarker") { - call.respond(FreeMarkerContent("index.ftl", mapOf("data" to IndexData(listOf(1, 2, 3))), "")) - } - } + } diff --git a/src/main/kotlin/com/jetbrains/handson/website/IndexData.kt b/src/main/kotlin/com/jetbrains/handson/website/IndexData.kt deleted file mode 100644 index 9bcff0e..0000000 --- a/src/main/kotlin/com/jetbrains/handson/website/IndexData.kt +++ /dev/null @@ -1,3 +0,0 @@ -package com.jetbrains.handson.website - -data class IndexData(val items: List) \ No newline at end of file diff --git a/src/main/resources/files/index.html b/src/main/resources/files/index.html deleted file mode 100644 index 053c139..0000000 --- a/src/main/resources/files/index.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - Static Page - - -

Static Page

-

- -

-

- This is a static page! -

-Ktor Logo - - \ No newline at end of file diff --git a/src/main/resources/files/ktor.png b/src/main/resources/files/ktor.png index 40c878cd2ede8a29676e93c3512f8c0d0db615d6..862e4db55e609ba8385c5ae53b6572df7d5ee158 100644 GIT binary patch literal 6371 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 literal 6018 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�o?ITSAvu?8DREWCC|n{aGWd6Mu^ zl_97iyeMk7nOQ0IL5GpF_PE6NuMqibajus{lI$(h#HWHfl{!QvpDC&nBG(5VB0G(k zsl_#09%6mDHA)_GVZ$6_KQ?g+QjbIXl7AUl+x0;W8PwjgA$EFw`^~2P3@P=;$Ylpw z{lWS?lPjn|X2sYpU3GaFFO+pdBgN(1e7QSjT4zm7JnjAJkCuIHa2Xm5+*rAxd03%$ zN4B9J!L@?N$fcHevv>CH^7&cW6J-h^bl8(V&F*6|f}%7RwYMZ+^^}Eu+i7(}rBIXv zIU?$?0Rfa}V6ZgfPdmjhW20&|T(8Y7b+n>IPf(2K4gfv%l^Sna5ZoxQ9y%Q5F9D1j z>hh`pHsi~dPV^GekeC=GR#^U^G02B2_iS=a)=(rO2;_a6x^2V6Dv4ewROpf8+(mczRZpCTAZkM3eiV1Y$JY^uq~vC6tqUr#64XYV!5;k8 z{}6Amza&Xgz7P6w?*t7^GvH=D59REwuoPnvnO{7&<&dUE*H(OiV$;jnvl6Deg;0Bw zA`3qIc_yjR5vv=&4Z4%iFL)u5!1g&pYji1xX-cu*hpUVI%Q1as9TDy^=I5oHr|;c3 zQg#`iZ%tNM3h25~uLOa+eMxhIWsWqXE8Jn5J*P^4ydmp5>KXW?!wYUOGT zG$1}6J|0dUUQQl99bR5h0Ul9)UUnWHQ63%*PA$RzHNnaGoxP3Ef1e=XvKIqP04dAA KmaCC55B(1 - - - FreeMarker - - -

FreeMarker

-

- Using FreeMarker Template Engine -

-
    - <#list data.items as item> -
  • ${item}
  • - -
- - \ No newline at end of file