diff --git a/Lib/xml/dom/minidom.py b/Lib/xml/dom/minidom.py
index 18d82ee..80771ad 100644
--- a/Lib/xml/dom/minidom.py
+++ b/Lib/xml/dom/minidom.py
@@ -1,9 +1,4 @@
-import pulldom
-import string
-from StringIO import StringIO
-import types
-
-"""
+"""\
 minidom.py -- a lightweight DOM implementation based on SAX.
 
 parse( "foo.xml" )
@@ -19,6 +14,11 @@
  * SAX 2 namespaces
 """
 
+import pulldom
+import string
+from StringIO import StringIO
+import types
+
 class Node:
     ELEMENT_NODE                = 1
     ATTRIBUTE_NODE              = 2
@@ -33,229 +33,234 @@
     DOCUMENT_FRAGMENT_NODE      = 11
     NOTATION_NODE               = 12
 
-    allnodes={}
-    _debug=0
-    _makeParentNodes=1
-    debug=None
+    allnodes = {}
+    _debug = 0
+    _makeParentNodes = 1
+    debug = None
 
-    def __init__( self ):
-        self.childNodes=[]
+    def __init__(self):
+        self.childNodes = []
         if Node._debug: 
-            index=repr( id( self ))+repr( self.__class__ )
-            Node.allnodes[index]=repr( self.__dict__ )
-            if Node.debug==None:
-                Node.debug=StringIO()
+            index = repr(id(self)) + repr(self.__class__)
+            Node.allnodes[index] = repr(self.__dict__)
+            if Node.debug is None:
+                Node.debug = StringIO()
                 #open( "debug4.out", "w" )
-            Node.debug.write( "create %s\n"%index )
+            Node.debug.write("create %s\n" % index)
 
-    def __getattr__( self, key ):
-        if key[0:2]=="__": raise AttributeError
+    def __getattr__(self, key):
+        if key[0:2] == "__":
+            raise AttributeError
         # getattr should never call getattr!
         if self.__dict__.has_key("inGetAttr"): 
             del self.inGetAttr
             raise AttributeError, key
 
-        prefix,attrname=key[:5],key[5:]
-        if prefix=="_get_":
-            self.inGetAttr=1
-            if hasattr( self, attrname ): 
+        prefix, attrname = key[:5], key[5:]
+        if prefix == "_get_":
+            self.inGetAttr = 1
+            if hasattr(self, attrname): 
                 del self.inGetAttr
                 return (lambda self=self, attrname=attrname: 
-                                getattr( self, attrname ))
+                                getattr(self, attrname))
             else:
                 del self.inGetAttr
                 raise AttributeError, key
         else:
-            self.inGetAttr=1
+            self.inGetAttr = 1
             try:
-                func = getattr( self, "_get_"+key )
+                func = getattr(self, "_get_" + key)
             except AttributeError:
                 raise AttributeError, key
             del self.inGetAttr
             return func()
 
-    def __nonzero__(self): return 1
+    def __nonzero__(self):
+        return 1
 
-    def toxml( self ):
-        writer=StringIO()
-        self.writexml( writer )
+    def toxml(self):
+        writer = StringIO()
+        self.writexml(writer)
         return writer.getvalue()
 
-    def hasChildNodes( self ):
-        if self.childNodes: return 1
-        else: return 0
+    def hasChildNodes(self):
+        if self.childNodes:
+            return 1
+        else:
+            return 0
 
-    def _get_firstChild( self ):
+    def _get_firstChild(self):
         return self.childNodes[0]
 
-    def _get_lastChild( self ):
+    def _get_lastChild(self):
         return self.childNodes[-1]
 
-    def insertBefore( self, newChild, refChild):
-        index=self.childNodes.index( refChild )
-        self.childNodes.insert( index, newChild )
+    def insertBefore(self, newChild, refChild):
+        index = self.childNodes.index(refChild)
+        self.childNodes.insert(index, newChild)
         if self._makeParentNodes:
-            newChild.parentNode=self
+            newChild.parentNode = self
 
-    def appendChild( self, node ):
-        self.childNodes.append( node )
+    def appendChild(self, node):
+        self.childNodes.append(node)
         return node
 
-    def replaceChild( self, newChild, oldChild ):
-        index=self.childNodes.index( oldChild )
-        self.childNodes[index]=oldChild
+    def replaceChild(self, newChild, oldChild):
+        index = self.childNodes.index(oldChild)
+        self.childNodes[index] = oldChild
 
-    def removeChild( self, oldChild ):
-        index=self.childNodes.index( oldChild )
+    def removeChild(self, oldChild):
+        index = self.childNodes.index(oldChild)
         del self.childNodes[index]
 
-    def cloneNode( self, deep ):
+    def cloneNode(self, deep):
         import new
-        clone=new.instance( self.__class__, self.__dict__ )
-        clone.attributes=self.attributes.copy()
+        clone = new.instance(self.__class__, self.__dict__)
+        clone.attributes = self.attributes.copy()
         if not deep:
-            clone.childNodes=[]
+            clone.childNodes = []
         else:
-            clone.childNodes=map( lambda x: x.cloneNode, self.childNodes )
+            clone.childNodes = map(lambda x: x.cloneNode, self.childNodes)
         return clone
 
-    def unlink( self ):
-        self.parentNode=None
+    def unlink(self):
+        self.parentNode = None
         while self.childNodes:
             self.childNodes[-1].unlink()
             del self.childNodes[-1] # probably not most efficient!
-        self.childNodes=None
+        self.childNodes = None
         if self.attributes:
             for attr in self._attrs.values():
-                self.removeAttributeNode( attr )
-            assert not len( self._attrs )
-            assert not len( self._attrsNS )
+                self.removeAttributeNode(attr)
+            assert not len(self._attrs)
+            assert not len(self._attrsNS)
         if Node._debug:
-            index=repr( id( self ))+repr( self.__class__ )
-            self.debug.write( "Deleting: %s\n" % index )
+            index = repr(id(self)) + repr(self.__class__)
+            self.debug.write("Deleting: %s\n" % index)
             del Node.allnodes[index]
 
-def _write_data( writer, data):
+def _write_data(writer, data):
     "Writes datachars to writer."
-    data=string.replace(data,"&","&amp;")
-    data=string.replace(data,"<","&lt;")
-    data=string.replace(data,"\"","&quot;")
-    data=string.replace(data,">","&gt;")
+    data = string.replace(data, "&", "&amp;")
+    data = string.replace(data, "<", "&lt;")
+    data = string.replace(data, "\"", "&quot;")
+    data = string.replace(data, ">", "&gt;")
     writer.write(data)
 
-def _getElementsByTagNameHelper( parent, name, rc ):
+def _getElementsByTagNameHelper(parent, name, rc):
     for node in parent.childNodes:
-        if node.nodeType==Node.ELEMENT_NODE and\
-            (name=="*" or node.tagName==name):
-            rc.append( node )
-        _getElementsByTagNameHelper( node, name, rc )
+        if node.nodeType == Node.ELEMENT_NODE and \
+            (name == "*" or node.tagName == name):
+            rc.append(node)
+        _getElementsByTagNameHelper(node, name, rc)
     return rc
 
-def _getElementsByTagNameNSHelper( parent, nsURI, localName, rc ):
+def _getElementsByTagNameNSHelper(parent, nsURI, localName, rc):
     for node in parent.childNodes:
-        if (node.nodeType==Node.ELEMENT_NODE ):
-            if ((localName=="*" or node.tagName==localName) and
-            (nsURI=="*" or node.namespaceURI==nsURI)):
-                rc.append( node )
-            _getElementsByTagNameNSHelper( node, name, rc )
+        if node.nodeType == Node.ELEMENT_NODE:
+            if ((localName == "*" or node.tagName == localName) and
+                (nsURI == "*" or node.namespaceURI == nsURI)):
+                rc.append(node)
+            _getElementsByTagNameNSHelper(node, name, rc)
 
 class Attr(Node):
-    nodeType=Node.ATTRIBUTE_NODE
-    def __init__( self, qName, namespaceURI="", localName=None,
-prefix=None ):
+    nodeType = Node.ATTRIBUTE_NODE
+
+    def __init__(self, qName, namespaceURI="", localName=None, prefix=None):
         # skip setattr for performance
-        self.__dict__["localName"]=localName or qName
+        self.__dict__["localName"] = localName or qName
         self.__dict__["nodeName"] = self.__dict__["name"] = qName
-        self.__dict__["namespaceURI"]=namespaceURI
-        self.__dict__["prefix"]=prefix
-        self.attributes=None
-        Node.__init__( self )
+        self.__dict__["namespaceURI"] = namespaceURI
+        self.__dict__["prefix"] = prefix
+        self.attributes = None
+        Node.__init__(self)
         # nodeValue and value are set elsewhere
 
-    def __setattr__( self, name, value ):
-        if name in ("value", "nodeValue" ):
-            self.__dict__["value"]=self.__dict__["nodeValue"]=value
+    def __setattr__(self, name, value):
+        if name in ("value", "nodeValue"):
+            self.__dict__["value"] = self.__dict__["nodeValue"] = value
         else:
-            self.__dict__[name]=value
+            self.__dict__[name] = value
 
 class AttributeList:
     """the attribute list is a transient interface to the underlying
