Skip to content

Commit

Permalink
Merge branch 'master' into dependabot/gradle/kotlin-2.0.20
Browse files Browse the repository at this point in the history
  • Loading branch information
ReneeVandervelde authored Sep 1, 2024
2 parents a25e6ce + 1a4a813 commit 655c4d4
Show file tree
Hide file tree
Showing 6 changed files with 97 additions and 30 deletions.
36 changes: 29 additions & 7 deletions render-static-html/api/render-static-html.api
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,33 @@ public final class ink/ui/render/statichtml/HtmlRenderer {
public final fun renderLayout (Link/ui/structures/layouts/UiLayout;)Lkotlin/jvm/functions/Function1;
}

public abstract interface class ink/ui/render/statichtml/InkUiBuilder {
public abstract fun addBody (Link/ui/structures/layouts/UiLayout;)V
public abstract fun addBody (Lkotlin/jvm/functions/Function1;)V
public abstract fun addPageHeader (Link/ui/structures/elements/UiElement;)V
public abstract fun addPageHeader (Lkotlin/jvm/functions/Function1;)V
public abstract fun addStyle (Ljava/lang/String;)V
public abstract fun getResourceBaseUrl ()Ljava/lang/String;
public abstract fun include (Ljava/lang/String;)V
}

public final class ink/ui/render/statichtml/InkUiConfig : kotlin/script/experimental/api/ScriptCompilationConfiguration {
public static final field INSTANCE Link/ui/render/statichtml/InkUiConfig;
}

