git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@9995 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			737 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			737 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
##############################################################################
 | 
						|
# 
 | 
						|
# Zope Public License (ZPL) Version 1.0
 | 
						|
# -------------------------------------
 | 
						|
# 
 | 
						|
# Copyright (c) Digital Creations.  All rights reserved.
 | 
						|
# 
 | 
						|
# This license has been certified as Open Source(tm).
 | 
						|
# 
 | 
						|
# Redistribution and use in source and binary forms, with or without
 | 
						|
# modification, are permitted provided that the following conditions are
 | 
						|
# met:
 | 
						|
# 
 | 
						|
# 1. Redistributions in source code must retain the above copyright
 | 
						|
#    notice, this list of conditions, and the following disclaimer.
 | 
						|
# 
 | 
						|
# 2. Redistributions in binary form must reproduce the above copyright
 | 
						|
#    notice, this list of conditions, and the following disclaimer in
 | 
						|
#    the documentation and/or other materials provided with the
 | 
						|
#    distribution.
 | 
						|
# 
 | 
						|
# 3. Digital Creations requests that attribution be given to Zope
 | 
						|
#    in any manner possible. Zope includes a "Powered by Zope"
 | 
						|
#    button that is installed by default. While it is not a license
 | 
						|
#    violation to remove this button, it is requested that the
 | 
						|
#    attribution remain. A significant investment has been put
 | 
						|
#    into Zope, and this effort will continue if the Zope community
 | 
						|
#    continues to grow. This is one way to assure that growth.
 | 
						|
# 
 | 
						|
# 4. All advertising materials and documentation mentioning
 | 
						|
#    features derived from or use of this software must display
 | 
						|
#    the following acknowledgement:
 | 
						|
# 
 | 
						|
#      "This product includes software developed by Digital Creations
 | 
						|
#      for use in the Z Object Publishing Environment
 | 
						|
#      (http://www.zope.org/)."
 | 
						|
# 
 | 
						|
#    In the event that the product being advertised includes an
 | 
						|
#    intact Zope distribution (with copyright and license included)
 | 
						|
#    then this clause is waived.
 | 
						|
# 
 | 
						|
# 5. Names associated with Zope or Digital Creations must not be used to
 | 
						|
#    endorse or promote products derived from this software without
 | 
						|
#    prior written permission from Digital Creations.
 | 
						|
# 
 | 
						|
# 6. Modified redistributions of any form whatsoever must retain
 | 
						|
#    the following acknowledgment:
 | 
						|
# 
 | 
						|
#      "This product includes software developed by Digital Creations
 | 
						|
#      for use in the Z Object Publishing Environment
 | 
						|
#      (http://www.zope.org/)."
 | 
						|
# 
 | 
						|
#    Intact (re-)distributions of any official Zope release do not
 | 
						|
#    require an external acknowledgement.
 | 
						|
# 
 | 
						|
# 7. Modifications are encouraged but must be packaged separately as
 | 
						|
#    patches to official Zope releases.  Distributions that do not
 | 
						|
#    clearly separate the patches from the original work must be clearly
 | 
						|
#    labeled as unofficial distributions.  Modifications which do not
 | 
						|
#    carry the name Zope may be packaged in any form, as long as they
 | 
						|
#    conform to all of the clauses above.
 | 
						|
# 
 | 
						|
# 
 | 
						|
# Disclaimer
 | 
						|
# 
 | 
						|
#   THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY
 | 
						|
#   EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
						|
#   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 | 
						|
#   PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL DIGITAL CREATIONS OR ITS
 | 
						|
#   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
						|
#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
						|
#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 | 
						|
#   USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 | 
						|
#   ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 | 
						|
#   OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 | 
						|
#   OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 | 
						|
#   SUCH DAMAGE.
 | 
						|
# 
 | 
						|
# 
 | 
						|
# This software consists of contributions made by Digital Creations and
 | 
						|
# many individuals on behalf of Digital Creations.  Specific
 | 
						|
# attributions are listed in the accompanying credits file.
 | 
						|
# 
 | 
						|
##############################################################################
 | 
						|
"""
 | 
						|
DOM implementation in StructuredText : Read-Only methods
 | 
						|
 | 
						|
All standard Zope objects support DOM to a limited extent.
 | 
						|
"""
 | 
						|
import string
 | 
						|
 | 
						|
 | 
						|
# Node type codes
 | 
						|
