2015-12-12 2 views
0

Я использую html-библиотеку Kotlin kotlinx.html для динамического построения html.Напишите исходный HTML-код внутри kotlinx.html DSL

Для отладки предложений я хочу написать тег как необработанный 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() 
    } 
} 

ответ

5

Просто используйте unsafe внутри вашего тега, чтобы предотвратить кодирование HTML.

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

Все внутри appendHTML будет закодирован. Если вы хотите добавить исходный текст, вы можете использовать appendln.

Пример из Streaming · Kotlin/kotlinx.html Wiki · GitHub:

val text = StringBuilder { 
    appendln("<!DOCTYPE html>") 
    appendHTML().html { 
     body { 
      a("http://kotlinlang.org") { +"link" } 
     } 
    } 
    appendln() 
} 
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 отметил, что это решение работает для генерации кода, но вы не можете использовать его для создания виртуальной машины Java DOM и т.д. Для этого есть билет : https://github.com/Kotlin/kotlinx.html/issues/8

Смежные вопросы