-dictionaries.  mutations here will change the underlying element's
-dictionary"""
-    def __init__( self, attrs, attrsNS ):
-        self._attrs=attrs
-        self._attrsNS=attrsNS
-        self.length=len( self._attrs.keys() )
+    dictionaries.  mutations here will change the underlying element's
+    dictionary"""
+    def __init__(self, attrs, attrsNS):
+        self._attrs = attrs
+        self._attrsNS = attrsNS
+        self.length = len(self._attrs.keys())
 
-    def item( self, index ):
+    def item(self, index):
         try:
             return self[self.keys()[index]]
         except IndexError:
             return None
-        
-    def items( self ):
-        return map( lambda node: (node.tagName, node.value),
-                    self._attrs.values() )
 
-    def itemsNS( self ):
-        return map( lambda node: ((node.URI, node.localName), node.value),
-                    self._attrs.values() )
+    def items(self):
+        return map(lambda node: (node.tagName, node.value),
+                   self._attrs.values())
+
+    def itemsNS(self):
+        return map(lambda node: ((node.URI, node.localName), node.value),
+                   self._attrs.values())
     
-    def keys( self ):
+    def keys(self):
         return self._attrs.keys()
 
-    def keysNS( self ):
+    def keysNS(self):
         return self._attrsNS.keys()
 