# ---------------
 | 
						|
 | 
						|
ELEMENT_NODE                  = 1
 | 
						|
ATTRIBUTE_NODE                = 2
 | 
						|
TEXT_NODE                     = 3
 | 
						|
CDATA_SECTION_NODE            = 4
 | 
						|
ENTITY_REFERENCE_NODE         = 5
 | 
						|
ENTITY_NODE                   = 6
 | 
						|
PROCESSING_INSTRUCTION_NODE   = 7
 | 
						|
COMMENT_NODE                  = 8
 | 
						|
DOCUMENT_NODE                 = 9
 | 
						|
DOCUMENT_TYPE_NODE            = 10
 | 
						|
DOCUMENT_FRAGMENT_NODE        = 11
 | 
						|
NOTATION_NODE                 = 12
 | 
						|
 | 
						|
# Exception codes
 | 
						|
# ---------------
 | 
						|
 | 
						|
INDEX_SIZE_ERR                = 1
 | 
						|
DOMSTRING_SIZE_ERR            = 2
 | 
						|
HIERARCHY_REQUEST_ERR         = 3
 | 
						|
WRONG_DOCUMENT_ERR            = 4
 | 
						|
INVALID_CHARACTER_ERR         = 5
 | 
						|
NO_DATA_ALLOWED_ERR           = 6
 | 
						|
NO_MODIFICATION_ALLOWED_ERR   = 7
 | 
						|
NOT_FOUND_ERR                 = 8
 | 
						|
NOT_SUPPORTED_ERR             = 9
 | 
						|
INUSE_ATTRIBUTE_ERR           = 10
 | 
						|
 | 
						|
# Exceptions
 | 
						|
# ----------
 | 
						|
 | 
						|
class DOMException(Exception):
 | 
						|
    pass
 | 
						|
class IndexSizeException(DOMException):
 | 
						|
    code = INDEX_SIZE_ERR
 | 
						|
class DOMStringSizeException(DOMException):
 | 
						|
    code = DOMSTRING_SIZE_ERR
 | 
						|
class HierarchyRequestException(DOMException):
 | 
						|
    code = HIERARCHY_REQUEST_ERR
 | 
						|
class WrongDocumentException(DOMException):
 | 
						|
    code = WRONG_DOCUMENT_ERR
 | 
						|
class InvalidCharacterException(DOMException):
 | 
						|
    code = INVALID_CHARACTER_ERR
 | 
						|
class NoDataAllowedException(DOMException):
 | 
						|
    code = NO_DATA_ALLOWED_ERR
 | 
						|
class NoModificationAllowedException(DOMException):
 | 
						|
    code = NO_MODIFICATION_ALLOWED_ERR
 | 
						|
class NotFoundException(DOMException):
 | 
						|
    code = NOT_FOUND_ERR
 | 
						|
class NotSupportedException(DOMException):
 | 
						|
    code = NOT_SUPPORTED_ERR
 | 
						|
class InUseAttributeException(DOMException):
 | 
						|
    code = INUSE_ATTRIBUTE_ERR
 | 
						|
 | 
						|
# Node classes
 | 
						|
# ------------
 | 
						|
 | 
						|
class ParentNode:
 | 
						|
   """
 | 
						|
   A node that can have children, or, more precisely, that implements
 | 
						|
   the child access methods of the DOM.
 | 
						|
   """
 | 
						|
 | 
						|
   def getChildNodes(self, type=type, st=type('')):
 | 
						|
      """
 | 
						|
      Returns a NodeList that contains all children of this node.
 | 
						|
      If there are no children, this is a empty NodeList
 | 
						|
      """
 | 
						|
      
 | 
						|
      r=[]
 | 
						|
      for n in self.getChildren():
 | 
						|
         if type(n) is st: n=TextNode(n)
 | 
						|
         r.append(n.__of__(self))
 | 
						|
      
 | 
						|
      return  NodeList(r)
 | 
						|
   
 | 
						|
   def getFirstChild(self, type=type, st=type('')):
 | 
						|
      """
 | 
						|
      The first child of this node. If there is no such node
 | 
						|
      this returns None
 | 
						|
      """
 | 
						|
      children = self.getChildren()
 | 
						|
 | 
						|
      if not children:
 | 
						|
         return None
 | 
						|
         
 | 
						|
      n=children[0]
 | 
						|
 | 
						|
      if type(n) is st:
 | 
						|
         n=TextNode(n)
 | 
						|
         
 | 
						|
      return n.__of__(self)
 | 
						|
 | 
						|
   def getLastChild(self, type=type, st=type('')):
 | 
						|
      """
 | 
						|
      The last child of this node.  If there is no such node
 | 
						|
      this returns None.
 | 
						|
      """
 | 
						|
      children = self.getChildren()
 | 
						|
      if not children: return None
 | 
						|
      n=chidren[-1]
 | 
						|
      if type(n) is st: n=TextNode(n)
 | 
						|
      return n.__of__(self)
 | 
						|
 | 
						|
   """
 | 
						|
   create aliases for all above functions in the pythony way.
 | 
						|
   """
 | 
						|
   
 | 
						|
   def _get_ChildNodes(self, type=type, st=type('')):
 | 
						|
      return self.getChildNodes(type,st)
 | 
						|
   
 | 
						|
   def _get_FirstChild(self, type=type, st=type('')):
 | 
						|
      return self.getFirstChild(type,st)
 | 
						|
 | 
						|
   def _get_LastChild(self, type=type, st=type('')):
 | 
						|
      return self.getLastChild(type,st)
 | 
						|
  
 | 
						|
