diff --git a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/vector/xmldom/MalformedXMLException.kt b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/vector/xmldom/MalformedXMLException.kt new file mode 100644 index 0000000000..50c9c221ce --- /dev/null +++ b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/vector/xmldom/MalformedXMLException.kt @@ -0,0 +1,6 @@ +package org.jetbrains.compose.resources.vector.xmldom + +/** + * Error throw when parsed XML is malformed + */ +class MalformedXMLException(message: String?) : Exception(message) diff --git a/components/resources/library/src/jsMain/kotlin/org/jetbrains/compose/resources/Resource.js.kt b/components/resources/library/src/jsMain/kotlin/org/jetbrains/compose/resources/Resource.js.kt index b071ef8e04..efbf35a011 100644 --- a/components/resources/library/src/jsMain/kotlin/org/jetbrains/compose/resources/Resource.js.kt +++ b/components/resources/library/src/jsMain/kotlin/org/jetbrains/compose/resources/Resource.js.kt @@ -6,8 +6,11 @@ package org.jetbrains.compose.resources import org.jetbrains.compose.resources.vector.xmldom.Element +import org.jetbrains.compose.resources.vector.xmldom.ElementImpl +import org.jetbrains.compose.resources.vector.xmldom.MalformedXMLException import org.khronos.webgl.ArrayBuffer import org.khronos.webgl.Int8Array +import org.w3c.dom.parsing.DOMParser import org.w3c.xhr.ARRAYBUFFER import org.w3c.xhr.XMLHttpRequest import org.w3c.xhr.XMLHttpRequestResponseType @@ -45,7 +48,10 @@ internal actual class MissingResourceException actual constructor(path: String) Exception("Missing resource with path: $path") internal actual fun parseXML(byteArray: ByteArray): Element { - throw UnsupportedOperationException("XML Vector Drawables are not supported for Web target") + val xmlString = byteArray.decodeToString() + val xmlDom = DOMParser().parseFromString(xmlString, "application/xml") + val domElement = xmlDom.documentElement ?: throw MalformedXMLException("missing documentElement") + return ElementImpl(domElement) } internal actual fun isSyncResourceLoadingSupported() = false diff --git a/components/resources/library/src/jsMain/kotlin/org/jetbrains/compose/resources/xmldom/ElementImpl.kt b/components/resources/library/src/jsMain/kotlin/org/jetbrains/compose/resources/xmldom/ElementImpl.kt new file mode 100644 index 0000000000..4e475b0cf8 --- /dev/null +++ b/components/resources/library/src/jsMain/kotlin/org/jetbrains/compose/resources/xmldom/ElementImpl.kt @@ -0,0 +1,17 @@ +package org.jetbrains.compose.resources.vector.xmldom + +import org.w3c.dom.Element as DomElement + +internal class ElementImpl(val element: DomElement): NodeImpl(element), Element { + + override val localName: String + get() = element.localName + + override val namespaceURI: String + get() = element.namespaceURI ?: "" + + override fun getAttributeNS(nameSpaceURI: String, localName: String): String = + element.getAttributeNS(nameSpaceURI, localName) ?: "" + + override fun getAttribute(name: String): String = element.getAttribute(name) ?: "" +} diff --git a/components/resources/library/src/jsMain/kotlin/org/jetbrains/compose/resources/xmldom/NodeImpl.kt b/components/resources/library/src/jsMain/kotlin/org/jetbrains/compose/resources/xmldom/NodeImpl.kt new file mode 100644 index 0000000000..edff59e15a --- /dev/null +++ b/components/resources/library/src/jsMain/kotlin/org/jetbrains/compose/resources/xmldom/NodeImpl.kt @@ -0,0 +1,28 @@ +package org.jetbrains.compose.resources.vector.xmldom + +import org.w3c.dom.Node as DomNode +import org.w3c.dom.Element as DomElement + +internal open class NodeImpl(val n: DomNode): Node { + override val nodeName: String + get() = n.nodeName + + override val localName = "" /* localName is not a Node property, only applies to Elements and Attrs */ + + override val namespaceURI = "" /* namespaceURI is not a Node property, only applies to Elements and Attrs */ + + override val childNodes: NodeList by lazy { + object: NodeList { + override fun item(i: Int): Node { + val child = n.childNodes.item(i) + ?: throw IndexOutOfBoundsException("no child node accessible at index=$i") + return if (child is DomElement) ElementImpl(child) else NodeImpl(child) + } + + override val length: Int = n.childNodes.length + } + } + + override fun lookupPrefix(namespaceURI: String): String = n.lookupPrefix(namespaceURI) ?: "" + +} diff --git a/components/resources/library/src/nativeMain/kotlin/org/jetbrains/compose/resources/vector/xmldom/DomXmlParser.kt b/components/resources/library/src/nativeMain/kotlin/org/jetbrains/compose/resources/vector/xmldom/DomXmlParser.kt index 442107e5b4..7e848ec27b 100644 --- a/components/resources/library/src/nativeMain/kotlin/org/jetbrains/compose/resources/vector/xmldom/DomXmlParser.kt +++ b/components/resources/library/src/nativeMain/kotlin/org/jetbrains/compose/resources/vector/xmldom/DomXmlParser.kt @@ -4,6 +4,7 @@ */ package org.jetbrains.compose.resources.vector.xmldom +import org.jetbrains.compose.resources.vector.xmldom.MalformedXMLException import platform.Foundation.* import platform.darwin.NSObject @@ -17,8 +18,6 @@ internal fun parse(xml: String): Element { return parser.root!! } -class MalformedXMLException(message: String?) : Exception(message) - private class ElementImpl(override val localName: String, override val nodeName: String, override val namespaceURI: String,