我正在使用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()
}
}
答案 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