| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  | """\
 | 
					
						
							| 
									
										
										
										
											2000-12-14 18:16:11 +00:00
										 |  |  | minidom.py -- a lightweight DOM implementation. | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-07-21 22:05:49 +00:00
										 |  |  | parse( "foo.xml" ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | parseString( "<foo><bar/></foo>" ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | Todo: | 
					
						
							|  |  |  | ===== | 
					
						
							|  |  |  |  * convenience methods for getting elements and text. | 
					
						
							|  |  |  |  * more testing | 
					
						
							|  |  |  |  * bring some of the writer and linearizer code into conformance with this | 
					
						
							|  |  |  |         interface | 
					
						
							|  |  |  |  * SAX 2 namespaces | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  | import string | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  | _string = string | 
					
						
							|  |  |  | del string | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-12-31 03:50:23 +00:00
										 |  |  | from xml.dom import HierarchyRequestErr | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  | # localize the types, and allow support for Unicode values if available: | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  | import types | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  | _TupleType = types.TupleType | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     _StringTypes = (types.StringType, types.UnicodeType) | 
					
						
							|  |  |  | except AttributeError: | 
					
						
							|  |  |  |     _StringTypes = (types.StringType,) | 
					
						
							|  |  |  | del types | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-12-14 18:16:11 +00:00
										 |  |  | import xml.dom | 
					
						
							|  |  |  | _Node = xml.dom.Node | 
					
						
							|  |  |  | del xml | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-12-14 18:16:11 +00:00
										 |  |  | class Node(_Node): | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     allnodes = {} | 
					
						
							|  |  |  |     _debug = 0 | 
					
						
							|  |  |  |     _makeParentNodes = 1 | 
					
						
							|  |  |  |     debug = None | 
					
						
							| 
									
										
										
										
											2000-12-31 03:50:23 +00:00
										 |  |  |     childNodeTypes = () | 
					
						
							|  |  |  |      | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def __init__(self): | 
					
						
							|  |  |  |         self.childNodes = [] | 
					
						
							| 
									
										
										
										
											2000-12-20 14:47:24 +00:00
										 |  |  |         self.parentNode = None | 
					
						
							| 
									
										
										
										
											2000-10-23 18:09:50 +00:00
										 |  |  |         if Node._debug: | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |             index = repr(id(self)) + repr(self.__class__) | 
					
						
							|  |  |  |             Node.allnodes[index] = repr(self.__dict__) | 
					
						
							|  |  |  |             if Node.debug is None: | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |                 Node.debug = _get_StringIO() | 
					
						
							| 
									
										
										
										
											2000-07-04 03:39:33 +00:00
										 |  |  |                 #open( "debug4.out", "w" ) | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |             Node.debug.write("create %s\n" % index) | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def __getattr__(self, key): | 
					
						
							|  |  |  |         if key[0:2] == "__": | 
					
						
							| 
									
										
										
										
											2000-12-14 18:16:11 +00:00
										 |  |  |             raise AttributeError, key | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |         # getattr should never call getattr! | 
					
						
							| 
									
										
										
										
											2000-10-23 18:09:50 +00:00
										 |  |  |         if self.__dict__.has_key("inGetAttr"): | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |             del self.inGetAttr | 
					
						
							|  |  |  |             raise AttributeError, key | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |         prefix, attrname = key[:5], key[5:] | 
					
						
							|  |  |  |         if prefix == "_get_": | 
					
						
							|  |  |  |             self.inGetAttr = 1 | 
					
						
							| 
									
										
										
										
											2000-10-23 18:09:50 +00:00
										 |  |  |             if hasattr(self, attrname): | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |                 del self.inGetAttr | 
					
						
							| 
									
										
										
										
											2000-10-23 18:09:50 +00:00
										 |  |  |                 return (lambda self=self, attrname=attrname: | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |                                 getattr(self, attrname)) | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |             else: | 
					
						
							|  |  |  |                 del self.inGetAttr | 
					
						
							|  |  |  |                 raise AttributeError, key | 
					
						
							|  |  |  |         else: | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |             self.inGetAttr = 1 | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |             try: | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |                 func = getattr(self, "_get_" + key) | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |             except AttributeError: | 
					
						
							|  |  |  |                 raise AttributeError, key | 
					
						
							|  |  |  |             del self.inGetAttr | 
					
						
							|  |  |  |             return func() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def __nonzero__(self): | 
					
						
							|  |  |  |         return 1 | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def toxml(self): | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |         writer = _get_StringIO() | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |         self.writexml(writer) | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |         return writer.getvalue() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def hasChildNodes(self): | 
					
						
							|  |  |  |         if self.childNodes: | 
					
						
							|  |  |  |             return 1 | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             return 0 | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def _get_firstChild(self): | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |         if self.childNodes: | 
					
						
							|  |  |  |             return self.childNodes[0] | 
					
						
							| 
									
										
										
										
											2000-07-01 04:58:47 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def _get_lastChild(self): | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |         if self.childNodes: | 
					
						
							|  |  |  |             return self.childNodes[-1] | 
					
						
							| 
									
										
										
										
											2000-07-01 04:58:47 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def insertBefore(self, newChild, refChild): | 
					
						
							| 
									
										
										
										
											2000-12-31 03:50:23 +00:00
										 |  |  |         if newChild.nodeType not in self.childNodeTypes: | 
					
						
							|  |  |  |             raise HierarchyRequestErr, \ | 
					
						
							|  |  |  |                   "%s cannot be child of %s" % (repr(newChild), repr(self) ) | 
					
						
							| 
									
										
										
										
											2000-12-20 14:47:24 +00:00
										 |  |  |         if newChild.parentNode is not None: | 
					
						
							|  |  |  |             newChild.parentNode.removeChild(newChild) | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |         if refChild is None: | 
					
						
							|  |  |  |             self.appendChild(newChild) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             index = self.childNodes.index(refChild) | 
					
						
							|  |  |  |             self.childNodes.insert(index, newChild) | 
					
						
							|  |  |  |             newChild.nextSibling = refChild | 
					
						
							|  |  |  |             refChild.previousSibling = newChild | 
					
						
							|  |  |  |             if index: | 
					
						
							|  |  |  |                 node = self.childNodes[index-1] | 
					
						
							|  |  |  |                 node.nextSibling = newChild | 
					
						
							|  |  |  |                 newChild.previousSibling = node | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 newChild.previousSibling = None | 
					
						
							|  |  |  |             if self._makeParentNodes: | 
					
						
							|  |  |  |                 newChild.parentNode = self | 
					
						
							|  |  |  |         return newChild | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def appendChild(self, node): | 
					
						
							| 
									
										
										
										
											2000-12-31 03:50:23 +00:00
										 |  |  |         if node.nodeType not in self.childNodeTypes: | 
					
						
							|  |  |  |             raise HierarchyRequestErr, \ | 
					
						
							|  |  |  |                   "%s cannot be child of %s" % (repr(node), repr(self) ) | 
					
						
							| 
									
										
										
										
											2000-12-20 14:47:24 +00:00
										 |  |  |         if node.parentNode is not None: | 
					
						
							|  |  |  |             node.parentNode.removeChild(node) | 
					
						
							| 
									
										
										
										
											2000-10-09 20:04:16 +00:00
										 |  |  |         if self.childNodes: | 
					
						
							|  |  |  |             last = self.lastChild | 
					
						
							|  |  |  |             node.previousSibling = last | 
					
						
							|  |  |  |             last.nextSibling = node | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             node.previousSibling = None | 
					
						
							|  |  |  |         node.nextSibling = None | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |         self.childNodes.append(node) | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |         if self._makeParentNodes: | 
					
						
							|  |  |  |             node.parentNode = self | 
					
						
							| 
									
										
										
										
											2000-07-01 04:58:47 +00:00
										 |  |  |         return node | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def replaceChild(self, newChild, oldChild): | 
					
						
							| 
									
										
										
										
											2000-12-31 03:50:23 +00:00
										 |  |  |         if newChild.nodeType not in self.childNodeTypes: | 
					
						
							|  |  |  |             raise HierarchyRequestErr, \ | 
					
						
							|  |  |  |                   "%s cannot be child of %s" % (repr(newChild), repr(self) ) | 
					
						
							| 
									
										
										
										
											2000-12-20 14:47:24 +00:00
										 |  |  |         if newChild.parentNode is not None: | 
					
						
							|  |  |  |             newChild.parentNode.removeChild(newChild) | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |         if newChild is oldChild: | 
					
						
							|  |  |  |             return | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |         index = self.childNodes.index(oldChild) | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |         self.childNodes[index] = newChild | 
					
						
							|  |  |  |         if self._makeParentNodes: | 
					
						
							|  |  |  |             newChild.parentNode = self | 
					
						
							|  |  |  |             oldChild.parentNode = None | 
					
						
							|  |  |  |         newChild.nextSibling = oldChild.nextSibling | 
					
						
							|  |  |  |         newChild.previousSibling = oldChild.previousSibling | 
					
						
							| 
									
										
										
										
											2000-12-28 18:40:56 +00:00
										 |  |  |         oldChild.nextSibling = None | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |         oldChild.previousSibling = None | 
					
						
							| 
									
										
										
										
											2000-12-28 18:40:56 +00:00
										 |  |  |         if newChild.previousSibling: | 
					
						
							|  |  |  |             newChild.previousSibling.nextSibling = newChild | 
					
						
							|  |  |  |         if newChild.nextSibling: | 
					
						
							|  |  |  |             newChild.nextSibling.previousSibling = newChild | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |         return oldChild | 
					
						
							| 
									
										
										
										
											2000-07-01 04:58:47 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def removeChild(self, oldChild): | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |         self.childNodes.remove(oldChild) | 
					
						
							| 
									
										
										
										
											2000-12-20 14:47:24 +00:00
										 |  |  |         if oldChild.nextSibling is not None: | 
					
						
							|  |  |  |             oldChild.nextSibling.previousSibling = oldChild.previousSibling | 
					
						
							|  |  |  |         if oldChild.previousSibling is not None: | 
					
						
							|  |  |  |             oldChild.previousSibling.nextSibling = oldChild.nextSibling             | 
					
						
							|  |  |  |         oldChild.nextSibling = oldChild.previousSibling = None | 
					
						
							|  |  |  |          | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |         if self._makeParentNodes: | 
					
						
							|  |  |  |             oldChild.parentNode = None | 
					
						
							|  |  |  |         return oldChild | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def normalize(self): | 
					
						
							| 
									
										
										
										
											2000-12-14 18:16:11 +00:00
										 |  |  |         L = [] | 
					
						
							|  |  |  |         for child in self.childNodes: | 
					
						
							|  |  |  |             if child.nodeType == Node.TEXT_NODE: | 
					
						
							|  |  |  |                 data = child.data | 
					
						
							|  |  |  |                 if data and L and L[-1].nodeType == child.nodeType: | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |                     # collapse text node | 
					
						
							|  |  |  |                     node = L[-1] | 
					
						
							|  |  |  |                     node.data = node.nodeValue = node.data + child.data | 
					
						
							|  |  |  |                     node.nextSibling = child.nextSibling | 
					
						
							|  |  |  |                     child.unlink() | 
					
						
							| 
									
										
										
										
											2000-12-14 18:16:11 +00:00
										 |  |  |                 elif data: | 
					
						
							|  |  |  |                     if L: | 
					
						
							|  |  |  |                         L[-1].nextSibling = child | 
					
						
							|  |  |  |                         child.previousSibling = L[-1] | 
					
						
							|  |  |  |                     else: | 
					
						
							|  |  |  |                         child.previousSibling = None | 
					
						
							|  |  |  |                     L.append(child) | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |                 else: | 
					
						
							| 
									
										
										
										
											2000-12-14 18:16:11 +00:00
										 |  |  |                     # empty text node; discard | 
					
						
							|  |  |  |                     child.unlink() | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 if L: | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |                     L[-1].nextSibling = child | 
					
						
							|  |  |  |                     child.previousSibling = L[-1] | 
					
						
							| 
									
										
										
										
											2000-12-14 18:16:11 +00:00
										 |  |  |                 else: | 
					
						
							|  |  |  |                     child.previousSibling = None | 
					
						
							|  |  |  |                 L.append(child) | 
					
						
							|  |  |  |                 if child.nodeType == Node.ELEMENT_NODE: | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |                     child.normalize() | 
					
						
							| 
									
										
										
										
											2000-12-14 18:16:11 +00:00
										 |  |  |         self.childNodes[:] = L | 
					
						
							| 
									
										
										
										
											2000-07-01 04:58:47 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def cloneNode(self, deep): | 
					
						
							| 
									
										
										
										
											2000-07-01 04:58:47 +00:00
										 |  |  |         import new | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |         clone = new.instance(self.__class__, self.__dict__.copy()) | 
					
						
							|  |  |  |         if self._makeParentNodes: | 
					
						
							|  |  |  |             clone.parentNode = None | 
					
						
							|  |  |  |         clone.childNodes = [] | 
					
						
							|  |  |  |         if deep: | 
					
						
							|  |  |  |             for child in self.childNodes: | 
					
						
							|  |  |  |                 clone.appendChild(child.cloneNode(1)) | 
					
						
							| 
									
										
										
										
											2000-07-01 04:58:47 +00:00
										 |  |  |         return clone | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def unlink(self): | 
					
						
							|  |  |  |         self.parentNode = None | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |         for child in self.childNodes: | 
					
						
							|  |  |  |             child.unlink() | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |         self.childNodes = None | 
					
						
							| 
									
										
										
										
											2000-10-13 20:11:42 +00:00
										 |  |  |         self.previousSibling = None | 
					
						
							|  |  |  |         self.nextSibling = None | 
					
						
							| 
									
										
										
										
											2000-07-01 04:58:47 +00:00
										 |  |  |         if Node._debug: | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |             index = repr(id(self)) + repr(self.__class__) | 
					
						
							|  |  |  |             self.debug.write("Deleting: %s\n" % index) | 
					
						
							| 
									
										
										
										
											2000-07-01 04:58:47 +00:00
										 |  |  |             del Node.allnodes[index] | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  | def _write_data(writer, data): | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |     "Writes datachars to writer." | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |     replace = _string.replace | 
					
						
							|  |  |  |     data = replace(data, "&", "&") | 
					
						
							|  |  |  |     data = replace(data, "<", "<") | 
					
						
							|  |  |  |     data = replace(data, "\"", """) | 
					
						
							|  |  |  |     data = replace(data, ">", ">") | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |     writer.write(data) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  | def _getElementsByTagNameHelper(parent, name, rc): | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |     for node in parent.childNodes: | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |         if node.nodeType == Node.ELEMENT_NODE and \ | 
					
						
							|  |  |  |             (name == "*" or node.tagName == name): | 
					
						
							|  |  |  |             rc.append(node) | 
					
						
							|  |  |  |         _getElementsByTagNameHelper(node, name, rc) | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |     return rc | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  | def _getElementsByTagNameNSHelper(parent, nsURI, localName, rc): | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |     for node in parent.childNodes: | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |         if node.nodeType == Node.ELEMENT_NODE: | 
					
						
							|  |  |  |             if ((localName == "*" or node.tagName == localName) and | 
					
						
							|  |  |  |                 (nsURI == "*" or node.namespaceURI == nsURI)): | 
					
						
							|  |  |  |                 rc.append(node) | 
					
						
							| 
									
										
										
										
											2000-12-14 18:16:11 +00:00
										 |  |  |             _getElementsByTagNameNSHelper(node, nsURI, localName, rc) | 
					
						
							|  |  |  |     return rc | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | class Attr(Node): | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     nodeType = Node.ATTRIBUTE_NODE | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |     attributes = None | 
					
						
							|  |  |  |     ownerElement = None | 
					
						
							| 
									
										
										
										
											2000-12-31 03:50:23 +00:00
										 |  |  |     childNodeTypes = (Node.TEXT_NODE, Node.ENTITY_REFERENCE_NODE) | 
					
						
							|  |  |  |      | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def __init__(self, qName, namespaceURI="", localName=None, prefix=None): | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |         # skip setattr for performance | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |         d = self.__dict__ | 
					
						
							|  |  |  |         d["localName"] = localName or qName | 
					
						
							|  |  |  |         d["nodeName"] = d["name"] = qName | 
					
						
							|  |  |  |         d["namespaceURI"] = namespaceURI | 
					
						
							|  |  |  |         d["prefix"] = prefix | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |         Node.__init__(self) | 
					
						
							| 
									
										
										
										
											2000-07-01 04:58:47 +00:00
										 |  |  |         # nodeValue and value are set elsewhere | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def __setattr__(self, name, value): | 
					
						
							| 
									
										
										
										
											2000-12-14 18:16:11 +00:00
										 |  |  |         d = self.__dict__ | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |         if name in ("value", "nodeValue"): | 
					
						
							| 
									
										
										
										
											2000-12-14 18:16:11 +00:00
										 |  |  |             d["value"] = d["nodeValue"] = value | 
					
						
							|  |  |  |         elif name in ("name", "nodeName"): | 
					
						
							|  |  |  |             d["name"] = d["nodeName"] = value | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |         else: | 
					
						
							| 
									
										
										
										
											2000-12-14 18:16:11 +00:00
										 |  |  |             d[name] = value | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |     def cloneNode(self, deep): | 
					
						
							|  |  |  |         clone = Node.cloneNode(self, deep) | 
					
						
							|  |  |  |         if clone.__dict__.has_key("ownerElement"): | 
					
						
							|  |  |  |             del clone.ownerElement | 
					
						
							|  |  |  |         return clone | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-12-14 18:16:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | class NamedNodeMap: | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |     """The attribute list is a transient interface to the underlying
 | 
					
						
							|  |  |  |     dictionaries.  Mutations here will change the underlying element's | 
					
						
							| 
									
										
										
										
											2000-12-14 18:16:11 +00:00
										 |  |  |     dictionary. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Ordering is imposed artificially and does not reflect the order of | 
					
						
							|  |  |  |     attributes as found in an input document. | 
					
						
							|  |  |  |     """
 | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def __init__(self, attrs, attrsNS): | 
					
						
							|  |  |  |         self._attrs = attrs | 
					
						
							|  |  |  |         self._attrsNS = attrsNS | 
					
						
							| 
									
										
										
										
											2000-12-14 18:16:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def __getattr__(self, name): | 
					
						
							|  |  |  |         if name == "length": | 
					
						
							|  |  |  |             return len(self._attrs) | 
					
						
							|  |  |  |         raise AttributeError, name | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def item(self, index): | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |         try: | 
					
						
							| 
									
										
										
										
											2000-12-14 18:16:11 +00:00
										 |  |  |             return self[self._attrs.keys()[index]] | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |         except IndexError: | 
					
						
							|  |  |  |             return None | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def items(self): | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |         L = [] | 
					
						
							|  |  |  |         for node in self._attrs.values(): | 
					
						
							|  |  |  |             L.append((node.tagName, node.value)) | 
					
						
							|  |  |  |         return L | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def itemsNS(self): | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |         L = [] | 
					
						
							|  |  |  |         for node in self._attrs.values(): | 
					
						
							|  |  |  |             L.append(((node.URI, node.localName), node.value)) | 
					
						
							|  |  |  |         return L | 
					
						
							| 
									
										
										
										
											2000-10-23 18:09:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def keys(self): | 
					
						
							| 
									
										
										
										
											2000-07-01 04:58:47 +00:00
										 |  |  |         return self._attrs.keys() | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def keysNS(self): | 
					
						
							| 
									
										
										
										
											2000-07-01 04:58:47 +00:00
										 |  |  |         return self._attrsNS.keys() | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def values(self): | 
					
						
							| 
									
										
										
										
											2000-07-01 04:58:47 +00:00
										 |  |  |         return self._attrs.values() | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def __len__(self): | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |         return self.length | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def __cmp__(self, other): | 
					
						
							|  |  |  |         if self._attrs is getattr(other, "_attrs", None): | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |             return 0 | 
					
						
							| 
									
										
										
										
											2000-10-23 18:09:50 +00:00
										 |  |  |         else: | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |             return cmp(id(self), id(other)) | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     #FIXME: is it appropriate to return .value? | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def __getitem__(self, attname_or_tuple): | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |         if type(attname_or_tuple) is _TupleType: | 
					
						
							| 
									
										
										
										
											2000-07-01 04:58:47 +00:00
										 |  |  |             return self._attrsNS[attname_or_tuple] | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |         else: | 
					
						
							| 
									
										
										
										
											2000-07-01 04:58:47 +00:00
										 |  |  |             return self._attrs[attname_or_tuple] | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-07-01 19:21:47 +00:00
										 |  |  |     # same as set | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def __setitem__(self, attname, value): | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |         if type(value) in _StringTypes: | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |             node = Attr(attname) | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |             node.value = value | 
					
						
							| 
									
										
										
										
											2000-07-01 19:21:47 +00:00
										 |  |  |         else: | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |             if not isinstance(value, Attr): | 
					
						
							|  |  |  |                 raise TypeError, "value must be a string or Attr object" | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |             node = value | 
					
						
							| 
									
										
										
										
											2000-12-14 18:16:11 +00:00
										 |  |  |         self.setNamedItem(node) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def setNamedItem(self, node): | 
					
						
							|  |  |  |         old = self._attrs.get(node.name) | 
					
						
							| 
									
										
										
										
											2000-07-01 19:21:47 +00:00
										 |  |  |         if old: | 
					
						
							|  |  |  |             old.unlink() | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |         self._attrs[node.name] = node | 
					
						
							|  |  |  |         self._attrsNS[(node.namespaceURI, node.localName)] = node | 
					
						
							| 
									
										
										
										
											2000-12-14 18:16:11 +00:00
										 |  |  |         return old | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def setNamedItemNS(self, node): | 
					
						
							|  |  |  |         return self.setNamedItem(node) | 
					
						
							| 
									
										
										
										
											2000-07-01 04:58:47 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def __delitem__(self, attname_or_tuple): | 
					
						
							|  |  |  |         node = self[attname_or_tuple] | 
					
						
							| 
									
										
										
										
											2000-07-01 04:58:47 +00:00
										 |  |  |         node.unlink() | 
					
						
							|  |  |  |         del self._attrs[node.name] | 
					
						
							|  |  |  |         del self._attrsNS[(node.namespaceURI, node.localName)] | 
					
						
							| 
									
										
										
										
											2000-12-14 18:16:11 +00:00
										 |  |  |         self.length = len(self._attrs) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | AttributeList = NamedNodeMap | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-10-07 12:10:28 +00:00
										 |  |  | class Element(Node): | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     nodeType = Node.ELEMENT_NODE | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |     nextSibling = None | 
					
						
							|  |  |  |     previousSibling = None | 
					
						
							| 
									
										
										
										
											2000-12-31 03:50:23 +00:00
										 |  |  |     childNodeTypes = (Node.ELEMENT_NODE, Node.PROCESSING_INSTRUCTION_NODE, | 
					
						
							|  |  |  |                       Node.COMMENT_NODE, Node.TEXT_NODE, | 
					
						
							|  |  |  |                       Node.CDATA_SECTION_NODE, Node.ENTITY_REFERENCE_NODE) | 
					
						
							|  |  |  |      | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def __init__(self, tagName, namespaceURI="", prefix="", | 
					
						
							|  |  |  |                  localName=None): | 
					
						
							|  |  |  |         Node.__init__(self) | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |         self.tagName = self.nodeName = tagName | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |         self.localName = localName or tagName | 
					
						
							|  |  |  |         self.prefix = prefix | 
					
						
							|  |  |  |         self.namespaceURI = namespaceURI | 
					
						
							|  |  |  |         self.nodeValue = None | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |         self._attrs = {}   # attributes are double-indexed: | 
					
						
							|  |  |  |         self._attrsNS = {} #    tagName -> Attribute | 
					
						
							|  |  |  |                            #    URI,localName -> Attribute | 
					
						
							|  |  |  |                            # in the future: consider lazy generation | 
					
						
							|  |  |  |                            # of attribute objects this is too tricky | 
					
						
							|  |  |  |                            # for now because of headaches with | 
					
						
							|  |  |  |                            # namespaces. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def cloneNode(self, deep): | 
					
						
							|  |  |  |         clone = Node.cloneNode(self, deep) | 
					
						
							|  |  |  |         clone._attrs = {} | 
					
						
							|  |  |  |         clone._attrsNS = {} | 
					
						
							|  |  |  |         for attr in self._attrs.values(): | 
					
						
							|  |  |  |             node = attr.cloneNode(1) | 
					
						
							|  |  |  |             clone._attrs[node.name] = node | 
					
						
							|  |  |  |             clone._attrsNS[(node.namespaceURI, node.localName)] = node | 
					
						
							|  |  |  |             node.ownerElement = clone | 
					
						
							|  |  |  |         return clone | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def unlink(self): | 
					
						
							|  |  |  |         for attr in self._attrs.values(): | 
					
						
							|  |  |  |             attr.unlink() | 
					
						
							|  |  |  |         self._attrs = None | 
					
						
							|  |  |  |         self._attrsNS = None | 
					
						
							|  |  |  |         Node.unlink(self) | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def getAttribute(self, attname): | 
					
						
							| 
									
										
										
										
											2000-07-01 04:58:47 +00:00
										 |  |  |         return self._attrs[attname].value | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def getAttributeNS(self, namespaceURI, localName): | 
					
						
							| 
									
										
										
										
											2000-07-01 04:58:47 +00:00
										 |  |  |         return self._attrsNS[(namespaceURI, localName)].value | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def setAttribute(self, attname, value): | 
					
						
							|  |  |  |         attr = Attr(attname) | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |         # for performance | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |         attr.__dict__["value"] = attr.__dict__["nodeValue"] = value | 
					
						
							|  |  |  |         self.setAttributeNode(attr) | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def setAttributeNS(self, namespaceURI, qualifiedName, value): | 
					
						
							|  |  |  |         prefix, localname = _nssplit(qualifiedName) | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |         # for performance | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |         attr = Attr(qualifiedName, namespaceURI, localname, prefix) | 
					
						
							|  |  |  |         attr.__dict__["value"] = attr.__dict__["nodeValue"] = value | 
					
						
							|  |  |  |         self.setAttributeNode(attr) | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def getAttributeNode(self, attrname): | 
					
						
							|  |  |  |         return self._attrs.get(attrname) | 
					
						
							| 
									
										
										
										
											2000-07-01 04:58:47 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def getAttributeNodeNS(self, namespaceURI, localName): | 
					
						
							| 
									
										
										
										
											2000-07-01 04:58:47 +00:00
										 |  |  |         return self._attrsNS[(namespaceURI, localName)] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def setAttributeNode(self, attr): | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |         if attr.ownerElement not in (None, self): | 
					
						
							|  |  |  |             raise ValueError, "attribute node already owned" | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |         old = self._attrs.get(attr.name, None) | 
					
						
							| 
									
										
										
										
											2000-07-01 04:58:47 +00:00
										 |  |  |         if old: | 
					
						
							|  |  |  |             old.unlink() | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |         self._attrs[attr.name] = attr | 
					
						
							|  |  |  |         self._attrsNS[(attr.namespaceURI, attr.localName)] = attr | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # This creates a circular reference, but Element.unlink() | 
					
						
							|  |  |  |         # breaks the cycle since the references to the attribute | 
					
						
							|  |  |  |         # dictionaries are tossed. | 
					
						
							|  |  |  |         attr.ownerElement = self | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if old is not attr: | 
					
						
							|  |  |  |             # It might have already been part of this node, in which case | 
					
						
							|  |  |  |             # it doesn't represent a change, and should not be returned. | 
					
						
							|  |  |  |             return old | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def removeAttribute(self, name): | 
					
						
							| 
									
										
										
										
											2000-07-01 04:58:47 +00:00
										 |  |  |         attr = self._attrs[name] | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |         self.removeAttributeNode(attr) | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def removeAttributeNS(self, namespaceURI, localName): | 
					
						
							| 
									
										
										
										
											2000-07-01 04:58:47 +00:00
										 |  |  |         attr = self._attrsNS[(namespaceURI, localName)] | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |         self.removeAttributeNode(attr) | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def removeAttributeNode(self, node): | 
					
						
							| 
									
										
										
										
											2000-07-01 04:58:47 +00:00
										 |  |  |         node.unlink() | 
					
						
							|  |  |  |         del self._attrs[node.name] | 
					
						
							|  |  |  |         del self._attrsNS[(node.namespaceURI, node.localName)] | 
					
						
							| 
									
										
										
										
											2000-10-23 18:09:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-12-28 18:40:56 +00:00
										 |  |  |     def hasAttribute(self, name): | 
					
						
							|  |  |  |         return self._attrs.has_key(name) | 
					
						
							|  |  |  |                       | 
					
						
							|  |  |  |     def hasAttributeNS(self, namespaceURI, localName): | 
					
						
							|  |  |  |         return self._attrsNS.has_key((namespaceURI, localName))     | 
					
						
							|  |  |  |          | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def getElementsByTagName(self, name): | 
					
						
							|  |  |  |         return _getElementsByTagNameHelper(self, name, []) | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def getElementsByTagNameNS(self, namespaceURI, localName): | 
					
						
							|  |  |  |         _getElementsByTagNameNSHelper(self, namespaceURI, localName, []) | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def __repr__(self): | 
					
						
							|  |  |  |         return "<DOM Element: %s at %s>" % (self.tagName, id(self)) | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def writexml(self, writer): | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |         writer.write("<" + self.tagName) | 
					
						
							| 
									
										
										
										
											2000-10-23 18:09:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |         attrs = self._get_attributes() | 
					
						
							|  |  |  |         a_names = attrs.keys() | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |         a_names.sort() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for a_name in a_names: | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |             writer.write(" %s=\"" % a_name) | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |             _write_data(writer, attrs[a_name].value) | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |             writer.write("\"") | 
					
						
							|  |  |  |         if self.childNodes: | 
					
						
							|  |  |  |             writer.write(">") | 
					
						
							|  |  |  |             for node in self.childNodes: | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |                 node.writexml(writer) | 
					
						
							|  |  |  |             writer.write("</%s>" % self.tagName) | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |         else: | 
					
						
							|  |  |  |             writer.write("/>") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def _get_attributes(self): | 
					
						
							|  |  |  |         return AttributeList(self._attrs, self._attrsNS) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Comment(Node): | 
					
						
							|  |  |  |     nodeType = Node.COMMENT_NODE | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |     nodeName = "#comment" | 
					
						
							|  |  |  |     attributes = None | 
					
						
							| 
									
										
										
										
											2000-12-31 03:50:23 +00:00
										 |  |  |     childNodeTypes = () | 
					
						
							|  |  |  |      | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def __init__(self, data): | 
					
						
							|  |  |  |         Node.__init__(self) | 
					
						
							|  |  |  |         self.data = self.nodeValue = data | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def writexml(self, writer): | 
					
						
							|  |  |  |         writer.write("<!--%s-->" % self.data) | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  | class ProcessingInstruction(Node): | 
					
						
							|  |  |  |     nodeType = Node.PROCESSING_INSTRUCTION_NODE | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |     attributes = None | 
					
						
							| 
									
										
										
										
											2000-12-31 03:50:23 +00:00
										 |  |  |     childNodeTypes = () | 
					
						
							|  |  |  |      | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def __init__(self, target, data): | 
					
						
							|  |  |  |         Node.__init__(self) | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |         self.target = self.nodeName = target | 
					
						
							|  |  |  |         self.data = self.nodeValue = data | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def writexml(self, writer): | 
					
						
							|  |  |  |         writer.write("<?%s %s?>" % (self.target, self.data)) | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  | class Text(Node): | 
					
						
							|  |  |  |     nodeType = Node.TEXT_NODE | 
					
						
							|  |  |  |     nodeName = "#text" | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |     attributes = None | 
					
						
							| 
									
										
										
										
											2000-12-31 03:50:23 +00:00
										 |  |  |     childNodeTypes = () | 
					
						
							|  |  |  |      | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def __init__(self, data): | 
					
						
							|  |  |  |         Node.__init__(self) | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |         self.data = self.nodeValue = data | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __repr__(self): | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |         if len(self.data) > 10: | 
					
						
							|  |  |  |             dotdotdot = "..." | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |         else: | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |             dotdotdot = "" | 
					
						
							|  |  |  |         return "<DOM Text node \"%s%s\">" % (self.data[0:10], dotdotdot) | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-12-14 18:16:11 +00:00
										 |  |  |     def splitText(self, offset): | 
					
						
							|  |  |  |         if offset < 0 or offset > len(self.data): | 
					
						
							|  |  |  |             raise ValueError, "illegal offset value for splitText()" | 
					
						
							|  |  |  |         newText = Text(self.data[offset:]) | 
					
						
							|  |  |  |         next = self.nextSibling | 
					
						
							|  |  |  |         if self.parentNode and self in self.parentNode.childNodes: | 
					
						
							|  |  |  |             if next is None: | 
					
						
							|  |  |  |                 self.parentNode.appendChild(newText) | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 self.parentNode.insertBefore(newText, next) | 
					
						
							|  |  |  |         self.data = self.data[:offset] | 
					
						
							|  |  |  |         return newText | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def writexml(self, writer): | 
					
						
							|  |  |  |         _write_data(writer, self.data) | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  | def _nssplit(qualifiedName): | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |     fields = _string.split(qualifiedName, ':', 1) | 
					
						
							| 
									
										
										
										
											2000-07-01 04:58:47 +00:00
										 |  |  |     if len(fields) == 2: | 
					
						
							|  |  |  |         return fields | 
					
						
							|  |  |  |     elif len(fields) == 1: | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |         return ('', fields[0]) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-12-14 18:16:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | class DocumentType(Node): | 
					
						
							|  |  |  |     nodeType = Node.DOCUMENT_TYPE_NODE | 
					
						
							|  |  |  |     nodeValue = None | 
					
						
							|  |  |  |     attributes = None | 
					
						
							|  |  |  |     name = None | 
					
						
							|  |  |  |     publicId = None | 
					
						
							|  |  |  |     systemId = None | 
					
						
							|  |  |  |     internalSubset = "" | 
					
						
							|  |  |  |     entities = None | 
					
						
							|  |  |  |     notations = None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __init__(self, qualifiedName): | 
					
						
							|  |  |  |         Node.__init__(self) | 
					
						
							|  |  |  |         if qualifiedName: | 
					
						
							|  |  |  |             prefix, localname = _nssplit(qualifiedName) | 
					
						
							|  |  |  |             self.name = localname | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class DOMImplementation: | 
					
						
							|  |  |  |     def hasFeature(self, feature, version): | 
					
						
							|  |  |  |         if version not in ("1.0", "2.0"): | 
					
						
							|  |  |  |             return 0 | 
					
						
							|  |  |  |         feature = _string.lower(feature) | 
					
						
							|  |  |  |         return feature == "core" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def createDocument(self, namespaceURI, qualifiedName, doctype): | 
					
						
							|  |  |  |         if doctype and doctype.parentNode is not None: | 
					
						
							|  |  |  |             raise ValueError, "doctype object owned by another DOM tree" | 
					
						
							|  |  |  |         doc = Document() | 
					
						
							|  |  |  |         if doctype is None: | 
					
						
							|  |  |  |             doctype = self.createDocumentType(qualifiedName, None, None) | 
					
						
							|  |  |  |         if qualifiedName: | 
					
						
							|  |  |  |             prefix, localname = _nssplit(qualifiedName) | 
					
						
							|  |  |  |             if prefix == "xml" \ | 
					
						
							|  |  |  |                and namespaceURI != "http://www.w3.org/XML/1998/namespace": | 
					
						
							|  |  |  |                 raise ValueError, "illegal use of 'xml' prefix" | 
					
						
							|  |  |  |             if prefix and not namespaceURI: | 
					
						
							|  |  |  |                 raise ValueError, "illegal use of prefix without namespaces" | 
					
						
							|  |  |  |         doctype.parentNode = doc | 
					
						
							|  |  |  |         doc.doctype = doctype | 
					
						
							|  |  |  |         doc.implementation = self | 
					
						
							|  |  |  |         return doc | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def createDocumentType(self, qualifiedName, publicId, systemId): | 
					
						
							|  |  |  |         doctype = DocumentType(qualifiedName) | 
					
						
							|  |  |  |         doctype.publicId = publicId | 
					
						
							|  |  |  |         doctype.systemId = systemId | 
					
						
							|  |  |  |         return doctype | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  | class Document(Node): | 
					
						
							|  |  |  |     nodeType = Node.DOCUMENT_NODE | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |     nodeName = "#document" | 
					
						
							|  |  |  |     nodeValue = None | 
					
						
							|  |  |  |     attributes = None | 
					
						
							| 
									
										
										
										
											2000-12-14 18:16:11 +00:00
										 |  |  |     doctype = None | 
					
						
							|  |  |  |     parentNode = None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     implementation = DOMImplementation() | 
					
						
							| 
									
										
										
										
											2000-12-31 03:50:23 +00:00
										 |  |  |     childNodeTypes = (Node.ELEMENT_NODE, Node.PROCESSING_INSTRUCTION_NODE, | 
					
						
							|  |  |  |                       Node.COMMENT_NODE, Node.DOCUMENT_TYPE_NODE) | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def appendChild(self, node): | 
					
						
							| 
									
										
										
										
											2000-12-31 03:50:23 +00:00
										 |  |  |         if node.nodeType not in self.childNodeTypes: | 
					
						
							|  |  |  |             raise HierarchyRequestErr, \ | 
					
						
							|  |  |  |                   "%s cannot be child of %s" % (repr(node), repr(self) ) | 
					
						
							| 
									
										
										
										
											2000-12-20 14:47:24 +00:00
										 |  |  |         if node.parentNode is not None: | 
					
						
							|  |  |  |             node.parentNode.removeChild(node) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-12-14 18:16:11 +00:00
										 |  |  |         if node.nodeType == Node.ELEMENT_NODE \ | 
					
						
							|  |  |  |            and self._get_documentElement(): | 
					
						
							|  |  |  |             raise TypeError, "two document elements disallowed" | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |         return Node.appendChild(self, node) | 
					
						
							| 
									
										
										
										
											2000-07-01 04:58:47 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-12-20 14:47:24 +00:00
										 |  |  |     def removeChild(self, oldChild): | 
					
						
							|  |  |  |         self.childNodes.remove(oldChild) | 
					
						
							|  |  |  |         oldChild.nextSibling = oldChild.previousSibling = None | 
					
						
							|  |  |  |         oldChild.parentNode = None | 
					
						
							|  |  |  |         if self.documentElement is oldChild: | 
					
						
							|  |  |  |             self.documentElement = None | 
					
						
							|  |  |  |               | 
					
						
							|  |  |  |         return oldChild | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-12-14 18:16:11 +00:00
										 |  |  |     def _get_documentElement(self): | 
					
						
							|  |  |  |         for node in self.childNodes: | 
					
						
							|  |  |  |             if node.nodeType == Node.ELEMENT_NODE: | 
					
						
							|  |  |  |                 return node | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def unlink(self): | 
					
						
							|  |  |  |         if self.doctype is not None: | 
					
						
							|  |  |  |             self.doctype.unlink() | 
					
						
							|  |  |  |             self.doctype = None | 
					
						
							|  |  |  |         Node.unlink(self) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     createElement = Element | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     createTextNode = Text | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     createComment = Comment | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     createProcessingInstruction = ProcessingInstruction | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     createAttribute = Attr | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def createElementNS(self, namespaceURI, qualifiedName): | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |         prefix, localName = _nssplit(qualifiedName) | 
					
						
							|  |  |  |         return self.createElement(qualifiedName, namespaceURI, | 
					
						
							|  |  |  |                                   prefix, localName) | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def createAttributeNS(self, namespaceURI, qualifiedName): | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |         prefix, localName = _nssplit(qualifiedName) | 
					
						
							|  |  |  |         return self.createAttribute(qualifiedName, namespaceURI, | 
					
						
							|  |  |  |                                     localName, prefix) | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def getElementsByTagNameNS(self, namespaceURI, localName): | 
					
						
							|  |  |  |         _getElementsByTagNameNSHelper(self, namespaceURI, localName) | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def getElementsByTagName(self, name): | 
					
						
							|  |  |  |         rc = [] | 
					
						
							|  |  |  |         _getElementsByTagNameHelper(self, name, rc) | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |         return rc | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def writexml(self, writer): | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |         for node in self.childNodes: | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |             node.writexml(writer) | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  | def _get_StringIO(): | 
					
						
							| 
									
										
										
										
											2000-12-14 18:16:11 +00:00
										 |  |  |     # we can't use cStringIO since it doesn't support Unicode strings | 
					
						
							|  |  |  |     from StringIO import StringIO | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |     return StringIO() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  | def _doparse(func, args, kwargs): | 
					
						
							|  |  |  |     events = apply(func, args, kwargs) | 
					
						
							|  |  |  |     toktype, rootNode = events.getEvent() | 
					
						
							|  |  |  |     events.expandNode(rootNode) | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |     return rootNode | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  | def parse(*args, **kwargs): | 
					
						
							| 
									
										
										
										
											2000-12-14 18:16:11 +00:00
										 |  |  |     """Parse a file into a DOM by filename or file object.""" | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |     from xml.dom import pulldom | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     return _doparse(pulldom.parse, args, kwargs) | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  | def parseString(*args, **kwargs): | 
					
						
							| 
									
										
										
										
											2000-12-14 18:16:11 +00:00
										 |  |  |     """Parse a file into a DOM from a string.""" | 
					
						
							| 
									
										
											  
											
												Reduce the visibility of imported modules for cleaner  "from ... import *"