class NodeWrapper(ParentNode):
 | 
						|
   """
 | 
						|
   This is an acquisition-like wrapper that provides parent access for 
 | 
						|
   DOM sans circular references!
 | 
						|
   """
 | 
						|
 | 
						|
   def __init__(self, aq_self, aq_parent):
 | 
						|
      self.aq_self=aq_self
 | 
						|
      self.aq_parent=aq_parent
 | 
						|
 | 
						|
   def __getattr__(self, name):
 | 
						|
      return getattr(self.aq_self, name)
 | 
						|
    
 | 
						|
   def getParentNode(self):
 | 
						|
      """
 | 
						|
      The parent of this node.  All nodes except Document
 | 
						|
      DocumentFragment and Attr may have a parent
 | 
						|
      """
 | 
						|
      return self.aq_parent
 | 
						|
 | 
						|
   def _getDOMIndex(self, children, getattr=getattr):
 | 
						|
      i=0
 | 
						|
      self=self.aq_self
 | 
						|
      for child in children:
 | 
						|
         if getattr(child, 'aq_self', child) is self:
 | 
						|
            self._DOMIndex=i
 | 
						|
            return i
 | 
						|
         i=i+1
 | 
						|
      return None
 | 
						|
 | 
						|
   def getPreviousSibling(self,
 | 
						|
                          type=type,
 | 
						|
                          st=type(''),
 | 
						|
                          getattr=getattr,
 | 
						|
                          None=None):
 | 
						|
 | 
						|
      """
 | 
						|
      The node immediately preceding this node.  If
 | 
						|
      there is no such node, this returns None.
 | 
						|
      """
 | 
						|
      
 | 
						|
      children = self.aq_parent.getChildren()
 | 
						|
      if not children:
 | 
						|
         return None
 | 
						|
 | 
						|
      index=getattr(self, '_DOMIndex', None)
 | 
						|
      if index is None:
 | 
						|
         index=self._getDOMIndex(children)
 | 
						|
         if index is None: return None
 | 
						|
 | 
						|
      index=index-1
 | 
						|
      if index < 0: return None
 | 
						|
      try: n=children[index]
 | 
						|
      except IndexError: return None
 | 
						|
      else:
 | 
						|
         if type(n) is st:
 | 
						|
            n=TextNode(n)
 | 
						|
         n._DOMIndex=index
 | 
						|
         return n.__of__(self)
 | 
						|
 | 
						|
 | 
						|
   def getNextSibling(self, type=type, st=type('')):
 | 
						|
      """
 | 
						|
      The node immediately preceding this node.  If
 | 
						|
      there is no such node, this returns None.
 | 
						|
      """
 | 
						|
      children = self.aq_parent.getChildren()
 | 
						|
      if not children:
 | 
						|
         return None
 | 
						|
 | 
						|
      index=getattr(self, '_DOMIndex', None)
 | 
						|
      if index is None:
 | 
						|
         index=self._getDOMIndex(children)
 | 
						|
         if index is None:
 | 
						|
            return None
 | 
						|
 | 
						|
      index=index+1
 | 
						|
      try: n=children[index]
 | 
						|
      except IndexError:
 | 
						|
         return None
 | 
						|
      else:
 | 
						|
         if type(n) is st:
 | 
						|
            n=TextNode(n)
 | 
						|
         n._DOMIndex=index
 | 
						|
         return n.__of__(self)
 | 
						|
 | 
						|
   def getOwnerDocument(self):
 | 
						|
      """
 | 
						|
      The Document object associated with this node, if any.
 | 
						|
      """
 | 
						|
      return self.aq_parent.getOwnerDocument()
 | 
						|
 | 
						|
   """
 | 
						|
   create aliases for all above functions in the pythony way.   
 | 
						|
   """
 | 
						|
   
 | 
						|
   def _get_ParentNode(self):
 | 
						|
      return self.getParentNode()
 | 
						|
 | 
						|
   def _get_DOMIndex(self, children, getattr=getattr):
 | 
						|
      return self._getDOMIndex(children,getattr)
 | 
						|
      
 | 
						|
   def _get_PreviousSibling(self,
 | 
						|
                          type=type,
 | 
						|
                          st=type(''),
 | 
						|
                          getattr=getattr,
 | 
						|
                          None=None):
 | 
						|
 | 
						|
      return self.getPreviousSibling(type,st,getattr,None)
 | 
						|
      
 | 
						|
   def _get_NextSibling(self, type=type, st=type('')):
 | 
						|
      return self.getNextSibling(type,st)
 | 
						|
      
 | 
						|
   def _get_OwnerDocument(self):
 | 
						|
      return self.getOwnerDocument()
 | 
						|
      
 | 
						|
