From a0b0301644be3c98855d3cac29965c3a1552f43f Mon Sep 17 00:00:00 2001 From: Walter Oggioni Date: Sun, 14 Apr 2024 18:47:22 +0800 Subject: [PATCH] fixed bug with lambda return value --- .../kotlin/net/woggioni/khtml/Khtml.kt | 404 ++++++++++++------ 1 file changed, 283 insertions(+), 121 deletions(-) diff --git a/src/commonMain/kotlin/net/woggioni/khtml/Khtml.kt b/src/commonMain/kotlin/net/woggioni/khtml/Khtml.kt index 509d372..7afb5c7 100644 --- a/src/commonMain/kotlin/net/woggioni/khtml/Khtml.kt +++ b/src/commonMain/kotlin/net/woggioni/khtml/Khtml.kt @@ -12,9 +12,9 @@ import org.w3c.dom.Document import org.w3c.dom.Element import org.w3c.dom.events.Event -class Khtml private constructor(private val doc : Document, val element: Element) { +class Khtml private constructor(private val doc: Document, val element: Element) { companion object { - fun of(doc : Document, el: Element, cb : Khtml.(el : Element) -> Unit) : Element { + fun of(doc: Document, el: Element, cb: Khtml.(el: Element) -> Unit): Element { Khtml(doc, el).cb(el) return el } @@ -25,7 +25,7 @@ class Khtml private constructor(private val doc : Document, val element: Element } } - fun Element.on(eventName : String, eventListener : (Event) -> Unit) { + fun Element.on(eventName: String, eventListener: (Event) -> Unit) { addEventListener(eventName, eventListener) } @@ -43,137 +43,299 @@ class Khtml private constructor(private val doc : Document, val element: Element private inline fun bdn( - name : String, - attrs : Map, - cb : Khtml.(el : Element) -> Unit) : Element { + name: String, + attrs: Map, + cb: Khtml.(el: Element) -> Unit + ): Element { val child = doc.createElement(name) - for((key, value) in attrs) { + for ((key, value) in attrs) { child.setAttribute(key, value) } - element.appendChild(child) - Khtml(doc, child).cb(child) - return element + return child + .also { + element.appendChild(it) + Khtml(doc, it).cb(it) + } } - fun html(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("html", attrs, cb) - fun head(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("head", attrs, cb) - fun body(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("body", attrs, cb) - fun use(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("use", attrs, cb) - fun svg(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("svg", attrs, cb) - fun div(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("div", attrs, cb) - fun header(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("header", attrs, cb) - fun main(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("main", attrs, cb) - fun footer(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("footer", attrs, cb) - fun a(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("a", attrs, cb) - fun meta(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("meta", attrs, cb) - fun script(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("script", attrs, cb) - fun link(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("link", attrs, cb) - fun title(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("title", attrs, cb) - fun p(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("p", attrs, cb) - fun span(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("span", attrs, cb) - fun i(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("i", attrs, cb) - fun del(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("del", attrs, cb) - fun s(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("s", attrs, cb) - fun ins(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("ins", attrs, cb) - fun u(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("u", attrs, cb) - fun b(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("b", attrs, cb) - fun small(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("small", attrs, cb) - fun strong(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("strong", attrs, cb) - fun em(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("em", attrs, cb) - fun mark(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("mark", attrs, cb) - fun obj(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("object", attrs, cb) - fun h1(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("h1", attrs, cb) - fun h2(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("h2", attrs, cb) - fun h3(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("h3", attrs, cb) - fun h4(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("h4", attrs, cb) - fun h5(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("h5", attrs, cb) - fun h6(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("h6", attrs, cb) - fun table(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("table", attrs, cb) - fun thead(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("thead", attrs, cb) - fun tbody(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("tbody", attrs, cb) - fun tfoot(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("tfoot", attrs, cb) - fun tr(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("tr", attrs, cb) - fun th(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("th", attrs, cb) - fun td(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("td", attrs, cb) - fun ol(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("ol", attrs, cb) - fun ul(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("ul", attrs, cb) - fun li(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("li", attrs, cb) - fun img(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("img", attrs, cb) - fun form(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("form", attrs, cb) - fun label(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("label", attrs, cb) - fun button(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("button", attrs, cb) - fun input(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("input", attrs, cb) - fun select(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("select", attrs, cb) - fun option(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("option", attrs, cb) - fun meter(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("meter", attrs, cb) - fun nav(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("nav", attrs, cb) - fun menu(attrs : Map = emptyMap(), - cb : Khtml.(el : Element) -> Unit) : Element = bdn("menu", attrs, cb) - fun classes(vararg classes : String) { - for(cls in classes) element.classList.add(cls) + fun html( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("html", attrs, cb) + + fun head( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("head", attrs, cb) + + fun body( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("body", attrs, cb) + + fun use( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("use", attrs, cb) + + fun svg( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("svg", attrs, cb) + + fun div( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("div", attrs, cb) + + fun header( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("header", attrs, cb) + + fun main( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("main", attrs, cb) + + fun footer( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("footer", attrs, cb) + + fun a( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("a", attrs, cb) + + fun meta( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("meta", attrs, cb) + + fun script( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("script", attrs, cb) + + fun link( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("link", attrs, cb) + + fun title( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("title", attrs, cb) + + fun p( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("p", attrs, cb) + + fun span( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("span", attrs, cb) + + fun i( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("i", attrs, cb) + + fun del( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("del", attrs, cb) + + fun s( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("s", attrs, cb) + + fun ins( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("ins", attrs, cb) + + fun u( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("u", attrs, cb) + + fun b( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("b", attrs, cb) + + fun small( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("small", attrs, cb) + + fun strong( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("strong", attrs, cb) + + fun em( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("em", attrs, cb) + + fun mark( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("mark", attrs, cb) + + fun obj( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("object", attrs, cb) + + fun h1( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("h1", attrs, cb) + + fun h2( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("h2", attrs, cb) + + fun h3( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("h3", attrs, cb) + + fun h4( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("h4", attrs, cb) + + fun h5( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("h5", attrs, cb) + + fun h6( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("h6", attrs, cb) + + fun table( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("table", attrs, cb) + + fun thead( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("thead", attrs, cb) + + fun tbody( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("tbody", attrs, cb) + + fun tfoot( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("tfoot", attrs, cb) + + fun tr( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("tr", attrs, cb) + + fun th( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("th", attrs, cb) + + fun td( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("td", attrs, cb) + + fun ol( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("ol", attrs, cb) + + fun ul( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("ul", attrs, cb) + + fun li( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("li", attrs, cb) + + fun img( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("img", attrs, cb) + + fun form( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("form", attrs, cb) + + fun label( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("label", attrs, cb) + + fun button( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("button", attrs, cb) + + fun input( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("input", attrs, cb) + + fun select( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("select", attrs, cb) + + fun option( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("option", attrs, cb) + + fun meter( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("meter", attrs, cb) + + fun nav( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("nav", attrs, cb) + + fun menu( + attrs: Map = emptyMap(), + cb: Khtml.(el: Element) -> Unit + ): Element = bdn("menu", attrs, cb) + + fun classes(vararg classes: String) { + for (cls in classes) element.classList.add(cls) } - fun attr(key: String, value : String) { + fun attr(key: String, value: String) { element.setAttribute(key, value) } - fun text(txt : String) { + fun text(txt: String) { element.appendChild(doc.createTextNode(txt)) } - fun on(eventName : String, cb: (Event) -> Unit) { + fun on(eventName: String, cb: (Event) -> Unit) { element.addEventListener(eventName, cb) } }