-    def values( self ):
+    def values(self):
         return self._attrs.values()
 
-    def __len__( self ):
+    def __len__(self):
         return self.length
 
-    def __cmp__( self, other ):
-        if self._attrs is getattr( other, "_attrs", None ):
+    def __cmp__(self, other):
+        if self._attrs is getattr(other, "_attrs", None):
             return 0
         else: 
-            return cmp( id( self ), id( other ) )
+            return cmp(id(self), id(other))
 
     #FIXME: is it appropriate to return .value?
-    def __getitem__( self, attname_or_tuple ):
-        if type( attname_or_tuple ) == types.TupleType:
+    def __getitem__(self, attname_or_tuple):
+        if type(attname_or_tuple) is types.TupleType:
             return self._attrsNS[attname_or_tuple]
         else:
             return self._attrs[attname_or_tuple]
 
     # same as set
-    def __setitem__( self, attname, value ):
-        if type( value ) == types.StringType:
-            node=Attr( attname )
+    def __setitem__(self, attname, value):
+        if type(value) is types.StringType:
+            node = Attr(attname)
             node.value=value
         else:
-            assert isinstance( value, Attr ) or type( value )==types.StringType
-            node=value
-        old=self._attrs.get( attname, None)
+            assert isinstance(value, Attr) or type(value) is types.StringType
+            node = value
+        old = self._attrs.get(attname, None)
         if old:
             old.unlink()
-        self._attrs[node.name]=node
-        self._attrsNS[(node.namespaceURI,node.localName)]=node
+        self._attrs[node.name] = node
+        self._attrsNS[(node.namespaceURI, node.localName)] = node
 
-    def __delitem__( self, attname_or_tuple ):
-        node=self[attname_or_tuple]
+    def __delitem__(self, attname_or_tuple):
+        node = self[attname_or_tuple]
         node.unlink()
         del self._attrs[node.name]
         del self._attrsNS[(node.namespaceURI, node.localName)]
- 
+
 class Element( Node ):
-    nodeType=Node.ELEMENT_NODE
-    def __init__( self, tagName, namespaceURI="", prefix="",
-                  localName=None ):
-        Node.__init__( self )
+    nodeType = Node.ELEMENT_NODE
+
+    def __init__(self, tagName, namespaceURI="", prefix="",
+                 localName=None):
+        Node.__init__(self)
         self.tagName = self.nodeName = tagName
-        self.localName=localName or tagName
-        self.prefix=prefix
-        self.namespaceURI=namespaceURI
-        self.nodeValue=None
+        self.localName = localName or tagName
+        self.prefix = prefix
+        self.namespaceURI = namespaceURI
+        self.nodeValue = None
 
         self._attrs={}  # attributes are double-indexed:
         self._attrsNS={}#    tagName -> Attribute
@@ -264,191 +269,195 @@
                 #                this is too tricky for now because of headaches
                 #                with namespaces.
 
-    def getAttribute( self, attname ):
+    def getAttribute(self, attname):
         return self._attrs[attname].value
 
