在kotlinx.html DSL中写入原始html代码
我正在使用Kotlin的html库kotlinx.html
进行动态html构建。
对于调试建议我想写一个标签作为一个原始的HTML。 但我找不到任何方法。 简单的文本添加替换字符像<
到他们的代码,所以它没有帮助:
StringBuilder().appendHTML().html { body { +""" """.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