在kotlinx.html DSL中写入原始html代码

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

对于调试建议我想写一个标签作为一个原始的HTML。 但我找不到任何方法。 简单的文本添加替换字符像<到他们的代码,所以它没有帮助:

 StringBuilder().appendHTML().html { body { +""" 
get=form id=3333
""".trimIndent() } }

只需在标签内使用unsafe内容即可防止HTML编码。

 body { unsafe { +"""
""" } }

appendHTML任何内容appendHTML将被编码。 如果你想附加原始文本,你可以使用appendln

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

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

一个(有限的)解决方案是破解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