-    def getAttributeNS( self, namespaceURI, localName ):
+    def getAttributeNS(self, namespaceURI, localName):
         return self._attrsNS[(namespaceURI, localName)].value
-    
-    def setAttribute( self, attname, value ):
-        attr=Attr( attname )
+
+    def setAttribute(self, attname, value):
+        attr = Attr(attname)
         # for performance
-        attr.__dict__["value"]=attr.__dict__["nodeValue"]=value
-        self.setAttributeNode( attr )
+        attr.__dict__["value"] = attr.__dict__["nodeValue"] = value
+        self.setAttributeNode(attr)
 
-    def setAttributeNS( self, namespaceURI, qualifiedName, value ):
-        prefix,localname=_nssplit( qualifiedName )
+    def setAttributeNS(self, namespaceURI, qualifiedName, value):
+        prefix, localname = _nssplit(qualifiedName)
         # for performance
-        attr = Attr( qualifiedName, namespaceURI, localname, prefix )
-        attr.__dict__["value"]=attr.__dict__["nodeValue"]=value
-        self.setAttributeNode( attr )
+        attr = Attr(qualifiedName, namespaceURI, localname, prefix)
+        attr.__dict__["value"] = attr.__dict__["nodeValue"] = value
+        self.setAttributeNode(attr)
 
-    def getAttributeNode( self, attrname ):
-        return self._attrs.get( attrname )
+    def getAttributeNode(self, attrname):
+        return self._attrs.get(attrname)
 
-    def getAttributeNodeNS( self, namespaceURI, localName ):
+    def getAttributeNodeNS(self, namespaceURI, localName):
         return self._attrsNS[(namespaceURI, localName)]
 
-    def setAttributeNode( self, attr ):
-        old=self._attrs.get( attr.name, None)
+    def setAttributeNode(self, attr):
+        old = self._attrs.get(attr.name, None)
         if old:
             old.unlink()
-        self._attrs[attr.name]=attr
-        self._attrsNS[(attr.namespaceURI,attr.localName)]=attr
+        self._attrs[attr.name] = attr
+        self._attrsNS[(attr.namespaceURI, attr.localName)] = attr
 
-    def removeAttribute( self, name ):
+    def removeAttribute(self, name):
         attr = self._attrs[name]
-        self.removeAttributeNode( attr )
+        self.removeAttributeNode(attr)
 
-    def removeAttributeNS( self, namespaceURI, localName ):
+    def removeAttributeNS(self, namespaceURI, localName):
         attr = self._attrsNS[(namespaceURI, localName)]
-        self.removeAttributeNode( attr )
+        self.removeAttributeNode(attr)
 
-    def removeAttributeNode( self, node ):
+    def removeAttributeNode(self, node):
         node.unlink()
         del self._attrs[node.name]
         del self._attrsNS[(node.namespaceURI, node.localName)]
         
-    def getElementsByTagName( self, name ):
-        return _getElementsByTagNameHelper( self, name, [] )
+    def getElementsByTagName(self, name):
+        return _getElementsByTagNameHelper(self, name, [])
 
-    def getElementsByTagNameNS(self,namespaceURI,localName):
-        _getElementsByTagNameNSHelper( self, namespaceURI, localName, [] )
+    def getElementsByTagNameNS(self, namespaceURI, localName):
+        _getElementsByTagNameNSHelper(self, namespaceURI, localName, [])
 
-    def __repr__( self ):
-        return "<DOM Element:"+self.tagName+" at "+`id( self )` +" >"
+    def __repr__(self):
+        return "<DOM Element: %s at %s>" % (self.tagName, id(self))
 
     def writexml(self, writer):
-        writer.write("<"+self.tagName)
+        writer.write("<" + self.tagName)
             
-        a_names=self._get_attributes().keys()
+        a_names = self._get_attributes().keys()
         a_names.sort()
 
         for a_name in a_names:
-            writer.write(" "+a_name+"=\"")
+            writer.write(" %s=\"" % a_name)
             _write_data(writer, self._get_attributes()[a_name])
             writer.write("\"")
         if self.childNodes:
             writer.write(">")
             for node in self.childNodes:
-                node.writexml( writer )
-            writer.write("</"+self.tagName+">")
+                node.writexml(writer)
+            writer.write("</%s>" % self.tagName)
         else:
             writer.write("/>")
 
-    def _get_attributes( self ):
-        return AttributeList( self._attrs, self._attrsNS )
+    def _get_attributes(self):
+        return AttributeList(self._attrs, self._attrsNS)
 