class Node(ParentNode):
 | 
						|
   """
 | 
						|
   Node Interface
 | 
						|
   """
 | 
						|
 | 
						|
   # Get a DOM wrapper with a parent link
 | 
						|
   def __of__(self, parent):
 | 
						|
      return NodeWrapper(self, parent)
 | 
						|
 | 
						|
   # DOM attributes    
 | 
						|
   # --------------
 | 
						|
    
 | 
						|
   def getNodeName(self):
 | 
						|
      """
 | 
						|
      The name of this node, depending on its type
 | 
						|
      """
 | 
						|
 | 
						|
   def getNodeValue(self):
 | 
						|
      """
 | 
						|
      The value of this node, depending on its type
 | 
						|
      """
 | 
						|
      return None
 | 
						|
 | 
						|
   def getParentNode(self):
 | 
						|
      """
 | 
						|
      The parent of this node.  All nodes except Document
 | 
						|
      DocumentFragment and Attr may have a parent
 | 
						|
      """
 | 
						|
 | 
						|
   def getChildren(self):
 | 
						|
      """
 | 
						|
      Get a Python sequence of children
 | 
						|
      """
 | 
						|
      return ()
 | 
						|
 | 
						|
   def getPreviousSibling(self,
 | 
						|
                          type=type,
 | 
						|
                          st=type(''),
 | 
						|
                          getattr=getattr,
 | 
						|
                          None=None):
 | 
						|
      """
 | 
						|
      The node immediately preceding this node.  If
 | 
						|
      there is no such node, this returns None.
 | 
						|
      """
 | 
						|
 | 
						|
   def getNextSibling(self, type=type, st=type('')):
 | 
						|
      """
 | 
						|
      The node immediately preceding this node.  If
 | 
						|
      there is no such node, this returns None.
 | 
						|
      """
 | 
						|
 | 
						|
   def getAttributes(self):
 | 
						|
      """
 | 
						|
      Returns a NamedNodeMap containing the attributes
 | 
						|
      of this node (if it is an element) or None otherwise.
 | 
						|
      """
 | 
						|
      return None
 | 
						|
 | 
						|
   def getOwnerDocument(self):
 | 
						|
      """
 | 
						|
      The Document object associated with this node, if any.
 | 
						|
      """
 | 
						|
        
 | 
						|
    # DOM Methods    
 | 
						|
    # -----------
 | 
						|
    
 | 
						|
   def hasChildNodes(self):
 | 
						|
      """
 | 
						|
      Returns true if the node has any children, false
 | 
						|
      if it doesn't.
 | 
						|
      """
 | 
						|
      return len(self.getChildren())
 | 
						|
 | 
						|
   """
 | 
						|
   create aliases for all above functions in the pythony way.
 | 
						|
   """
 | 
						|
 | 
						|
   def _get_NodeName(self):
 | 
						|
      return self.getNodeName()
 | 
						|
      
 | 
						|
   def _get_NodeValue(self):
 | 
						|
      return self.getNodeValue()
 | 
						|
      
 | 
						|
   def _get_ParentNode(self):
 | 
						|
      return self.getParentNode()
 | 
						|
 | 
						|
   def _get_Children(self):
 | 
						|
      return self.getChildren()
 | 
						|
 | 
						|
   def _get_PreviousSibling(self,
 | 
						|
                          type=type,
 | 
						|
                          st=type(''),
 | 
						|
                          getattr=getattr,
 | 
						|
                          None=None):
 | 
						|
      
 | 
						|
      return self.getPreviousSibling(type,st,getattr,None)
 | 
						|
      
 | 
						|
   def _get_NextSibling(self, type=type, st=type('')):
 | 
						|
      return self.getNextSibling()
 | 
						|
 | 
						|
   def _get_Attributes(self):
 | 
						|
      return self.getAttributes()
 | 
						|
 | 
						|
   def _get_OwnerDocument(self):
 | 
						|
      return self.getOwnerDocument()
 | 
						|
    
 | 
						|
   def _has_ChildNodes(self):
 | 
						|
      return self.hasChildNodes()
 | 
						|
      
 | 
						|
         
 | 
						|
