diff --git a/build.gradle.kts b/build.gradle.kts index e290d49..f9c2b2b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -68,6 +68,7 @@ publishing { repositories { mavenLocal() +/* maven { name = "releases" // change to point to your repo, e.g. http://my.org/repo @@ -100,6 +101,7 @@ password = ossrhPassword } } +*/ } // Configure all publications @@ -132,7 +134,9 @@ } } } +/* signing { sign(publishing.publications) } +*/ diff --git a/build.gradle.kts b/build.gradle.kts index e290d49..f9c2b2b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -68,6 +68,7 @@ publishing { repositories { mavenLocal() +/* maven { name = "releases" // change to point to your repo, e.g. http://my.org/repo @@ -100,6 +101,7 @@ password = ossrhPassword } } +*/ } // Configure all publications @@ -132,7 +134,9 @@ } } } +/* signing { sign(publishing.publications) } +*/ diff --git a/src/jsMain/kotlin/nl/astraeus/komp/ElementExtentions.kt b/src/jsMain/kotlin/nl/astraeus/komp/ElementExtentions.kt index 854a64f..340314d 100644 --- a/src/jsMain/kotlin/nl/astraeus/komp/ElementExtentions.kt +++ b/src/jsMain/kotlin/nl/astraeus/komp/ElementExtentions.kt @@ -1,5 +1,3 @@ -@file:OptIn(ExperimentalStdlibApi::class) - package nl.astraeus.komp import org.w3c.dom.Element @@ -129,6 +127,10 @@ name } + if (Komponent.updateMode.isUpdate) { + getKompEvents()[eventName] = event + } + this.addEventListener(eventName, event) } diff --git a/build.gradle.kts b/build.gradle.kts index e290d49..f9c2b2b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -68,6 +68,7 @@ publishing { repositories { mavenLocal() +/* maven { name = "releases" // change to point to your repo, e.g. http://my.org/repo @@ -100,6 +101,7 @@ password = ossrhPassword } } +*/ } // Configure all publications @@ -132,7 +134,9 @@ } } } +/* signing { sign(publishing.publications) } +*/ diff --git a/src/jsMain/kotlin/nl/astraeus/komp/ElementExtentions.kt b/src/jsMain/kotlin/nl/astraeus/komp/ElementExtentions.kt index 854a64f..340314d 100644 --- a/src/jsMain/kotlin/nl/astraeus/komp/ElementExtentions.kt +++ b/src/jsMain/kotlin/nl/astraeus/komp/ElementExtentions.kt @@ -1,5 +1,3 @@ -@file:OptIn(ExperimentalStdlibApi::class) - package nl.astraeus.komp import org.w3c.dom.Element @@ -129,6 +127,10 @@ name } + if (Komponent.updateMode.isUpdate) { + getKompEvents()[eventName] = event + } + this.addEventListener(eventName, event) } diff --git a/src/jsMain/kotlin/nl/astraeus/komp/HtmlBuilder.kt b/src/jsMain/kotlin/nl/astraeus/komp/HtmlBuilder.kt index 05c7c5d..98c5ea8 100644 --- a/src/jsMain/kotlin/nl/astraeus/komp/HtmlBuilder.kt +++ b/src/jsMain/kotlin/nl/astraeus/komp/HtmlBuilder.kt @@ -51,6 +51,14 @@ return null } +private fun ArrayList.currentPosition(): ElementIndex? { + return if (this.size < 2) { + null + } else { + this[this.size-2] + } +} + private fun ArrayList.nextElement() { this.lastOrNull()?.let { it.setAttr.clear() @@ -79,7 +87,7 @@ class HtmlBuilder( private val komponent: Komponent?, parent: Element, - childIndex: Int = 0, + childIndex: Int = 0 ) : HtmlConsumer { private var currentPosition = arrayListOf() private var inDebug = false @@ -135,6 +143,7 @@ override fun onTagStart(tag: Tag) { logReplace { "onTagStart, [${tag.tagName}, ${tag.namespace}], currentPosition: $currentPosition" } + currentNode = currentPosition.currentElement() if (currentNode == null) { @@ -169,8 +178,6 @@ currentPosition.replace(currentNode!!) } - check(currentNode == currentPosition.currentElement()) - currentElement = currentNode as? Element ?: currentElement if (currentNode is Element) { @@ -179,17 +186,17 @@ root = currentNode as Element } - if (Komponent.updateMode.isReplace) { + if (Komponent.updateMode.isUpdate) { currentElement?.clearKompEvents() } + currentPosition.lastOrNull()?.setAttr?.clear() for (entry in tag.attributesEntries) { currentElement!!.setKompAttribute(entry.key, entry.value) - console.log("onTagStart - set attribute", entry.key) currentPosition.lastOrNull()?.setAttr?.add(entry.key) } - if (tag.namespace != null) { + if (tag.namespace != null && Komponent.updateMode.isReplace) { //logReplace"onTagStart, same node type") (currentNode as? Element)?.innerHTML = "" @@ -219,10 +226,9 @@ currentElement?.setKompAttribute(attribute, value) if (value == null || value.isEmpty()) { - currentPosition.lastOrNull()?.setAttr?.remove(attribute) + currentPosition.currentPosition()?.setAttr?.remove(attribute) } else { - console.log("onTagAttributeChange - set attribute", attribute) - currentPosition.lastOrNull()?.setAttr?.add(attribute) + currentPosition.currentPosition()?.setAttr?.add(attribute) } } @@ -251,15 +257,8 @@ checkTag(tag) } - currentPosition.pop() - - currentNode = currentPosition.currentElement() - currentElement = currentNode as? Element ?: currentElement - if (currentElement != null) { - val setAttrs: Set = currentPosition.lastOrNull()?.setAttr ?: setOf() - - console.log("onTagEnd - set attr:", setAttrs.joinToString(",")) + val setAttrs: Set = currentPosition.currentPosition()?.setAttr ?: setOf() // remove attributes that where not set val element = currentElement @@ -273,7 +272,6 @@ !setAttrs.contains(attr) && attr != "style" ) { - console.log("remove attr", attr) if (element is HTMLInputElement) { when (attr) { "checked" -> { @@ -295,6 +293,11 @@ } } + currentPosition.pop() + + currentNode = currentPosition.currentElement() + currentElement = currentNode as? Element ?: currentElement + currentPosition.nextElement() currentElement = currentElement?.parentElement as? HTMLElement @@ -398,7 +401,6 @@ exceptionThrown = true if (exception !is KomponentException) { - console.log("onTagError", tag, exception) val position = mutableListOf() var ce = currentElement while (ce != null) { @@ -441,7 +443,7 @@ companion object { fun create(content: HtmlBuilder.() -> Unit): Element { val container = document.createElement("div") as HTMLElement - val consumer = HtmlBuilder(null, container, 0) + val consumer = HtmlBuilder(null, container) content.invoke(consumer) return consumer.root ?: error("No root element found after render!") } diff --git a/build.gradle.kts b/build.gradle.kts index e290d49..f9c2b2b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -68,6 +68,7 @@ publishing { repositories { mavenLocal() +/* maven { name = "releases" // change to point to your repo, e.g. http://my.org/repo @@ -100,6 +101,7 @@ password = ossrhPassword } } +*/ } // Configure all publications @@ -132,7 +134,9 @@ } } } +/* signing { sign(publishing.publications) } +*/ diff --git a/src/jsMain/kotlin/nl/astraeus/komp/ElementExtentions.kt b/src/jsMain/kotlin/nl/astraeus/komp/ElementExtentions.kt index 854a64f..340314d 100644 --- a/src/jsMain/kotlin/nl/astraeus/komp/ElementExtentions.kt +++ b/src/jsMain/kotlin/nl/astraeus/komp/ElementExtentions.kt @@ -1,5 +1,3 @@ -@file:OptIn(ExperimentalStdlibApi::class) - package nl.astraeus.komp import org.w3c.dom.Element @@ -129,6 +127,10 @@ name } + if (Komponent.updateMode.isUpdate) { + getKompEvents()[eventName] = event + } + this.addEventListener(eventName, event) } diff --git a/src/jsMain/kotlin/nl/astraeus/komp/HtmlBuilder.kt b/src/jsMain/kotlin/nl/astraeus/komp/HtmlBuilder.kt index 05c7c5d..98c5ea8 100644 --- a/src/jsMain/kotlin/nl/astraeus/komp/HtmlBuilder.kt +++ b/src/jsMain/kotlin/nl/astraeus/komp/HtmlBuilder.kt @@ -51,6 +51,14 @@ return null } +private fun ArrayList.currentPosition(): ElementIndex? { + return if (this.size < 2) { + null + } else { + this[this.size-2] + } +} + private fun ArrayList.nextElement() { this.lastOrNull()?.let { it.setAttr.clear() @@ -79,7 +87,7 @@ class HtmlBuilder( private val komponent: Komponent?, parent: Element, - childIndex: Int = 0, + childIndex: Int = 0 ) : HtmlConsumer { private var currentPosition = arrayListOf() private var inDebug = false @@ -135,6 +143,7 @@ override fun onTagStart(tag: Tag) { logReplace { "onTagStart, [${tag.tagName}, ${tag.namespace}], currentPosition: $currentPosition" } + currentNode = currentPosition.currentElement() if (currentNode == null) { @@ -169,8 +178,6 @@ currentPosition.replace(currentNode!!) } - check(currentNode == currentPosition.currentElement()) - currentElement = currentNode as? Element ?: currentElement if (currentNode is Element) { @@ -179,17 +186,17 @@ root = currentNode as Element } - if (Komponent.updateMode.isReplace) { + if (Komponent.updateMode.isUpdate) { currentElement?.clearKompEvents() } + currentPosition.lastOrNull()?.setAttr?.clear() for (entry in tag.attributesEntries) { currentElement!!.setKompAttribute(entry.key, entry.value) - console.log("onTagStart - set attribute", entry.key) currentPosition.lastOrNull()?.setAttr?.add(entry.key) } - if (tag.namespace != null) { + if (tag.namespace != null && Komponent.updateMode.isReplace) { //logReplace"onTagStart, same node type") (currentNode as? Element)?.innerHTML = "" @@ -219,10 +226,9 @@ currentElement?.setKompAttribute(attribute, value) if (value == null || value.isEmpty()) { - currentPosition.lastOrNull()?.setAttr?.remove(attribute) + currentPosition.currentPosition()?.setAttr?.remove(attribute) } else { - console.log("onTagAttributeChange - set attribute", attribute) - currentPosition.lastOrNull()?.setAttr?.add(attribute) + currentPosition.currentPosition()?.setAttr?.add(attribute) } } @@ -251,15 +257,8 @@ checkTag(tag) } - currentPosition.pop() - - currentNode = currentPosition.currentElement() - currentElement = currentNode as? Element ?: currentElement - if (currentElement != null) { - val setAttrs: Set = currentPosition.lastOrNull()?.setAttr ?: setOf() - - console.log("onTagEnd - set attr:", setAttrs.joinToString(",")) + val setAttrs: Set = currentPosition.currentPosition()?.setAttr ?: setOf() // remove attributes that where not set val element = currentElement @@ -273,7 +272,6 @@ !setAttrs.contains(attr) && attr != "style" ) { - console.log("remove attr", attr) if (element is HTMLInputElement) { when (attr) { "checked" -> { @@ -295,6 +293,11 @@ } } + currentPosition.pop() + + currentNode = currentPosition.currentElement() + currentElement = currentNode as? Element ?: currentElement + currentPosition.nextElement() currentElement = currentElement?.parentElement as? HTMLElement @@ -398,7 +401,6 @@ exceptionThrown = true if (exception !is KomponentException) { - console.log("onTagError", tag, exception) val position = mutableListOf() var ce = currentElement while (ce != null) { @@ -441,7 +443,7 @@ companion object { fun create(content: HtmlBuilder.() -> Unit): Element { val container = document.createElement("div") as HTMLElement - val consumer = HtmlBuilder(null, container, 0) + val consumer = HtmlBuilder(null, container) content.invoke(consumer) return consumer.root ?: error("No root element found after render!") } diff --git a/src/jsMain/kotlin/nl/astraeus/komp/Komponent.kt b/src/jsMain/kotlin/nl/astraeus/komp/Komponent.kt index 15e04d1..f52bf4c 100644 --- a/src/jsMain/kotlin/nl/astraeus/komp/Komponent.kt +++ b/src/jsMain/kotlin/nl/astraeus/komp/Komponent.kt @@ -146,7 +146,6 @@ } } val builder = HtmlBuilder(this, parent, childIndex) - builder.root = null try { currentKomponent = this @@ -186,7 +185,7 @@ var logRenderEvent = false var logReplaceEvent = false var enableAssertions = false - var updateMode = UpdateMode.REPLACE + var updateMode = UpdateMode.UPDATE var unsafeMode = UnsafeMode.UNSAFE_DISABLED fun create(parent: HTMLElement, component: Komponent) {