-class Comment( Node ):
-    nodeType=Node.COMMENT_NODE
-    def __init__(self, data ):
-        Node.__init__( self )
-        self.data=self.nodeValue=data
-        self.nodeName="#comment"
-        self.attributes=None
+class Comment(Node):
+    nodeType = Node.COMMENT_NODE
 
-    def writexml( self, writer ):
-        writer.write( "<!--" + self.data + "-->" )
+    def __init__(self, data):
+        Node.__init__(self)
+        self.data = self.nodeValue = data
+        self.nodeName = "#comment"
+        self.attributes = None
 
-class ProcessingInstruction( Node ):
-    nodeType=Node.PROCESSING_INSTRUCTION_NODE
-    def __init__(self, target, data ):
-        Node.__init__( self )
+    def writexml(self, writer):
+        writer.write("<!--%s-->" % self.data)
+
+class ProcessingInstruction(Node):
+    nodeType = Node.PROCESSING_INSTRUCTION_NODE
+
+    def __init__(self, target, data):
+        Node.__init__(self)
         self.target = self.nodeName = target
         self.data = self.nodeValue = data
-        self.attributes=None
+        self.attributes = None
 
-    def writexml( self, writer ):
-        writer.write( "<?" + self.target +" " + self.data+ "?>" )
+    def writexml(self, writer):
+        writer.write("<?%s %s?>" % (self.target, self.data))
 
-class Text( Node ):
-    nodeType=Node.TEXT_NODE
-    nodeName="#text"
-    def __init__(self, data ):
-        Node.__init__( self )
+class Text(Node):
+    nodeType = Node.TEXT_NODE
+    nodeName = "#text"
+
+    def __init__(self, data):
+        Node.__init__(self)
         self.data = self.nodeValue = data
-        self.attributes=None
+        self.attributes = None
 
     def __repr__(self):
-        if len( self.data )> 10:
-            dotdotdot="..."
+        if len(self.data) > 10:
+            dotdotdot = "..."
         else:
-            dotdotdot=""
-        return "<DOM Text node \"" + self.data[0:10] + dotdotdot+"\">"
+            dotdotdot = ""
+        return "<DOM Text node \"%s%s\">" % (self.data[0:10], dotdotdot)
 
-    def writexml( self, writer ):
-        _write_data( writer, self.data )
+    def writexml(self, writer):
+        _write_data(writer, self.data)
 
-def _nssplit( qualifiedName ):
-    fields = string.split(qualifiedName, ':')
+def _nssplit(qualifiedName):
+    fields = qualifiedName.split(':', 1)
     if len(fields) == 2:
         return fields
     elif len(fields) == 1:
-        return( '', fields[0] )
+        return ('', fields[0])
 
-class Document( Node ):
-    nodeType=Node.DOCUMENT_NODE
-    documentElement=None
-    def __init__( self ):
-        Node.__init__( self )
-        self.attributes=None
-        self.nodeName="#document"
-        self.nodeValue=None
+class Document(Node):
+    nodeType = Node.DOCUMENT_NODE
+    documentElement = None
 
-    def appendChild( self, node ):
-        if node.nodeType==Node.ELEMENT_NODE:
+    def __init__(self):
+        Node.__init__(self)
+        self.attributes = None
+        self.nodeName = "#document"
+        self.nodeValue = None
+
+    def appendChild(self, node):
+        if node.nodeType == Node.ELEMENT_NODE:
             if self.documentElement:
                 raise TypeError, "Two document elements disallowed"
             else:
-                self.documentElement=node
-        Node.appendChild( self, node )
+                self.documentElement = node
+        Node.appendChild(self, node)
         return node
 
-    createElement=Element
+    createElement = Element
 
-    createTextNode=Text
+    createTextNode = Text
 
-    createComment=Comment
+    createComment = Comment
 
-    createProcessingInstruction=ProcessingInstruction
+    createProcessingInstruction = ProcessingInstruction
 
-    createAttribute=Attr
+    createAttribute = Attr
 
     def createElementNS(self, namespaceURI, qualifiedName):
-        prefix,localName=_nssplit( qualifiedName )
+        prefix,localName = _nssplit(qualifiedName)
         return Element(qualifiedName, namespaceURI, prefix, localName)
 
     def createAttributeNS(self, namespaceURI, qualifiedName):
-        prefix,localName=_nssplit( qualifiedName )
+        prefix,localName = _nssplit(qualifiedName)
         return Attr(namespaceURI, qualifiedName, localName, prefix)
 
-    def getElementsByTagNameNS(self,namespaceURI,localName):
-        _getElementsByTagNameNSHelper( self, namespaceURI, localName )
+    def getElementsByTagNameNS(self, namespaceURI, localName):
+        _getElementsByTagNameNSHelper(self, namespaceURI, localName)
 