class TextNode(Node):
 | 
						|
 | 
						|
   def __init__(self, str): self._value=str
 | 
						|
      
 | 
						|
   def getNodeType(self):
 | 
						|
      return TEXT_NODE
 | 
						|
      
 | 
						|
   def getNodeName(self):
 | 
						|
      return '#text'
 | 
						|
 | 
						|
   def getNodeValue(self):
 | 
						|
      return self._value
 | 
						|
   
 | 
						|
   """
 | 
						|
   create aliases for all above functions in the pythony way.
 | 
						|
   """
 | 
						|
   
 | 
						|
   def _get_NodeType(self):
 | 
						|
      return self.getNodeType()
 | 
						|
      
 | 
						|
   def _get_NodeName(self):
 | 
						|
      return self.getNodeName()
 | 
						|
 | 
						|
   def _get_NodeValue(self):
 | 
						|
      return self.getNodeValue()
 | 
						|
 | 
						|
class Element(Node):
 | 
						|
   """
 | 
						|
   Element interface
 | 
						|
   """
 | 
						|
    
 | 
						|
   # Element Attributes
 | 
						|
   # ------------------
 | 
						|
    
 | 
						|
   def getTagName(self):
 | 
						|
      """The name of the element"""
 | 
						|
      return self.__class__.__name__
 | 
						|
    
 | 
						|
   def getNodeName(self):
 | 
						|
      """The name of this node, depending on its type"""
 | 
						|
      return self.__class__.__name__
 | 
						|
      
 | 
						|
   def getNodeType(self):
 | 
						|
      """A code representing the type of the node."""
 | 
						|
      return ELEMENT_NODE
 | 
						|
 | 
						|
   def getNodeValue(self, type=type, st=type('')):
 | 
						|
      r=[]
 | 
						|
      for c in self.getChildren():
 | 
						|
         if type(c) is not st:
 | 
						|
            c=c.getNodeValue()
 | 
						|
         r.append(c)
 | 
						|
      return string.join(r,'')
 | 
						|
    
 | 
						|
   def getParentNode(self):
 | 
						|
      """
 | 
						|
      The parent of this node.  All nodes except Document
 | 
						|
      DocumentFragment and Attr may have a parent
 | 
						|
      """
 | 
						|
      
 | 
						|
   # Element Methods
 | 
						|
   # ---------------
 | 
						|
    
 | 
						|
   _attributes=()
 | 
						|
 | 
						|
   def getAttribute(self, name): return getattr(self, name, None)
 | 
						|
   def getAttributeNode(self, name):
 | 
						|
      if hasattr(self, name):
 | 
						|
         return Attr(name, getattr(self, name))
 | 
						|
 | 
						|
   def getAttributes(self):
 | 
						|
      d={}
 | 
						|
      for a in self._attributes:
 | 
						|
         d[a]=getattr(self, a, '')
 | 
						|
      return NamedNodeMap(d)
 | 
						|
 | 
						|
   def getAttribute(self, name):
 | 
						|
      """Retrieves an attribute value by name."""
 | 
						|
      return None
 | 
						|
 | 
						|
   def getAttributeNode(self, name):
 | 
						|
      """ Retrieves an Attr node by name or None if
 | 
						|
      there is no such attribute. """
 | 
						|
      return None
 | 
						|
 | 
						|
   def getElementsByTagName(self, tagname):
 | 
						|
      """
 | 
						|
      Returns a NodeList of all the Elements with a given tag
 | 
						|
      name in the order in which they would be encountered in a
 | 
						|
      preorder traversal of the Document tree.  Parameter: tagname
 | 
						|
      The name of the tag to match (* = all tags). Return Value: A new
 | 
						|
      NodeList object containing all the matched Elements.
 | 
						|
      """
 | 
						|
      nodeList = []
 | 
						|
      for child in self.getChildren():
 | 
						|
         if (child.getNodeType()==ELEMENT_NODE and \
 | 
						|
             child.getTagName()==tagname or tagname== '*'):
 | 
						|
                
 | 
						|
            nodeList.append(child)
 | 
						|
               
 | 
						|
         if hasattr(child, 'getElementsByTagName'):
 | 
						|
            n1       = child.getElementsByTagName(tagname)
 | 
						|
            nodeList = nodeList + n1._data
 | 
						|
      return NodeList(nodeList)
 | 
						|
   
 | 
						|
   """
 | 
						|
   create aliases for all above functions in the pythony way.
 | 
						|
   """
 | 
						|
 | 
						|
   def _get_TagName(self):
 | 
						|
      return self.getTagName()
 | 
						|
      
 | 
						|
   def _get_NodeName(self):
 | 
						|
      return self.getNodeName()
 | 
						|
      
 | 
						|
   def _get_NodeType(self):
 | 
						|
      return self.getNodeType()
 | 
						|
      
 | 
						|
   def _get_NodeValue(self, type=type, st=type('')):
 | 
						|
      return self.getNodeValue(type,st)
 | 
						|
      
 | 
						|
   def _get_ParentNode(self):
 | 
						|
      return self.getParentNode()
 | 
						|
      
 | 
						|
   def _get_Attribute(self, name):
 | 
						|
      return self.getAttribute(name)
 | 
						|
   
 | 
						|
   def _get_AttributeNode(self, name):
 | 
						|
      return self.getAttributeNode(name)
 | 
						|
      
 | 
						|
   def _get_Attributes(self):
 | 
						|
      return self.getAttributes()
 | 
						|
      
 | 
						|
   def _get_Attribute(self, name):
 | 
						|
      return self.getAttribute(name)
 | 
						|
      
 | 
						|
   def _get_AttributeNode(self, name):
 | 
						|
      return self.getAttributeNode(name)
 | 
						|
      
 | 
						|
   def _get_ElementsByTagName(self, tagname):
 | 
						|
      return self.getElementsByTagName(tagname)
 | 
						|
      
 | 
						|
         
 | 
						|