public abstract class ink/ui/render/statichtml/InkUiScript {
public abstract class ink/ui/render/statichtml/InkUiScript : ink/ui/render/statichtml/InkUiBuilder {
public static final field Companion Link/ui/render/statichtml/InkUiScript$Companion;
public fun <init> ()V
public final fun addBody (Link/ui/structures/layouts/UiLayout;)V
public final fun addBody (Lkotlin/jvm/functions/Function1;)V
public final fun addPageHeader (Link/ui/structures/elements/UiElement;)V
public final fun addPageHeader (Lkotlin/jvm/functions/Function1;)V
public final fun addStyle (Ljava/lang/String;)V
public fun <init> (Ljava/io/File;)V
public fun addBody (Link/ui/structures/layouts/UiLayout;)V
public fun addBody (Lkotlin/jvm/functions/Function1;)V
public fun addPageHeader (Link/ui/structures/elements/UiElement;)V
public fun addPageHeader (Lkotlin/jvm/functions/Function1;)V
public fun addStyle (Ljava/lang/String;)V
public final fun getContentBreak ()Z
public final fun getResourceBaseUrl ()Ljava/lang/String;
public final fun getSectioned ()Z
public final fun getTitle ()Ljava/lang/String;
public fun include (Ljava/lang/String;)V
public final fun setContentBreak (Z)V
public final fun setResourceBaseUrl (Ljava/lang/String;)V
public final fun setSectioned (Z)V
Expand All @@ -35,6 +46,17 @@ public final class ink/ui/render/statichtml/MainKt {
public static final fun main ([Ljava/lang/String;)V
}

public abstract class ink/ui/render/statichtml/PartialScript : ink/ui/render/statichtml/InkUiBuilder {
public fun <init> (Link/ui/render/statichtml/InkUiScript;)V
public fun addBody (Link/ui/structures/layouts/UiLayout;)V
public fun addBody (Lkotlin/jvm/functions/Function1;)V
public fun addPageHeader (Link/ui/structures/elements/UiElement;)V
public fun addPageHeader (Lkotlin/jvm/functions/Function1;)V
public fun addStyle (Ljava/lang/String;)V
public fun getResourceBaseUrl ()Ljava/lang/String;
public fun include (Ljava/lang/String;)V
}

public abstract interface class ink/ui/render/statichtml/renderer/ElementRenderer {
public abstract fun render (Lkotlinx/html/TagConsumer;Link/ui/structures/elements/UiElement;Link/ui/render/statichtml/renderer/ElementRenderer;)Link/ui/structures/render/RenderResult;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package ink.ui.render.statichtml

import ink.ui.structures.elements.UiElement
import ink.ui.structures.layouts.UiLayout
import kotlinx.html.TagConsumer

interface InkUiBuilder {
val resourceBaseUrl: String
fun addPageHeader(element: UiElement)
fun addPageHeader(block: TagConsumer<*>.() -> Unit)
fun addBody(block: TagConsumer<*>.() -> Unit)
fun addBody(layout: UiLayout)
fun addStyle(stylesheet: String)
fun include(file: String)
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package ink.ui.render.statichtml

import ink.ui.structures.elements.UiElement
import ink.ui.structures.layouts.*
import kotlinx.html.*
import ink.ui.structures.layouts.UiLayout
import kotlinx.html.TagConsumer
import kotlinx.html.dom.createHTMLDocument
import java.io.File
import kotlin.script.experimental.annotations.KotlinScript
import kotlin.script.experimental.api.*
import kotlin.script.experimental.host.toScriptSource
import kotlin.script.experimental.jvm.util.isError
import kotlin.script.experimental.jvmhost.BasicJvmScriptingHost
import kotlin.script.experimental.jvmhost.createJvmCompilationConfigurationFromTemplate

Expand All @@ -17,42 +16,47 @@ import kotlin.script.experimental.jvmhost.createJvmCompilationConfigurationFromT
compilationConfiguration = InkUiConfig::class
)
@Suppress("unused")
abstract class InkUiScript {
abstract class InkUiScript(
private val scriptFile: File,
): InkUiBuilder {
private var pageHeaders: MutableList<TagConsumer<*>.() -> Unit> = mutableListOf()
private var bodies: MutableList<TagConsumer<*>.() -> Unit> = mutableListOf()
private var styles: MutableList<String> = mutableListOf()
private val document = createHTMLDocument()
internal lateinit var fileName: String
var title: String? = null
var sectioned: Boolean = false
var contentBreak: Boolean = false
var resourceBaseUrl: String = "https://ui.inkapplications.com/res"
final override var resourceBaseUrl: String = "https://ui.inkapplications.com/res"
set(value) {
field = value
renderer = HtmlRenderer(value)
}
private var renderer = HtmlRenderer(resourceBaseUrl)

fun addPageHeader(element: UiElement) {
override fun addPageHeader(element: UiElement) {
pageHeaders.add(renderer.renderElement(element))
}

fun addPageHeader(block: TagConsumer<*>.() -> Unit) {
override fun addPageHeader(block: TagConsumer<*>.() -> Unit) {
pageHeaders.add(block)
}

fun addBody(block: TagConsumer<*>.() -> Unit) {
override fun addBody(block: TagConsumer<*>.() -> Unit) {
bodies.add(block)
}

fun addBody(layout: UiLayout) {
override fun addBody(layout: UiLayout) {
bodies.add(renderer.renderLayout(layout))
}

fun addStyle(stylesheet: String) {
override fun addStyle(stylesheet: String) {
styles += stylesheet
}

override fun include(file: String) {
evalPartial(File(scriptFile.parentFile, file), this).valueOrThrow()
}

private fun getStyles(): List<String> {
return listOf(
"$resourceBaseUrl/css/main-2.0.css",
Expand All @@ -61,7 +65,7 @@ abstract class InkUiScript {

internal fun getHtml(): String {
return renderer.renderDocument(
pageTitle = title ?: fileName,
pageTitle = title ?: scriptFile.name.replace(Regex("\\.inkui\\.kts$", RegexOption.IGNORE_CASE), ""),
pageHeaders = pageHeaders,
bodies = bodies,
stylesheets = getStyles(),
Expand All @@ -70,18 +74,31 @@ abstract class InkUiScript {
)
}


companion object {
internal fun evalFile(scriptFile: File): ResultWithDiagnostics<EvaluationResult> {
val source = scriptFile.toScriptSource()
val compilationConfiguration = createJvmCompilationConfigurationFromTemplate<InkUiScript>()
return BasicJvmScriptingHost()
.eval(scriptFile.toScriptSource(), compilationConfiguration, null)
.apply {
if (!isError()) {
val script = (valueOrThrow().returnValue.scriptInstance as InkUiScript)
script.fileName = scriptFile.name.replace(Regex("\\.inkui\\.kts$", RegexOption.IGNORE_CASE), "")
}
}
val evaluationConfiguration = ScriptEvaluationConfiguration {
constructorArgs(scriptFile)
}
return BasicJvmScriptingHost().eval(
script = source,
compilationConfiguration = compilationConfiguration,
evaluationConfiguration = evaluationConfiguration
)
}

private fun evalPartial(scriptFile: File, parent: InkUiScript): ResultWithDiagnostics<EvaluationResult> {
val source = scriptFile.toScriptSource()
val compilationConfiguration = createJvmCompilationConfigurationFromTemplate<PartialScript>()
val evaluationConfiguration = ScriptEvaluationConfiguration {
constructorArgs(parent)
}
return BasicJvmScriptingHost().eval(
script = source,
compilationConfiguration = compilationConfiguration,
evaluationConfiguration = evaluationConfiguration
)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package ink.ui.render.statichtml

import kotlin.script.experimental.annotations.KotlinScript

@KotlinScript(
fileExtension = "inkui.kts",
compilationConfiguration = InkUiConfig::class
)
abstract class PartialScript(
private val parent: InkUiScript,
): InkUiBuilder by parent
3 changes: 1 addition & 2 deletions sample-web/src/staticMain/Sample.inkui.kts
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@ title = "Test"
resourceBaseUrl = "res"
sectioned = true

addPageHeader(TextElement("Page Header", TextStyle.H1))
addPageHeader(TextElement("Subtitle"))
include("header.inkui.kts")
addBody(
PageLayout(
ElementList(
Expand Down
3 changes: 3 additions & 0 deletions sample-web/src/staticMain/header.inkui.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@

addPageHeader(TextElement("Page Header", TextStyle.H1))
addPageHeader(TextElement("Subtitle"))

0 comments on commit 655c4d4

Please sign in to comment.