-    def unlink( self ):
-        self.documentElement=None
-        Node.unlink( self )
+    def unlink(self):
+        self.documentElement = None
+        Node.unlink(self)
 
-    def getElementsByTagName( self, name ):
-        rc=[]
-        _getElementsByTagNameHelper( self, name, rc )
+    def getElementsByTagName(self, name):
+        rc = []
+        _getElementsByTagNameHelper(self, name, rc)
         return rc
 
-    def writexml( self, writer ):
+    def writexml(self, writer):
         for node in self.childNodes:
-            node.writexml( writer )
+            node.writexml(writer)
 
-def _doparse( func, args, kwargs ):
-    events=apply( func, args, kwargs )
-    (toktype, rootNode)=events.getEvent()
-    events.expandNode( rootNode )
+def _doparse(func, args, kwargs):
+    events = apply(func, args, kwargs)
+    toktype, rootNode = events.getEvent()
+    events.expandNode(rootNode)
     return rootNode
 
-def parse( *args, **kwargs ):
+def parse(*args, **kwargs):
     "Parse a file into a DOM by filename or file object"
-    return _doparse( pulldom.parse, args, kwargs )
+    return _doparse(pulldom.parse, args, kwargs)
 
-def parseString( *args, **kwargs ):
+def parseString(*args, **kwargs):
     "Parse a file into a DOM from a string"
-    return _doparse( pulldom.parseString, args, kwargs )
+    return _doparse(pulldom.parseString, args, kwargs)
 
diff --git a/Lib/xml/dom/pulldom.py b/Lib/xml/dom/pulldom.py
index ae8ea1c..011d46a 100644
--- a/Lib/xml/dom/pulldom.py
+++ b/Lib/xml/dom/pulldom.py
@@ -1,159 +1,157 @@
 import minidom
-import types
-import string
-import sys
 import xml.sax
 
 #todo: SAX2/namespace handling
 
-START_ELEMENT="START_ELEMENT"
-END_ELEMENT="END_ELEMENT"
-COMMENT="COMMENT"
-START_DOCUMENT="START_DOCUMENT"
-END_DOCUMENT="END_DOCUMENT"
-PROCESSING_INSTRUCTION="PROCESSING_INSTRUCTION"
-IGNORABLE_WHITESPACE="IGNORABLE_WHITESPACE"
-CHARACTERS="CHARACTERS"
+START_ELEMENT = "START_ELEMENT"
+END_ELEMENT = "END_ELEMENT"
+COMMENT = "COMMENT"
+START_DOCUMENT = "START_DOCUMENT"
+END_DOCUMENT = "END_DOCUMENT"
+PROCESSING_INSTRUCTION = "PROCESSING_INSTRUCTION"
+IGNORABLE_WHITESPACE = "IGNORABLE_WHITESPACE"
+CHARACTERS = "CHARACTERS"
 
 class PullDOM:
-    def __init__( self ):
-        self.firstEvent=[None,None]
-        self.lastEvent=self.firstEvent
+    def __init__(self):
+        self.firstEvent = [None, None]
+        self.lastEvent = self.firstEvent
 
-    def setDocumentLocator( self, locator ): pass
+    def setDocumentLocator(self, locator): pass
 
-    def startElement( self, name, tagName , attrs  ):
-        if not hasattr( self, "curNode" ):
+    def startElement(self, name, tagName, attrs):
+        if not hasattr(self, "curNode"):
             # FIXME: hack!
-            self.startDocument( )
+            self.startDocument()
 
-        node = self.document.createElement( tagName ) #FIXME namespaces!
+        node = self.document.createElement(tagName) #FIXME namespaces!
         for attr in attrs.keys():
-            node.setAttribute( attr, attrs[attr] )
-        
-        parent=self.curNode
+            node.setAttribute(attr, attrs[attr])
+
+        parent = self.curNode
         node.parentNode = parent
         if parent.childNodes:
-            node.previousSibling=parent.childNodes[-1]
-            node.previousSibling.nextSibling=node
+            node.previousSibling = parent.childNodes[-1]
+            node.previousSibling.nextSibling = node
         self.curNode = node
         # FIXME: do I have to screen namespace attributes
-        self.lastEvent[1]=[(START_ELEMENT, node), None ]
-        self.lastEvent=self.lastEvent[1]
-        #self.events.append( (START_ELEMENT, node) )
+        self.lastEvent[1] = [(START_ELEMENT, node), None]
+        self.lastEvent = self.lastEvent[1]
+        #self.events.append((START_ELEMENT, node))
 