class NodeList:
 | 
						|
   """
 | 
						|
   NodeList interface - Provides the abstraction of an ordered
 | 
						|
   collection of nodes.
 | 
						|
    
 | 
						|
   Python extensions: can use sequence-style 'len', 'getitem', and
 | 
						|
   'for..in' constructs.
 | 
						|
   """
 | 
						|
    
 | 
						|
   def __init__(self,list=None):
 | 
						|
      self._data = list or []
 | 
						|
    
 | 
						|
   def __getitem__(self, index, type=type, st=type('')):
 | 
						|
      return self._data[index]
 | 
						|
 | 
						|
   def __getslice__(self, i, j):
 | 
						|
      return self._data[i:j]
 | 
						|
    
 | 
						|
   def item(self, index):
 | 
						|
      """
 | 
						|
      Returns the index-th item in the collection
 | 
						|
      """
 | 
						|
      try:  return self._data[index]    
 | 
						|
      except IndexError: return None
 | 
						|
         
 | 
						|
   def getLength(self):
 | 
						|
      """
 | 
						|
      The length of the NodeList
 | 
						|
      """
 | 
						|
      return len(self._data)
 | 
						|
    
 | 
						|
   __len__=getLength
 | 
						|
   
 | 
						|
   """
 | 
						|
   create aliases for all above functions in the pythony way.
 | 
						|
   """
 | 
						|
   
 | 
						|
   def _get_Length(self):
 | 
						|
      return self.getLength()
 | 
						|
 
 | 
						|
