diff --git a/android/core/src/processing/core/XML.java b/android/core/src/processing/core/XML.java index 286cf6b1d..69eebc76f 100644 --- a/android/core/src/processing/core/XML.java +++ b/android/core/src/processing/core/XML.java @@ -10,8 +10,8 @@ License as published by the Free Software Foundation, version 2. This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + but WITHOUT ANY WARRANTY; without even the implied warranty + of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General @@ -24,6 +24,9 @@ package processing.core; import java.io.*; import javax.xml.parsers.*; +import javax.xml.transform.*; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; import org.w3c.dom.*; import org.xml.sax.*; @@ -32,27 +35,27 @@ import processing.core.PApplet; /** - * This is the base class used for the Processing XML library, + * This is the base class used for the Processing XML library, * representing a single node of an XML tree. */ public class XML implements Serializable { /** The internal representation, a DOM node. */ protected Node node; - + /** Cached locally because it's used often. */ protected String name; - + /** The parent element. */ protected XML parent; /** Child elements, once loaded. */ protected XML[] children; - + protected XML() { } - - + + /** * Begin parsing XML data passed in from a PApplet. This code * wraps exception handling, for more advanced exception handling, @@ -87,17 +90,17 @@ public class XML implements Serializable { // builderFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); DocumentBuilder builder = factory.newDocumentBuilder(); // builder.setEntityResolver() - + // SAXParserFactory spf = SAXParserFactory.newInstance(); // spf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); // SAXParser p = spf.newSAXParser(); - + // builder = DocumentBuilderFactory.newDocumentBuilder(); // builder = new SAXBuilder(); // builder.setValidation(validating); - + // print(dataPath("1broke.html"), System.out); - + // Document document = builder.parse(dataPath("1_alt.html")); Document document = builder.parse(new InputSource(reader)); node = document.getDocumentElement(); @@ -106,14 +109,14 @@ public class XML implements Serializable { // for (int i = 0; i < nodeList.getLength(); i++) { // } // print(createWriter("data/1_alt_reparse.html"), document.getDocumentElement(), 0); - + } catch (ParserConfigurationException pce) { pce.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } catch (SAXException e2) { e2.printStackTrace(); - } + } } @@ -125,16 +128,16 @@ public class XML implements Serializable { DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.newDocument(); node = document.createElement(name); - + this.name = name; this.parent = null; - + } catch (ParserConfigurationException e) { e.printStackTrace(); } } - + // public PNodeXML(String name, PNode parent) { // PNodeXML pxml = PNodeXML.parse("<" + name + ">"); // this.node = pxml.node; @@ -142,18 +145,18 @@ public class XML implements Serializable { // this.parent = parent; // } - + protected XML(XML parent, Node node) { this.node = node; this.parent = parent; - + if (node.getNodeType() == Node.ELEMENT_NODE) { name = node.getNodeName(); } } - - - static public XML parse(String xml) { + + + static public XML parse(String xml) { return new XML(new StringReader(xml)); } @@ -166,7 +169,7 @@ public class XML implements Serializable { return this.parent; } - + /** * Returns the full name (i.e. the name including an eventual namespace * prefix) of the element. @@ -176,7 +179,7 @@ public class XML implements Serializable { return name; } - + /** * Returns the name of the element (without namespace prefix). * @return the name, or null if the element only contains #PCDATA. @@ -210,9 +213,9 @@ public class XML implements Serializable { return children.length; } - + /** - * Put the names of all children into an array. Same as looping through + * Put the names of all children into an array. Same as looping through * each child and calling getName() on each XMLElement. */ public String[] listChildren() { @@ -232,8 +235,8 @@ public class XML implements Serializable { } return outgoing; } - - + + /** * Returns an array containing all the child elements. */ @@ -357,8 +360,8 @@ public class XML implements Serializable { } return outgoing; } - - + + public XML addChild(String tag) { Document document = node.getOwnerDocument(); Node newChild = document.createElement(tag); @@ -384,7 +387,7 @@ public class XML implements Serializable { return node.getAttributes().getLength(); } - + /** * Get a list of the names for all of the attributes for this node. */ @@ -428,7 +431,7 @@ public class XML implements Serializable { // return (attr == null) ? defaultValue : attr.getNodeValue(); // } - + public String getString(String name) { return getString(name, null); } @@ -449,12 +452,12 @@ public class XML implements Serializable { return getInt(name, 0); } - + public void setInt(String name, int value) { setString(name, String.valueOf(value)); } - + /** * Returns the value of an attribute. * @@ -475,8 +478,8 @@ public class XML implements Serializable { public float getFloat(String name) { return getFloat(name, 0); } - - + + /** * Returns the value of an attribute. * @@ -495,12 +498,12 @@ public class XML implements Serializable { setString(name, String.valueOf(value)); } - + public double getDouble(String name) { return getDouble(name, 0); } - + /** * Returns the value of an attribute. * @@ -513,8 +516,8 @@ public class XML implements Serializable { String value = getString(name); return (value == null) ? defaultValue : Double.parseDouble(value); } - - + + public void setDouble(String name, double value) { setString(name, String.valueOf(value)); } @@ -529,35 +532,84 @@ public class XML implements Serializable { * @return the content. */ public String getContent() { - //return node.getTextContent(); // requires Android 2.2 - - StringBuilder buffer = new StringBuilder(); - NodeList childList = node.getChildNodes(); - for (int i = 0; i < childList.getLength(); i++) { - Node child = childList.item(i); - if (child.getNodeType() == Node.TEXT_NODE) { // skip non-text nodes - buffer.append(child.getNodeValue()); - } - } - return buffer.toString(); + return node.getTextContent(); } - + + public void setContent(String text) { + node.setTextContent(text); + } + + public String toString() { return toString(2); } - - + + public String toString(int indent) { - return super.toString(); - - // requires API level 8 -// javax.xml.transform.TransformerFactory factory = new javax.xml.transform.TransformerFactory(); -// javax.xml.transform.Transformer transformer = factory.newTransformer(); -// javax.xml.transform.dom.DOMSource domSource = new javax.xml.transform.dom.DOMSource(rootNode); -// javax.xml.transform.stream.StreamResult result = new javax.xml.transform.stream.StreamResult(outputStream); -// transformer(domSource, result); - + try { +// node.normalize(); // does nothing useful + DOMSource dumSource = new DOMSource(node); + // entities = doctype.getEntities() + TransformerFactory tf = TransformerFactory.newInstance(); + Transformer transformer = tf.newTransformer(); + // if this is the root, output the decl, if not, hide it + if (parent != null) { + transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); +// } else { +// transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); + } +// transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "sample.dtd"); + transformer.setOutputProperty(OutputKeys.METHOD, "xml"); +// transformer.setOutputProperty(OutputKeys.CDATA_SECTION_ELEMENTS, "yes"); // huh? + +// transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, +// "-//W3C//DTD XHTML 1.0 Transitional//EN"); +// transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, +// "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"); + +// transformer.setOutputProperty(OutputKeys.ENCODING,"ISO-8859-1"); +// transformer.setOutputProperty(OutputKeys.ENCODING,"UTF8"); + transformer.setOutputProperty(OutputKeys.ENCODING,"UTF-8"); +// transformer.setOutputProperty(OutputKeys.CDATA_SECTION_ELEMENTS + // indent by default, but sometimes this needs to be turned off + if (indent != 0) { + transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", String.valueOf(indent)); + transformer.setOutputProperty(OutputKeys.INDENT, "yes"); + } +// Properties p = transformer.getOutputProperties(); +// for (Object key : p.keySet()) { +// System.out.println(key + " -> " + p.get(key)); +// } + + StringWriter sw = new StringWriter(); + StreamResult sr = new StreamResult(sw); + transformer.transform(dumSource, sr); + return sw.toString(); + +// Document document = node.getOwnerDocument(); +// OutputFormat format = new OutputFormat(document); +// format.setLineWidth(65); +// format.setIndenting(true); +// format.setIndent(2); +// StringWriter sw = new StringWriter(); +// XMLSerializer serializer = new XMLSerializer(sw, format); +// serializer.serialize(document); +// return sw.toString(); + + } catch (Exception e) { + e.printStackTrace(); + } + return null; + + /* + javax.xml.transform.TransformerFactory factory = new javax.xml.transform.TransformerFactory(); + javax.xml.transform.Transformer transformer = factory.newTransformer(); + javax.xml.transform.dom.DOMSource domSource = new javax.xml.transform.dom.DOMSource(rootNode); + javax.xml.transform.stream.StreamResult result = new javax.xml.transform.stream.StreamResult(outputStream); + transformer(domSource, result); + */ + /* try { DOMSource dumSource = new DOMSource(node); @@ -579,7 +631,7 @@ public class XML implements Serializable { StreamResult sr = new StreamResult(sw); transformer.transform(dumSource, sr); return sw.toString(); - + } catch (Exception e) { e.printStackTrace(); } diff --git a/android/todo.txt b/android/todo.txt index 130344372..3d5f1382f 100644 --- a/android/todo.txt +++ b/android/todo.txt @@ -1,7 +1,13 @@ 0205 android +X finish xml writing on android +X http://stackoverflow.com/questions/2290945/writing-xml-on-android +X consider switch to android 2.2 as the minimum +X remove unnecessary processing.xml.* code from android-core +_ http://code.google.com/p/processing/issues/detail?id=214 _ Android mode is broken on Windows in Processing 2.0a5 +_ file a bug for this w/ Google _ http://code.google.com/p/processing/issues/detail?id=1022 _ lack of registerXxx() implementation is breaking pre() and post() in particles diff --git a/core/src/processing/core/PApplet.java b/core/src/processing/core/PApplet.java index 8c06f42da..b64fac9bb 100644 --- a/core/src/processing/core/PApplet.java +++ b/core/src/processing/core/PApplet.java @@ -237,6 +237,7 @@ public class PApplet extends Applet */ static public boolean useQuartz = true; + /** * Modifier flags for the shortcut key used to trigger menus. * (Cmd on Mac OS X, Ctrl on Linux and Windows) diff --git a/core/todo.txt b/core/todo.txt index f7d7b65bf..2516541c4 100644 --- a/core/todo.txt +++ b/core/todo.txt @@ -1,6 +1,18 @@ 0205 core +_ look into using BufferStrategy again to improve performance +_ there are more improvements to be made ala issue #729 + +_ memory leak when many createGraphics(..., JAVA2D) calls are used +_ http://code.google.com/p/processing/issues/detail?id=507 +_ need to add clear() method so clear out ARGB surfaces + +_ pause()/resume() need to work on the desktop side as well +_ stop() not called in 1.5 +_ http://code.google.com/p/processing/issues/detail?id=636 +_ In reply to c#1, I noticed that dispose() is getting called. stop() isn't. + _ selectInput() and selectOutput() freezes _ http://code.google.com/p/processing/issues/detail?id=173 _ -> now includes a patch that addresses one specific problem @@ -17,8 +29,6 @@ _ fix edge + 1 issue on stroke/fill for rectangles _ add reference/docs for urlEncode() and urlDecode() -_ pause()/resume() need to work on the desktop side as well - _ Wishlist for the new XML class in Processing 2.0 _ http://code.google.com/p/processing/issues/detail?id=904 @@ -29,9 +39,6 @@ _ should this be the default to be more like old XML? _ add() to add things to lists, sum() for the math (sum is used less after all) -_ consider using BufferStrategy to improve performance -_ there are more improvements to be made ala issue #729 - _ add inputPath() and outputPath() -> sketch folder or sd card _ or should this just be a change to sketchPath() on Android? _ also because input/output won't be different (since not data folder) @@ -149,31 +156,11 @@ _ and on android, start/stop can be used to save state information _ need to fix opengl applets so that we can safely kill P3D more xml/json changes -_ finish xml writing on android -_ http://stackoverflow.com/questions/2290945/writing-xml-on-android -_ consider switch to android 2.2 as the minimum _ finish updating XML documentation _ http://code.google.com/p/processing/issues/detail?id=382 _ json issues _ http://www.xml.com/lpt/a/1658 _ http://www.json.org/java/ -_ remove unnecessary processing.xml.* code from android-core -_ http://code.google.com/p/processing/issues/detail?id=214 - -casey [Moved to web/todo.txt 17 SEP 2011] -o pdf fonts -o rewrite documentation about pdf fonts (errors with non-native fonts) -o figure out why font naming not working correctly -o add blendMode() to reference, remove blend() -o need documentation for quadraticVertex() -o docs for rect(x, y, w, h, r) and rect(x, y, w, h, tl, tr, br, bl) -o docs for new arc() -o "Find in Reference" for copy() goes to PVector (oog) -X screen.width/height shouldn't be anywhere -X add docs for screenWidth and screenHeight -X remove delay() documentation -X remove textMode(SCREEN) references - 2.0 _ PNode.getChildren() shouldn't make a new array.. toArray() can do that @@ -233,8 +220,6 @@ _ http://code.google.com/p/processing/issues/detail?id=697 _ sleep time needs to be set *much* higher for dormant applets _ 10s should be fine--no need to keep spinning (bad for android too) _ just call interrupt() when it's time to get back to work -_ memory leak when many createGraphics(..., JAVA2D) calls are used -_ http://code.google.com/p/processing/issues/detail?id=507 _ add methods to PShape to apply all transformations in the tree _ need to clean up the hints in the reference/source diff --git a/todo.txt b/todo.txt index bc7f7fbd5..6c9cdb4ba 100644 --- a/todo.txt +++ b/todo.txt @@ -6,9 +6,10 @@ X get rid of restore sketch feature _ remove pref for restoring sketches _ implement recent sketches menu -_ stop() not called in 1.5 -_ http://code.google.com/p/processing/issues/detail?id=636 -_ In reply to c#1, I noticed that dispose() is getting called. stop() isn't. +_ find in reference for copy() (on image) tries to open PVector.copy() +_ might need disambiguation pages? +_ if a reference page is missing, throws a bunch of exceptions +_ i.e. PVector.copy() not in the reference _ check on new JDK and how it works on OS X _ http://jdk7.java.net/macportpreview/