From a3cd65f10e1a9b58f469b750ec06ff757c12a930 Mon Sep 17 00:00:00 2001 From: James Strachan Date: Mon, 6 Feb 2012 16:49:49 +0000 Subject: [PATCH] added a little spike of a little std.dom API to make the W3C DOM API a little kooler --- runtests/runtests.iml | 15 ++++++ .../test/stdlib/testall/DomTestAllTest.java | 12 +++++ runtests/test/stdlib/testall/TestAll.java | 15 ++++++ stdlib.ipr | 1 + stdlib/ktSrc/dom/Dom.kt | 35 ++++++++++++ stdlib/ktSrc/dom/DomJVM.kt | 53 +++++++++++++++++++ testlib/test/dom/DomTest.kt | 42 +++++++++++++++ 7 files changed, 173 insertions(+) create mode 100644 runtests/runtests.iml create mode 100644 runtests/test/stdlib/testall/DomTestAllTest.java create mode 100644 runtests/test/stdlib/testall/TestAll.java create mode 100644 stdlib/ktSrc/dom/Dom.kt create mode 100644 stdlib/ktSrc/dom/DomJVM.kt create mode 100644 testlib/test/dom/DomTest.kt diff --git a/runtests/runtests.iml b/runtests/runtests.iml new file mode 100644 index 00000000000..49c63a49c3d --- /dev/null +++ b/runtests/runtests.iml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/runtests/test/stdlib/testall/DomTestAllTest.java b/runtests/test/stdlib/testall/DomTestAllTest.java new file mode 100644 index 00000000000..67eb5826707 --- /dev/null +++ b/runtests/test/stdlib/testall/DomTestAllTest.java @@ -0,0 +1,12 @@ +package stdlib.testall; + +import junit.framework.TestSuite; +import test.dom.*; + +/** + */ +public class DomTestAllTest { + public static TestSuite suite() { + return new TestSuite(DomTest.class); + } +} diff --git a/runtests/test/stdlib/testall/TestAll.java b/runtests/test/stdlib/testall/TestAll.java new file mode 100644 index 00000000000..cd41ee03d07 --- /dev/null +++ b/runtests/test/stdlib/testall/TestAll.java @@ -0,0 +1,15 @@ +package stdlib.testall; + +import junit.framework.TestSuite; +import test.collections.*; +import test.standard.*; + +/** + */ +public class TestAll { + public static TestSuite suite() { + TestSuite suite = new TestSuite(GetOrElseTest.class, test.stdlib.issues.StdLibIssuesTest.class, StandardCollectionTest.class, CollectionTest.class, IoTest.class, ListTest.class, MapTest.class, SetTest.class, OldStdlibTest.class); + suite.addTest(testDslExample.namespace.getSuite()); + return suite; + } +} diff --git a/stdlib.ipr b/stdlib.ipr index 693c766ab77..227263bf56c 100644 --- a/stdlib.ipr +++ b/stdlib.ipr @@ -68,6 +68,7 @@ + diff --git a/stdlib/ktSrc/dom/Dom.kt b/stdlib/ktSrc/dom/Dom.kt new file mode 100644 index 00000000000..9087c182234 --- /dev/null +++ b/stdlib/ktSrc/dom/Dom.kt @@ -0,0 +1,35 @@ +package std.dom + +import org.w3c.dom.* +import javax.xml.parsers.DocumentBuilder +import javax.xml.parsers.DocumentBuilderFactory +import std.getOrElse + +// Properties + +var Element.id : String +get() = this.getAttribute("id").getOrElse("") +set(value) { + this.setAttribute("id", value) +} + +var Element.style : String +get() = this.getAttribute("style").getOrElse("") +set(value) { + this.setAttribute("style", value) +} + +var Element.cssClass : String +get() = this.getAttribute("class").getOrElse("") +set(value) { + this.setAttribute("class", value) +} + +// Syntax sugar + +inline fun Node.plus(child: Node?): Node { + if (child != null) { + this.appendChild(child) + } + return this +} \ No newline at end of file diff --git a/stdlib/ktSrc/dom/DomJVM.kt b/stdlib/ktSrc/dom/DomJVM.kt new file mode 100644 index 00000000000..f281b56f358 --- /dev/null +++ b/stdlib/ktSrc/dom/DomJVM.kt @@ -0,0 +1,53 @@ +/** + * JVM specific API implementations using JAXB and so forth which would not be used when compiling to JS + */ +package std.dom + +import org.w3c.dom.* +import javax.xml.parsers.DocumentBuilder +import javax.xml.parsers.DocumentBuilderFactory +import javax.xml.transform.Transformer +import javax.xml.transform.TransformerFactory +import javax.xml.transform.Source +import javax.xml.transform.dom.DOMSource +import javax.xml.transform.stream.StreamResult + +import java.io.StringWriter +import javax.xml.transform.OutputKeys + +fun createDocument(builder: DocumentBuilder): Document { + return builder.newDocument().sure() +} + +fun createDocument(builderFactory: DocumentBuilderFactory = DocumentBuilderFactory.newInstance().sure()): Document { + return createDocument(builderFactory.newDocumentBuilder().sure()) +} + +fun createTransformer(source: Source? = null, factory: TransformerFactory = TransformerFactory.newInstance().sure()): Transformer { + val transformer = if (source != null) { + factory.newTransformer(source) + } else { + factory.newTransformer() + } + return transformer.sure() +} + +fun Node.toXmlString(xmlDeclaration: Boolean = this is Document): String { + return nodeToXmlString(this, xmlDeclaration) +} + +/* +fun Document.toXmlString(xmlDeclaration: Boolean = true): String { + return nodeToXmlString(this, xmlDeclaration) +} +*/ + +fun nodeToXmlString(node: Node, xmlDeclaration: Boolean): String { + val transformer = createTransformer() + transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, if (xmlDeclaration) "no" else "yes") + val buffer = StringWriter() + transformer.transform(DOMSource(node), StreamResult(buffer)) + return buffer.toString().sure() + +} + diff --git a/testlib/test/dom/DomTest.kt b/testlib/test/dom/DomTest.kt new file mode 100644 index 00000000000..41b4ea179da --- /dev/null +++ b/testlib/test/dom/DomTest.kt @@ -0,0 +1,42 @@ +package test.dom + +import std.* +import std.dom.* +import stdhack.test.TestSupport +import stdhack.test.* +import stdhack.test.assertNull +import org.w3c.dom.* +import stdhack.test.assertEquals +import std.dom.toXmlString + +class DomTest() : TestSupport() { + + fun testCreateDocument() { + var doc = createDocument() + assertNotNull(doc, "Should have created a document") + + val e = doc.createElement("foo").sure() + assertCssClass(e, "") + + // now lets update the cssClass property + e.cssClass = "foo" + assertCssClass(e, "foo") + + // now using the attribute directly + e.setAttribute("class", "bar") + assertCssClass(e, "bar") + + doc += e + println("document ${doc.toXmlString()}") + } + + + fun assertCssClass(e: Element, value: String?): Unit { + val cl = e.cssClass + val cl2 = e.getAttribute("class") + println("element ${e.toXmlString()} has cssClass `${cl}` class attr `${cl2}`") + + assertEquals(value, cl, "value of element.cssClass") + assertEquals(value, cl2, "value of element.getAttribute(\"class\")") + } +}