diff --git a/airframe-rx-html/.js/src/main/scala/wvlet/airframe/rx/html/DOMRenderer.scala b/airframe-rx-html/.js/src/main/scala/wvlet/airframe/rx/html/DOMRenderer.scala index 4b4015c5f..b26574c65 100644 --- a/airframe-rx-html/.js/src/main/scala/wvlet/airframe/rx/html/DOMRenderer.scala +++ b/airframe-rx-html/.js/src/main/scala/wvlet/airframe/rx/html/DOMRenderer.scala @@ -215,6 +215,14 @@ object DOMRenderer extends LogSupport { val textNode = newTextNode(s) node.mountHere(textNode, anchor) Cancelable.empty + case r: RawHtml => + val domNode = dom.document.createElement("span") + domNode.innerHTML = r.html + // Extract the inner node + domNode.childNodes.headOption.foreach { n => + node.mountHere(n, anchor) + } + Cancelable.empty case EntityRef(entityName) => // Wrap entity ref with a span tag. // This is a workaround if the text is inserted in the middle of text element. diff --git a/airframe-rx-html/.js/src/test/scala/wvlet/airframe/http/rx/html/HtmlRenderingTest.scala b/airframe-rx-html/.js/src/test/scala/wvlet/airframe/http/rx/html/HtmlRenderingTest.scala index 4f28a1260..cfade17b7 100644 --- a/airframe-rx-html/.js/src/test/scala/wvlet/airframe/http/rx/html/HtmlRenderingTest.scala +++ b/airframe-rx-html/.js/src/test/scala/wvlet/airframe/http/rx/html/HtmlRenderingTest.scala @@ -131,4 +131,9 @@ class HtmlRenderingTest extends AirSpec { val d = div("1.23", EntityRef("amp"), "0.5") render(d).contains("&") shouldBe true } + + test("raw html") { + val d = div(RawHtml("hello")) + render(d) shouldBe "
hello
" + } } diff --git a/airframe-rx-html/src/main/scala/wvlet/airframe/rx/html/HtmlNode.scala b/airframe-rx-html/src/main/scala/wvlet/airframe/rx/html/HtmlNode.scala index 2f45b533e..974d328e9 100644 --- a/airframe-rx-html/src/main/scala/wvlet/airframe/rx/html/HtmlNode.scala +++ b/airframe-rx-html/src/main/scala/wvlet/airframe/rx/html/HtmlNode.scala @@ -53,6 +53,8 @@ class HtmlEventHandlerOf[E](name: String, namespace: Namespace = Namespace.xhtml case class EntityRef(ref: String) extends HtmlNode +case class RawHtml(html: String) extends HtmlNode + // Used for properly embedding namespaces to DOM. For example, for rendering SVG elements, // Namespace.svg must be set to DOM elements. If not, the SVG elements will not be rendered in the web browsers. case class Namespace(uri: String) diff --git a/airframe-rx-html/src/main/scala/wvlet/airframe/rx/html/RxElement.scala b/airframe-rx-html/src/main/scala/wvlet/airframe/rx/html/RxElement.scala index 0d1aa4094..65ce3aa4b 100644 --- a/airframe-rx-html/src/main/scala/wvlet/airframe/rx/html/RxElement.scala +++ b/airframe-rx-html/src/main/scala/wvlet/airframe/rx/html/RxElement.scala @@ -13,9 +13,9 @@ */ package wvlet.airframe.rx.html +import wvlet.airframe.rx.html.RxEmbedding.* import wvlet.airframe.rx.{Cancelable, Rx} import wvlet.log.LogSupport -import wvlet.airframe.rx.html.RxEmbedding.* /** */