behavior.
Added support for the Attr.ownerElement attribute.
Everywhere:  Define constant object attributes in the classes rather than
on the instances during object construction.  This reduces the amount of
work needed for object construction and destruction; these need to be
lightweight operations on a DOM.
Node._get_firstChild(),
Node._get_lastChild():  Return None if there are no children (required for
        compliance with DOM level 1).
Node.insertBefore():  If refChild is None, append the new node instead of
        failing (required for compliance).  Also, update the sibling
        relationships.  Return the inserted node (required for compliance).
Node.appendChild():  Update the parent of the appended node.
Node.replaceChild():  Actually replace the old child!  Update the parent
        and sibling relationships of both the old and new children.  Return
        the replaced child (required for compliance).
Node.normalize():  Implemented the normalize() method.  Required for
        compliance, but missing from the release.  Useful for joining
        adjacent Text nodes into a single node for easier processing.
Node.cloneNode():  Actually make this work.  Don't let the new node share
        the instance __dict__ with the original.  Do proper recursion if
        doing a "deep" clone.  Move the attribute cloning out of the base
        class, since only Element is supposed to have attributes.
Node.unlink():  Simplify handling of child nodes for efficiency, and
        remove the attribute handling since only Element nodes support
        attributes.
Attr.cloneNode():  Extend this to clear the ownerElement attribute in
        the clone.
AttributeList.items(),
AttributeList.itemsNS():  Slight performance improvement (avoid lambda).
Element.cloneNode():  Extend Node.cloneNode() with support for the
        attributes.  Clone the Attr objects after creating the underlying
        clone.
Element.unlink():  Clean out the attributes here instead of in the base
        class, since this is the only class that will have them.
Element.toxml():  Adjust to create only one AttributeList instance; minor
        efficiency improvement.
_nssplit():  No need to re-import string.
Document.__init__():  No longer needed once constant attributes are
        initialized in the class itself.
Document.createElementNS(),
Document.createAttributeNS():  Use the defined constructors rather than
        directly access the classes.
_get_StringIO():  New function.  Create an output StringIO using the most
        efficient available flavor.
parse(),
parseString():  Import pulldom here instead of in the public namespace of
        the module.
											
										 
											2000-11-21 22:02:22 +00:00
										 |  |  |     from xml.dom import pulldom | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     return _doparse(pulldom.parseString, args, kwargs) |