在kotlinx.html DSL

时间:2015-12-12 09:05:27

标签: html kotlin

我正在使用Kotlin的html库kotlinx.html进行动态html构建。

对于调试建议我想将标记写为原始html。但我找不到任何方法可以做到这一点。简单的文字添加会将<等字符替换为其代码,因此无效:

StringBuilder().appendHTML().html {
    body {
        +"""
        <form action="http://courier-voddan.rhcloud.com/customer/new_task" method="get">
            get=form
            id=3333
            <button type="submit">ok</button>
        </form>
        """.trimIndent()
    }
}

3 个答案:

答案 0 :(得分:9)

只需在代码中使用unsafe即可阻止HTML编码。

body {
    unsafe {
       +"""<form class="formClass"/>"""
    }
}

答案 1 :(得分:0)

appendHTML内的任何内容都会被编码。如果要附加原始文本,可以使用appendln

来自Streaming · Kotlin/kotlinx.html Wiki · GitHub的示例:

val text = StringBuilder {
    appendln("<!DOCTYPE html>")
    appendHTML().html {
        body {
            a("http://kotlinlang.org") { +"link" }
        }
    }
    appendln()
}

答案 2 :(得分:0)

(有限的)解决方案是破解DSL并使用onTagContentUnsafe

this.consumer.onTagContentUnsafe { +"hello"}

每个Tag都有一个属性consumer。这是一个实际处理DOM的对象。在生成HTML的情况下,此对象为HTMLStreamBuilder。它有一个方法onTagContentUnsafe,可以让您访问流构建器。

我使用辅助函数:

fun Tag.rawHtml(html: String) {
    assert(this.consumer is HTMLStreamBuilder)
    this.consumer.onTagContentUnsafe { +"$html\n"}
}

正如@orangy指出的那样,这个解决方案适用于代码生成,但你不能用它来创建JVM DOM等。为此,有一张票:https://github.com/Kotlin/kotlinx.html/issues/8