-    def endElement( self, name, tagName ):
+    def endElement(self, name, tagName):
         node = self.curNode
-        self.lastEvent[1]=[(END_ELEMENT, node), None ]
-        self.lastEvent=self.lastEvent[1]
-        #self.events.append( (END_ELEMENT, node ))
+        self.lastEvent[1] = [(END_ELEMENT, node), None]
+        self.lastEvent = self.lastEvent[1]
+        #self.events.append((END_ELEMENT, node))
         self.curNode = node.parentNode
 
-    def comment( self, s):
-        node = self.document.createComment ( s )
-        parent=self.curNode
-        node.parentNode=parent
+    def comment(self, s):
+        node = self.document.createComment(s)
+        parent = self.curNode
+        node.parentNode = parent
         if parent.childNodes:
-            node.previousSibling=parent.childNodes[-1]
-            node.previousSibling.nextSibling=node
-        self.lastEvent[1]=[(COMMENT, node), None ]
-        self.lastEvent=self.lastEvent[1]
-        #self.events.append( (COMMENT, node ))
+            node.previousSibling = parent.childNodes[-1]
+            node.previousSibling.nextSibling = node
+        self.lastEvent[1] = [(COMMENT, node), None]
+        self.lastEvent = self.lastEvent[1]
+        #self.events.append((COMMENT, node))
 
-    def processingInstruction( self, target, data ):
-        node = self.document.createProcessingInstruction( target, data )
-        #self.appendChild( node )
+    def processingInstruction(self, target, data):
+        node = self.document.createProcessingInstruction(target, data)
+        #self.appendChild(node)
         
-        parent=self.curNode
-        node.parentNode=parent
+        parent = self.curNode
+        node.parentNode = parent
         if parent.childNodes:
-            node.previousSibling=parent.childNodes[-1]
-            node.previousSibling.nextSibling=node
-        self.lastEvent[1]=[(PROCESSING_INSTRUCTION, node), None ]
-        self.lastEvent=self.lastEvent[1]
-        #self.events.append( (PROCESSING_INSTRUCTION, node) )
+            node.previousSibling = parent.childNodes[-1]
+            node.previousSibling.nextSibling = node
+        self.lastEvent[1] = [(PROCESSING_INSTRUCTION, node), None]
+        self.lastEvent = self.lastEvent[1]
+        #self.events.append((PROCESSING_INSTRUCTION, node))
 
-    def ignorableWhitespace( self, chars ):
-        node = self.document.createTextNode( chars[start:start+length] )
-        parent=self.curNode
-        node.parentNode=parent
+    def ignorableWhitespace(self, chars):
+        node = self.document.createTextNode(chars[start:start + length])
+        parent = self.curNode
+        node.parentNode = parent
         if parent.childNodes:
-            node.previousSibling=parent.childNodes[-1]
-            node.previousSibling.nextSibling=node
-        self.lastEvent[1]=[(IGNORABLE_WHITESPACE, node), None ]
-        self.lastEvent=self.lastEvent[1]
-        #self.events.append( (IGNORABLE_WHITESPACE, node))
+            node.previousSibling = parent.childNodes[-1]
+            node.previousSibling.nextSibling = node
+        self.lastEvent[1] = [(IGNORABLE_WHITESPACE, node), None]
+        self.lastEvent = self.lastEvent[1]
+        #self.events.append((IGNORABLE_WHITESPACE, node))
 
-    def characters( self, chars ):
-        node = self.document.createTextNode( chars )
-        node.parentNode=self.curNode
-        self.lastEvent[1]=[(CHARACTERS, node), None ]
-        self.lastEvent=self.lastEvent[1]
+    def characters(self, chars):
+        node = self.document.createTextNode(chars)
+        node.parentNode = self.curNode
+        self.lastEvent[1] = [(CHARACTERS, node), None]
+        self.lastEvent = self.lastEvent[1]
 
-    def startDocument( self ):
+    def startDocument(self):
         node = self.curNode = self.document = minidom.Document()
-        node.parentNode=None
-        self.lastEvent[1]=[(START_DOCUMENT, node), None ]
-        self.lastEvent=self.lastEvent[1]
-        #self.events.append( (START_DOCUMENT, node) )
-            
-    def endDocument( self ):
-        assert( not self.curNode.parentNode )
-        for node in self.curNode.childNodes:
-                if node.nodeType==node.ELEMENT_NODE:
-                        self.document.documentElement = node
-        #if not self.document.documentElement:
-        #        raise Error, "No document element"
+        node.parentNode = None
+        self.lastEvent[1] = [(START_DOCUMENT, node), None]
+        self.lastEvent = self.lastEvent[1]
+        #self.events.append((START_DOCUMENT, node))
 