class NamedNodeMap:
 | 
						|
   """
 | 
						|
   NamedNodeMap interface - Is used to represent collections
 | 
						|
   of nodes that can be accessed by name.  NamedNodeMaps are not
 | 
						|
   maintained in any particular order.
 | 
						|
    
 | 
						|
   Python extensions: can use sequence-style 'len', 'getitem', and
 | 
						|
   'for..in' constructs, and mapping-style 'getitem'.
 | 
						|
   """
 | 
						|
    
 | 
						|
   def __init__(self, data=None):
 | 
						|
      if data is None:
 | 
						|
         data = {}
 | 
						|
      self._data = data
 | 
						|
 | 
						|
   def item(self, index):
 | 
						|
      """
 | 
						|
      Returns the index-th item in the map
 | 
						|
      """
 | 
						|
      try: return self._data.values()[index]
 | 
						|
      except IndexError: return None
 | 
						|
        
 | 
						|
   def __getitem__(self, key):
 | 
						|
      if type(key)==type(1):
 | 
						|
         return self._data.values()[key]
 | 
						|
      else:
 | 
						|
         return self._data[key]
 | 
						|
            
 | 
						|
   def getLength(self):
 | 
						|
      """
 | 
						|
      The length of the NodeList
 | 
						|
      """
 | 
						|
      return len(self._data)
 | 
						|
    
 | 
						|
   __len__ = getLength
 | 
						|
    
 | 
						|
   def getNamedItem(self, name):
 | 
						|
      """
 | 
						|
      Retrieves a node specified by name. Parameters:
 | 
						|
      name Name of a node to retrieve. Return Value A Node (of any
 | 
						|
      type) with the specified name, or None if the specified name
 | 
						|
      did not identify any node in the map.
 | 
						|
      """
 | 
						|
      if self._data.has_key(name): 
 | 
						|
         return self._data[name]
 | 
						|
      return None
 | 
						|
 | 
						|
   """
 | 
						|
   create aliases for all above functions in the pythony way.
 | 
						|
   """
 | 
						|
   def _get_Length(self):
 | 
						|
      return self.getLength()
 | 
						|
      
 | 
						|
   def _get_NamedItem(self, name):
 | 
						|
      return self.getNamedItem(name)
 | 
						|
      
 | 
						|
class Attr(Node):
 | 
						|
   """
 | 
						|
   Attr interface - The Attr interface represents an attriubte in an
 | 
						|
   Element object. Attr objects inherit the Node Interface
 | 
						|
   """
 | 
						|
 | 
						|
   def __init__(self, name, value, specified=1):
 | 
						|
      self.name = name
 | 
						|
      self.value = value
 | 
						|
      self.specified = specified
 | 
						|
        
 | 
						|
   def getNodeName(self):
 | 
						|
      """
 | 
						|
      The name of this node, depending on its type
 | 
						|
      """
 | 
						|
      return self.name
 | 
						|
 | 
						|
   def getName(self):
 | 
						|
      """
 | 
						|
      Returns the name of this attribute.
 | 
						|
      """
 | 
						|
      return self.name
 | 
						|
    
 | 
						|
   def getNodeValue(self):
 | 
						|
      """
 | 
						|
      The value of this node, depending on its type
 | 
						|
      """
 | 
						|
      return self.value
 | 
						|
 | 
						|
   def getNodeType(self):
 | 
						|
      """
 | 
						|
      A code representing the type of the node.
 | 
						|
      """
 | 
						|
      return ATTRIBUTE_NODE
 | 
						|
 | 
						|
   def getSpecified(self):
 | 
						|
      """
 | 
						|
      If this attribute was explicitly given a value in the
 | 
						|
      original document, this is true; otherwise, it is false.
 | 
						|
      """
 | 
						|
      return self.specified
 | 
						|
        
 | 
						|
   """
 | 
						|
   create aliases for all above functions in the pythony way.
 | 
						|
   """
 | 
						|
   
 | 
						|
   def _get_NodeName(self):
 | 
						|
      return self.getNodeName()
 | 
						|
 | 
						|
   def _get_Name(self):
 | 
						|
      return self.getName()
 | 
						|
    
 | 
						|
   def _get_NodeValue(self):
 | 
						|
      return self.getNodeValue()
 | 
						|
 | 
						|
   def _get_NodeType(self):
 | 
						|
      return self.getNodeType()
 | 
						|
 | 
						|
   def _get_Specified(self):
 | 
						|
      return self.getSpecified()
 |