--- pysrc/orig/cpython/Lib/xml/etree/ElementTree.py Tue Jun 12 16:06:45 2012 +++ pysrc/mod/cpython/Lib/xml/etree/ElementTree.py Tue Jun 12 20:20:32 2012 @@ -201,6 +201,26 @@ # may be either None or an empty string, depending on the parser. tail = None # text after end tag, if any + + ## + # (Attribute) Whether or not the element's tag should be closed + # using the long method regardless of whether or not it would be + # possible to close the tag with ' />'. Used by ElementTree only. + + force_long_close = False + + ## + # (Attribute) Whether or not the closing tag preference above + # should propagate to child elements. Used by ElementTree only. + + long_close_propagate = False + + ## + # (Attribute) Whether or not a parent may override this element's + # force_long_close or long_close_propagate values. + # Used by ElemenentTree only + + parent_can_override = True # constructor @@ -213,6 +233,9 @@ self.tag = tag self.attrib = attrib self._children = [] + self.force_long_close = False + self.long_close_propagate = False + self.parent_can_override = True def __repr__(self): return "" % (repr(self.tag), id(self)) @@ -238,6 +261,9 @@ elem.text = self.text elem.tail = self.tail elem[:] = self + elem.force_long_close = self.force_long_close + elem.long_close_propagate = self.long_close_propagate + elem.parent_can_override = self.parent_can_override return elem ## @@ -820,7 +846,8 @@ encoding=None, xml_declaration=None, default_namespace=None, - method=None): + method=None, + use_long_xml_tags=None): # assert self._root is not None if not method: method = "xml" @@ -864,9 +891,25 @@ if method == "text": _serialize_text(write, self._root) else: + old_force_long_close = None + old_long_close_propagate = None + if method == "xml": + if use_long_xml_tags is not None: + old_force_long_close = self._root.force_long_close + old_long_close_propagate = self._root.long_close_propagate + if use_long_xml_tags is True: + self._root.force_long_close = True + self._root.long_close_propagate = True + elif use_long_xml_tags is False: + self._root.force_long_close = False + self._root.long_close_propagate = True qnames, namespaces = _namespaces(self._root, default_namespace) serialize = _serialize[method] serialize(write, self._root, qnames, namespaces) + if old_force_long_close is not None: + self._root.force_long_close = old_force_long_close + if old_long_close_propagate is not None: + self._root.long_close_propagate = old_long_close_propagate if file_or_filename is not file: file.close() @@ -955,7 +998,18 @@ if text: write(_escape_cdata(text)) for e in elem: + old_force_long_close = None + old_long_close_propagate = None + if elem.long_close_propagate is True and e.parent_can_override is True: + old_force_long_close = e.force_long_close + old_long_close_propagate = e.long_close_propagate + e.force_long_close = elem.force_long_close + e.long_close_propagate = elem.long_close_propagate _serialize_xml(write, e, qnames, None) + if old_force_long_close is not None: + e.force_long_close = old_force_long_close + if old_long_close_propagate is not None: + e.long_close_propagate = old_long_close_propagate else: write("<" + tag) items = list(elem.items()) @@ -977,12 +1031,23 @@ else: v = _escape_attrib(v) write(" %s=\"%s\"" % (qnames[k], v)) - if text or len(elem): + if text or len(elem) or elem.force_long_close: write(">") if text: write(_escape_cdata(text)) for e in elem: + old_force_long_close = None + old_long_close_propagate = None + if elem.long_close_propagate is True and e.parent_can_override is True: + old_force_long_close = e.force_long_close + old_long_close_propagate = e.long_close_propagate + e.force_long_close = elem.force_long_close + e.long_close_propagate = elem.long_close_propagate _serialize_xml(write, e, qnames, None) + if old_force_long_close is not None: + e.force_long_close = old_force_long_close + if old_long_close_propagate is not None: + e.long_close_propagate = old_long_close_propagate write("") else: write(" />") --- pysrc/orig/cpython/Modules/_elementtree.c Tue Jun 12 20:03:15 2012 +++ pysrc/mod/cpython/Modules/_elementtree.c Tue Jun 12 21:10:42 2012 @@ -238,6 +238,12 @@ PyObject *weakreflist; /* For tp_weaklistoffset */ + PyObject* force_long_close; + + PyObject* long_close_propagate; + + PyObject* parent_can_override; + } ElementObject; static PyTypeObject Element_Type; @@ -264,6 +270,15 @@ self->extra->allocated = STATIC_CHILDREN; self->extra->children = self->extra->_children; + Py_INCREF(Py_False); + self->force_long_close = Py_False; + + Py_INCREF(Py_False); + self->long_close_propagate = Py_False; + + Py_INCREF(Py_True); + self->parent_can_override = Py_True; + return 0; } @@ -290,6 +305,12 @@ PyObject_Free(myextra->children); PyObject_Free(myextra); + + Py_DECREF(self->force_long_close); + + Py_DECREF(self->long_close_propagate); + + Py_DECREF(self->parent_can_override); } /* Convenience internal function to create new Element objects with the given @@ -323,6 +344,15 @@ self->weakreflist = NULL; + Py_INCREF(Py_False); + self->force_long_close = Py_False; + + Py_INCREF(Py_False); + self->long_close_propagate = Py_False; + + Py_INCREF(Py_True); + self->parent_can_override = Py_True; + ALLOC(sizeof(ElementObject), "create element"); PyObject_GC_Track(self); return (PyObject*) self; @@ -344,6 +374,15 @@ e->extra = NULL; e->weakreflist = NULL; + + Py_INCREF(Py_False); + e->force_long_close = Py_False; + + Py_INCREF(Py_False); + e->long_close_propagate = Py_False; + + Py_INCREF(Py_True); + e->parent_can_override = Py_True; } return (PyObject *)e; } @@ -753,6 +792,18 @@ element->extra->length = self->extra->length; } + + Py_DECREF(JOIN_OBJ(element->force_long_close)); + element->force_long_close = self->force_long_close; + Py_INCREF(JOIN_OBJ(element->force_long_close)); + + Py_DECREF(JOIN_OBJ(element->long_close_propagate)); + element->long_close_propagate = self->long_close_propagate; + Py_INCREF(JOIN_OBJ(element->long_close_propagate)); + + Py_DECREF(JOIN_OBJ(element->parent_can_override)); + element->parent_can_override = self->parent_can_override; + Py_INCREF(JOIN_OBJ(element->parent_can_override)); return (PyObject*) element; } --- pysrc/orig/jython/Lib/xml/etree/ElementTree.py Tue Jun 12 16:07:51 2012 +++ pysrc/mod/jython/Lib/xml/etree/ElementTree.py Tue Jun 12 16:07:51 2012 @@ -187,10 +187,33 @@ tail = None # text after end tag, if any + ## + # (Attribute) Whether or not the element's tag should be closed + # using the long method regardless of whether or not it would be + # possible to close the tag with ' />'. Used by ElementTree only. + + force_long_close = False + + ## + # (Attribute) Whether or not the closing tag preference above + # should propagate to child elements. Used by ElementTree only. + + long_close_propagate = False + + ## + # (Attribute) Whether or not a parent may override this element's + # force_long_close or long_close_propagate values. + # Used by ElemenentTree only + + parent_can_override = True + def __init__(self, tag, attrib): self.tag = tag self.attrib = attrib self._children = [] + self.force_long_close = False + self.long_close_propagate = False + self.parent_can_override = True def __repr__(self): return "" % (self.tag, id(self)) @@ -657,7 +680,7 @@ # @param file A file name, or a file object opened for writing. # @param encoding Optional output encoding (default is US-ASCII). - def write(self, file, encoding="us-ascii"): + def write(self, file, encoding="us-ascii", use_long_xml_tags=None): assert self._root is not None managed_file = not hasattr(file, "write") if managed_file: @@ -667,7 +690,23 @@ encoding = "us-ascii" elif encoding != "utf-8" and encoding != "us-ascii": file.write("\n" % encoding) + old_force_long_close = None + old_long_close_propagate = None + if use_long_xml_tags is not None: + old_force_long_close = self._root.force_long_close + old_long_close_propagate = self._root.long_close_propagate + if use_long_xml_tags is True: + self._root.force_long_close = True + self._root.long_close_propagate = True + elif use_long_xml_tags is False: + self._root.force_long_close = False + self._root.long_close_propagate = True self._write(file, self._root, encoding, {}) + if old_force_long_close is not None: + self._root.force_long_close = old_force_long_close + if old_long_close_propagate is not None: + self._root.long_close_propagate = old_long_close_propagate + finally: if managed_file: file.close() @@ -709,12 +748,23 @@ for k, v in xmlns_items: file.write(" %s=\"%s\"" % (_encode(k, encoding), _escape_attrib(v, encoding))) - if node.text or len(node): + if node.text or len(node) or node.force_long_close: file.write(">") if node.text: file.write(_escape_cdata(node.text, encoding)) for n in node: + old_force_long_close = None + old_long_close_propagate = None + if node.long_close_propagate is True and n.parent_can_override is True: + old_force_long_close = n.force_long_close + old_long_close_propagate = n.long_close_propagate + n.force_long_close = node.force_long_close + n.long_close_propagate = node.long_close_propagate self._write(file, n, encoding, namespaces) + if old_force_long_close is not None: + n.force_long_close = old_force_long_close + if old_long_close_propagate is not None: + n.long_close_propagate = old_long_close_propagate file.write("") else: file.write(" />") --- pysrc/orig/stackless/Lib/xml/etree/ElementTree.py Tue Jun 12 16:08:37 2012 +++ pysrc/mod/stackless/Lib/xml/etree/ElementTree.py Tue Jun 12 16:08:37 2012 @@ -202,6 +202,26 @@ tail = None # text after end tag, if any + ## + # (Attribute) Whether or not the element's tag should be closed + # using the long method regardless of whether or not it would be + # possible to close the tag with ' />'. Used by ElementTree only. + + force_long_close = False + + ## + # (Attribute) Whether or not the closing tag preference above + # should propagate to child elements. Used by ElementTree only. + + long_close_propagate = False + + ## + # (Attribute) Whether or not a parent may override this element's + # force_long_close or long_close_propagate values. + # Used by ElemenentTree only + + parent_can_override = True + # constructor def __init__(self, tag, attrib={}, **extra): @@ -210,6 +230,9 @@ self.tag = tag self.attrib = attrib self._children = [] + self.force_long_close = False + self.long_close_propagate = False + self.parent_can_override = True def __repr__(self): return "" % (repr(self.tag), id(self)) @@ -235,6 +258,9 @@ elem.text = self.text elem.tail = self.tail elem[:] = self + elem.force_long_close = self.force_long_close + elem.long_close_propagate = self.long_close_propagate + elem.parent_can_override = self.parent_can_override return elem ## @@ -813,7 +839,8 @@ encoding=None, xml_declaration=None, default_namespace=None, - method=None): + method=None, + use_long_xml_tags=None): # assert self._root is not None if not method: method = "xml" @@ -857,9 +884,25 @@ if method == "text": _serialize_text(write, self._root) else: + old_force_long_close = None + old_long_close_propagate = None + if method == "xml": + if use_long_xml_tags is not None: + old_force_long_close = self._root.force_long_close + old_long_close_propagate = self._root.long_close_propagate + if use_long_xml_tags is True: + self._root.force_long_close = True + self._root.long_close_propagate = True + elif use_long_xml_tags is False: + self._root.force_long_close = False + self._root.long_close_propagate = True qnames, namespaces = _namespaces(self._root, default_namespace) serialize = _serialize[method] serialize(write, self._root, qnames, namespaces) + if old_force_long_close is not None: + self._root.force_long_close = old_force_long_close + if old_long_close_propagate is not None: + self._root.long_close_propagate = old_long_close_propagate if file_or_filename is not file: file.close() @@ -948,7 +991,18 @@ if text: write(_escape_cdata(text)) for e in elem: + old_force_long_close = None + old_long_close_propagate = None + if elem.long_close_propagate is True and e.parent_can_override is True: + old_force_long_close = e.force_long_close + old_long_close_propagate = e.long_close_propagate + e.force_long_close = elem.force_long_close + e.long_close_propagate = elem.long_close_propagate _serialize_xml(write, e, qnames, None) + if old_force_long_close is not None: + e.force_long_close = old_force_long_close + if old_long_close_propagate is not None: + e.long_close_propagate = old_long_close_propagate else: write("<" + tag) items = list(elem.items()) @@ -970,12 +1024,23 @@ else: v = _escape_attrib(v) write(" %s=\"%s\"" % (qnames[k], v)) - if text or len(elem): + if text or len(elem) or elem.force_long_close: write(">") if text: write(_escape_cdata(text)) for e in elem: + old_force_long_close = None + old_long_close_propagate = None + if elem.long_close_propagate is True and e.parent_can_override is True: + old_force_long_close = e.force_long_close + old_long_close_propagate = e.long_close_propagate + e.force_long_close = elem.force_long_close + e.long_close_propagate = elem.long_close_propagate _serialize_xml(write, e, qnames, None) + if old_force_long_close is not None: + e.force_long_close = old_force_long_close + if old_long_close_propagate is not None: + e.long_close_propagate = old_long_close_propagate write("") else: write(" />") --- pysrc/orig/stackless/Modules/_elementtree.c Tue Jun 12 20:04:13 2012 +++ pysrc/mod/stackless/Modules/_elementtree.c Tue Jun 12 20:04:13 2012 @@ -249,6 +249,12 @@ ElementObjectExtra* extra; + PyObject* force_long_close; + + PyObject* long_close_propagate; + + PyObject* parent_can_override; + } ElementObject; static PyTypeObject Element_Type; @@ -275,6 +281,15 @@ self->extra->allocated = STATIC_CHILDREN; self->extra->children = self->extra->_children; + Py_INCREF(Py_False); + self->force_long_close = Py_False; + + Py_INCREF(Py_False); + self->long_close_propagate = Py_False; + + Py_INCREF(Py_True); + self->parent_can_override = Py_True; + return 0; } @@ -292,6 +307,12 @@ PyObject_Free(self->extra->children); PyObject_Free(self->extra); + + Py_DECREF(self->force_long_close); + + Py_DECREF(self->long_close_propagate); + + Py_DECREF(self->parent_can_override); } LOCAL(PyObject*) @@ -331,6 +352,15 @@ Py_INCREF(Py_None); self->tail = Py_None; + Py_INCREF(Py_False); + self->force_long_close = Py_False; + + Py_INCREF(Py_False); + self->long_close_propagate = Py_False; + + Py_INCREF(Py_True); + self->parent_can_override = Py_True; + ALLOC(sizeof(ElementObject), "create element"); return (PyObject*) self; @@ -620,6 +650,18 @@ element->extra->length = self->extra->length; } + + Py_DECREF(JOIN_OBJ(element->force_long_close)); + element->force_long_close = self->force_long_close; + Py_INCREF(JOIN_OBJ(element->force_long_close)); + + Py_DECREF(JOIN_OBJ(element->long_close_propagate)); + element->long_close_propagate = self->long_close_propagate; + Py_INCREF(JOIN_OBJ(element->long_close_propagate)); + + Py_DECREF(JOIN_OBJ(element->parent_can_override)); + element->parent_can_override = self->parent_can_override; + Py_INCREF(JOIN_OBJ(element->parent_can_override)); return (PyObject*) element; }