-        self.lastEvent[1]=[(END_DOCUMENT, node), None ]
-        #self.events.append( (END_DOCUMENT, self.curNode) )
+    def endDocument(self):
+        assert not self.curNode.parentNode
+        for node in self.curNode.childNodes:
+            if node.nodeType == node.ELEMENT_NODE:
+                self.document.documentElement = node
+        #if not self.document.documentElement:
+        #    raise Error, "No document element"
+
+        self.lastEvent[1] = [(END_DOCUMENT, node), None]
+        #self.events.append((END_DOCUMENT, self.curNode))
 
 class ErrorHandler:
-    def warning( self, exception ):
+    def warning(self, exception):
         print exception
-    def error( self, exception ):
+    def error(self, exception):
         raise exception 
-    def fatalError( self, exception ):
+    def fatalError(self, exception):
         raise exception 
 
 class DOMEventStream:
-    def __init__( self, stream, parser, bufsize ):
-        self.stream=stream
-        self.parser=parser
-        self.bufsize=bufsize
+    def __init__(self, stream, parser, bufsize):
+        self.stream = stream
+        self.parser = parser
+        self.bufsize = bufsize
         self.reset()
 
-    def reset( self ):
+    def reset(self):
         self.pulldom = PullDOM()
-        self.parser.setContentHandler( self.pulldom )
+        self.parser.setContentHandler(self.pulldom)
 
-    def __getitem__( self, pos ):
-        rc=self.getEvent()
-        if rc: return rc
+    def __getitem__(self, pos):
+        rc = self.getEvent()
+        if rc:
+            return rc
         raise IndexError
 
-    def expandNode( self, node ):
-        event=self.getEvent()
+    def expandNode(self, node):
+        event = self.getEvent()
         while event:
-            token,cur_node=event
-            if cur_node is node: return
-            
-            if token !=END_ELEMENT:
-                cur_node.parentNode.appendChild( cur_node )
-            event=self.getEvent()
+            token, cur_node = event
+            if cur_node is node:
+                return
+            if token != END_ELEMENT:
+                cur_node.parentNode.appendChild(cur_node)
+            event = self.getEvent()
 
-    def getEvent( self ):
+    def getEvent(self):
         if not self.pulldom.firstEvent[1]:
-            self.pulldom.lastEvent=self.pulldom.firstEvent
+            self.pulldom.lastEvent = self.pulldom.firstEvent
         while not self.pulldom.firstEvent[1]:
-            buf=self.stream.read( self.bufsize )
+            buf=self.stream.read(self.bufsize)
             if not buf:
                 #FIXME: why doesn't Expat close work?
                 #self.parser.close()
                 return None
-            self.parser.feed( buf )
-        rc=self.pulldom.firstEvent[1][0]
-        self.pulldom.firstEvent[1]=self.pulldom.firstEvent[1][1]
+            self.parser.feed(buf)
+        rc = self.pulldom.firstEvent[1][0]
+        self.pulldom.firstEvent[1] = self.pulldom.firstEvent[1][1]
         return rc
 
 # FIXME: sax2
@@ -168,27 +166,25 @@
 def _getParser():
      return xml.sax.make_parser()
 
-default_bufsize=(2**14)-20
+default_bufsize = (2 ** 14) - 20
+
 # FIXME: move into sax package for common usage
-def parse( stream_or_string, parser=None, bufsize=default_bufsize ):
-    if type( stream_or_string ) == type( "" ):
-        stream=open( stream_or_string )
+def parse(stream_or_string, parser=None, bufsize=default_bufsize):
+    if type(stream_or_string) is type(""):
+        stream = open(stream_or_string)
     else:
-        stream=stream_or_string
+        stream = stream_or_string
     if not parser: 
-        parser=_getParser()
-    return DOMEventStream( stream, parser, bufsize )
+        parser = _getParser()
+    return DOMEventStream(stream, parser, bufsize)
 
-def parseString( string, parser=None ):
+def parseString(string, parser=None):
     try:
-        import cStringIO
-        stringio=cStringIO.StringIO
+        from cStringIO import StringIO
     except ImportError:
-        import StringIO
-        stringio=StringIO.StringIO
+        from StringIO import StringIO
         
-    bufsize=len( string )
-    buf=stringio( string )
-    parser=_getParser()
-    return DOMEventStream( buf, parser, bufsize )
-
+    bufsize = len(string)
+    buf = StringIO(string)
+    parser = _getParser()
+    return DOMEventStream(buf, parser, bufsize)
