home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2010 November / maximum-cd-2010-11.iso / DiscContents / calibre-0.7.13.msi / file_2858 (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-08-06  |  58.4 KB  |  2,047 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. import xml.dom as xml
  5. from xml.dom import EMPTY_NAMESPACE, EMPTY_PREFIX, XMLNS_NAMESPACE, domreg
  6. from xml.dom.minicompat import *
  7. from xml.dom.xmlbuilder import DOMImplementationLS, DocumentLS
  8. _nodeTypes_with_children = (xml.dom.Node.ELEMENT_NODE, xml.dom.Node.ENTITY_REFERENCE_NODE)
  9.  
  10. class Node(xml.dom.Node):
  11.     namespaceURI = None
  12.     parentNode = None
  13.     ownerDocument = None
  14.     nextSibling = None
  15.     previousSibling = None
  16.     prefix = EMPTY_PREFIX
  17.     
  18.     def __nonzero__(self):
  19.         return True
  20.  
  21.     
  22.     def toxml(self, encoding = None):
  23.         return self.toprettyxml('', '', encoding)
  24.  
  25.     
  26.     def toprettyxml(self, indent = '\t', newl = '\n', encoding = None):
  27.         writer = _get_StringIO()
  28.         if encoding is not None:
  29.             import codecs
  30.             writer = codecs.lookup(encoding)[3](writer)
  31.         
  32.         if self.nodeType == Node.DOCUMENT_NODE:
  33.             self.writexml(writer, '', indent, newl, encoding)
  34.         else:
  35.             self.writexml(writer, '', indent, newl)
  36.         return writer.getvalue()
  37.  
  38.     
  39.     def hasChildNodes(self):
  40.         if self.childNodes:
  41.             return True
  42.         return False
  43.  
  44.     
  45.     def _get_childNodes(self):
  46.         return self.childNodes
  47.  
  48.     
  49.     def _get_firstChild(self):
  50.         if self.childNodes:
  51.             return self.childNodes[0]
  52.  
  53.     
  54.     def _get_lastChild(self):
  55.         if self.childNodes:
  56.             return self.childNodes[-1]
  57.  
  58.     
  59.     def insertBefore(self, newChild, refChild):
  60.         if newChild.nodeType == self.DOCUMENT_FRAGMENT_NODE:
  61.             for c in tuple(newChild.childNodes):
  62.                 self.insertBefore(c, refChild)
  63.             
  64.             return newChild
  65.         if newChild.nodeType not in self._child_node_types:
  66.             raise xml.dom.HierarchyRequestErr('%s cannot be child of %s' % (repr(newChild), repr(self)))
  67.         newChild.nodeType not in self._child_node_types
  68.         if newChild.parentNode is not None:
  69.             newChild.parentNode.removeChild(newChild)
  70.         
  71.         if refChild is None:
  72.             self.appendChild(newChild)
  73.         else:
  74.             
  75.             try:
  76.                 index = self.childNodes.index(refChild)
  77.             except ValueError:
  78.                 raise xml.dom.NotFoundErr()
  79.  
  80.             if newChild.nodeType in _nodeTypes_with_children:
  81.                 _clear_id_cache(self)
  82.             
  83.             self.childNodes.insert(index, newChild)
  84.             newChild.nextSibling = refChild
  85.             refChild.previousSibling = newChild
  86.             if index:
  87.                 node = self.childNodes[index - 1]
  88.                 node.nextSibling = newChild
  89.                 newChild.previousSibling = node
  90.             else:
  91.                 newChild.previousSibling = None
  92.             newChild.parentNode = self
  93.         return newChild
  94.  
  95.     
  96.     def appendChild(self, node):
  97.         if node.nodeType == self.DOCUMENT_FRAGMENT_NODE:
  98.             for c in tuple(node.childNodes):
  99.                 self.appendChild(c)
  100.             
  101.             return node
  102.         if node.nodeType not in self._child_node_types:
  103.             raise xml.dom.HierarchyRequestErr('%s cannot be child of %s' % (repr(node), repr(self)))
  104.         node.nodeType not in self._child_node_types
  105.         if node.nodeType in _nodeTypes_with_children:
  106.             _clear_id_cache(self)
  107.         
  108.         if node.parentNode is not None:
  109.             node.parentNode.removeChild(node)
  110.         
  111.         _append_child(self, node)
  112.         node.nextSibling = None
  113.         return node
  114.  
  115.     
  116.     def replaceChild(self, newChild, oldChild):
  117.         if newChild.nodeType == self.DOCUMENT_FRAGMENT_NODE:
  118.             refChild = oldChild.nextSibling
  119.             self.removeChild(oldChild)
  120.             return self.insertBefore(newChild, refChild)
  121.         if newChild.nodeType not in self._child_node_types:
  122.             raise xml.dom.HierarchyRequestErr('%s cannot be child of %s' % (repr(newChild), repr(self)))
  123.         newChild.nodeType not in self._child_node_types
  124.         if newChild is oldChild:
  125.             return None
  126.         
  127.         try:
  128.             index = self.childNodes.index(oldChild)
  129.         except ValueError:
  130.             None if newChild.parentNode is not None else newChild.nodeType == self.DOCUMENT_FRAGMENT_NODE
  131.             None if newChild.parentNode is not None else newChild.nodeType == self.DOCUMENT_FRAGMENT_NODE
  132.             raise xml.dom.NotFoundErr()
  133.         except:
  134.             None if newChild.parentNode is not None else newChild.nodeType == self.DOCUMENT_FRAGMENT_NODE
  135.  
  136.         self.childNodes[index] = newChild
  137.         newChild.parentNode = self
  138.         oldChild.parentNode = None
  139.         if newChild.nodeType in _nodeTypes_with_children or oldChild.nodeType in _nodeTypes_with_children:
  140.             _clear_id_cache(self)
  141.         
  142.         newChild.nextSibling = oldChild.nextSibling
  143.         newChild.previousSibling = oldChild.previousSibling
  144.         oldChild.nextSibling = None
  145.         oldChild.previousSibling = None
  146.         if newChild.previousSibling:
  147.             newChild.previousSibling.nextSibling = newChild
  148.         
  149.         if newChild.nextSibling:
  150.             newChild.nextSibling.previousSibling = newChild
  151.         
  152.         return oldChild
  153.  
  154.     
  155.     def removeChild(self, oldChild):
  156.         
  157.         try:
  158.             self.childNodes.remove(oldChild)
  159.         except ValueError:
  160.             raise xml.dom.NotFoundErr()
  161.  
  162.         if oldChild.nextSibling is not None:
  163.             oldChild.nextSibling.previousSibling = oldChild.previousSibling
  164.         
  165.         if oldChild.previousSibling is not None:
  166.             oldChild.previousSibling.nextSibling = oldChild.nextSibling
  167.         
  168.         oldChild.nextSibling = None
  169.         oldChild.previousSibling = None
  170.         if oldChild.nodeType in _nodeTypes_with_children:
  171.             _clear_id_cache(self)
  172.         
  173.         oldChild.parentNode = None
  174.         return oldChild
  175.  
  176.     
  177.     def normalize(self):
  178.         L = []
  179.         for child in self.childNodes:
  180.             if child.nodeType == Node.TEXT_NODE:
  181.                 data = child.data
  182.                 if data and L and L[-1].nodeType == child.nodeType:
  183.                     node = L[-1]
  184.                     node.data = node.data + child.data
  185.                     node.nextSibling = child.nextSibling
  186.                     child.unlink()
  187.                 elif data:
  188.                     if L:
  189.                         L[-1].nextSibling = child
  190.                         child.previousSibling = L[-1]
  191.                     else:
  192.                         child.previousSibling = None
  193.                     L.append(child)
  194.                 else:
  195.                     child.unlink()
  196.             L[-1].nodeType == child.nodeType
  197.             if L:
  198.                 L[-1].nextSibling = child
  199.                 child.previousSibling = L[-1]
  200.             else:
  201.                 child.previousSibling = None
  202.             L.append(child)
  203.             if child.nodeType == Node.ELEMENT_NODE:
  204.                 child.normalize()
  205.                 continue
  206.         
  207.         if L:
  208.             L[-1].nextSibling = None
  209.         
  210.         self.childNodes[:] = L
  211.  
  212.     
  213.     def cloneNode(self, deep):
  214.         if not self.ownerDocument:
  215.             pass
  216.         return _clone_node(self, deep, self)
  217.  
  218.     
  219.     def isSupported(self, feature, version):
  220.         return self.ownerDocument.implementation.hasFeature(feature, version)
  221.  
  222.     
  223.     def _get_localName(self):
  224.         pass
  225.  
  226.     
  227.     def isSameNode(self, other):
  228.         return self is other
  229.  
  230.     
  231.     def getInterface(self, feature):
  232.         if self.isSupported(feature, None):
  233.             return self
  234.         return None
  235.  
  236.     
  237.     def getUserData(self, key):
  238.         
  239.         try:
  240.             return self._user_data[key][0]
  241.         except (AttributeError, KeyError):
  242.             return None
  243.  
  244.  
  245.     
  246.     def setUserData(self, key, data, handler):
  247.         old = None
  248.         
  249.         try:
  250.             d = self._user_data
  251.         except AttributeError:
  252.             d = { }
  253.             self._user_data = d
  254.  
  255.         if key in d:
  256.             old = d[key][0]
  257.         
  258.         if data is None:
  259.             handler = None
  260.             if old is not None:
  261.                 del d[key]
  262.             
  263.         else:
  264.             d[key] = (data, handler)
  265.         return old
  266.  
  267.     
  268.     def _call_user_data_handler(self, operation, src, dst):
  269.         if hasattr(self, '_user_data'):
  270.             for data, handler in self._user_data.items():
  271.                 if handler is not None:
  272.                     handler.handle(operation, key, data, src, dst)
  273.                     continue
  274.             
  275.         
  276.  
  277.     
  278.     def unlink(self):
  279.         self.parentNode = None
  280.         self.ownerDocument = None
  281.         if self.childNodes:
  282.             for child in self.childNodes:
  283.                 child.unlink()
  284.             
  285.             self.childNodes = NodeList()
  286.         
  287.         self.previousSibling = None
  288.         self.nextSibling = None
  289.  
  290.  
  291. defproperty(Node, 'firstChild', doc = 'First child node, or None.')
  292. defproperty(Node, 'lastChild', doc = 'Last child node, or None.')
  293. defproperty(Node, 'localName', doc = 'Namespace-local name of this node.')
  294.  
  295. def _append_child(self, node):
  296.     childNodes = self.childNodes
  297.     if childNodes:
  298.         last = childNodes[-1]
  299.         node.__dict__['previousSibling'] = last
  300.         last.__dict__['nextSibling'] = node
  301.     
  302.     childNodes.append(node)
  303.     node.__dict__['parentNode'] = self
  304.  
  305.  
  306. def _in_document(node):
  307.     while node is not None:
  308.         if node.nodeType == Node.DOCUMENT_NODE:
  309.             return True
  310.         node = node.parentNode
  311.         continue
  312.         node.nodeType == Node.DOCUMENT_NODE
  313.     return False
  314.  
  315.  
  316. def _write_data(writer, data):
  317.     data = data.replace('&', '&').replace('<', '<')
  318.     data = data.replace('"', '"').replace('>', '>')
  319.     writer.write(data)
  320.  
  321.  
  322. def _get_elements_by_tagName_helper(parent, name, rc):
  323.     for node in parent.childNodes:
  324.         if node.nodeType == Node.ELEMENT_NODE:
  325.             if name == '*' or node.tagName == name:
  326.                 rc.append(node)
  327.             
  328.         _get_elements_by_tagName_helper(node, name, rc)
  329.     
  330.     return rc
  331.  
  332.  
  333. def _get_elements_by_tagName_ns_helper(parent, nsURI, localName, rc):
  334.     for node in parent.childNodes:
  335.         if node.nodeType == Node.ELEMENT_NODE:
  336.             if localName == '*' or node.localName == localName:
  337.                 if nsURI == '*' or node.namespaceURI == nsURI:
  338.                     rc.append(node)
  339.                 
  340.             _get_elements_by_tagName_ns_helper(node, nsURI, localName, rc)
  341.             continue
  342.     
  343.     return rc
  344.  
  345.  
  346. class DocumentFragment(Node):
  347.     nodeType = Node.DOCUMENT_FRAGMENT_NODE
  348.     nodeName = '#document-fragment'
  349.     nodeValue = None
  350.     attributes = None
  351.     parentNode = None
  352.     _child_node_types = (Node.ELEMENT_NODE, Node.TEXT_NODE, Node.CDATA_SECTION_NODE, Node.ENTITY_REFERENCE_NODE, Node.PROCESSING_INSTRUCTION_NODE, Node.COMMENT_NODE, Node.NOTATION_NODE)
  353.     
  354.     def __init__(self):
  355.         self.childNodes = NodeList()
  356.  
  357.  
  358.  
  359. class Attr(Node):
  360.     nodeType = Node.ATTRIBUTE_NODE
  361.     attributes = None
  362.     ownerElement = None
  363.     specified = False
  364.     _is_id = False
  365.     _child_node_types = (Node.TEXT_NODE, Node.ENTITY_REFERENCE_NODE)
  366.     
  367.     def __init__(self, qName, namespaceURI = EMPTY_NAMESPACE, localName = None, prefix = None):
  368.         d = self.__dict__
  369.         d['nodeName'] = d['name'] = qName
  370.         d['namespaceURI'] = namespaceURI
  371.         d['prefix'] = prefix
  372.         d['childNodes'] = NodeList()
  373.         self.childNodes.append(Text())
  374.  
  375.     
  376.     def _get_localName(self):
  377.         return self.nodeName.split(':', 1)[-1]
  378.  
  379.     
  380.     def _get_name(self):
  381.         return self.name
  382.  
  383.     
  384.     def _get_specified(self):
  385.         return self.specified
  386.  
  387.     
  388.     def __setattr__(self, name, value):
  389.         d = self.__dict__
  390.         if name in ('value', 'nodeValue'):
  391.             d['value'] = d['nodeValue'] = value
  392.             d2 = self.childNodes[0].__dict__
  393.             d2['data'] = d2['nodeValue'] = value
  394.             if self.ownerElement is not None:
  395.                 _clear_id_cache(self.ownerElement)
  396.             
  397.         elif name in ('name', 'nodeName'):
  398.             d['name'] = d['nodeName'] = value
  399.             if self.ownerElement is not None:
  400.                 _clear_id_cache(self.ownerElement)
  401.             
  402.         else:
  403.             d[name] = value
  404.  
  405.     
  406.     def _set_prefix(self, prefix):
  407.         nsuri = self.namespaceURI
  408.         if prefix == 'xmlns':
  409.             if nsuri and nsuri != XMLNS_NAMESPACE:
  410.                 raise xml.dom.NamespaceErr("illegal use of 'xmlns' prefix for the wrong namespace")
  411.             nsuri != XMLNS_NAMESPACE
  412.         
  413.         d = self.__dict__
  414.         d['prefix'] = prefix
  415.         if prefix is None:
  416.             newName = self.localName
  417.         else:
  418.             newName = '%s:%s' % (prefix, self.localName)
  419.         if self.ownerElement:
  420.             _clear_id_cache(self.ownerElement)
  421.         
  422.         d['nodeName'] = d['name'] = newName
  423.  
  424.     
  425.     def _set_value(self, value):
  426.         d = self.__dict__
  427.         d['value'] = d['nodeValue'] = value
  428.         if self.ownerElement:
  429.             _clear_id_cache(self.ownerElement)
  430.         
  431.         self.childNodes[0].data = value
  432.  
  433.     
  434.     def unlink(self):
  435.         elem = self.ownerElement
  436.         if elem is not None:
  437.             del elem._attrs[self.nodeName]
  438.             del elem._attrsNS[(self.namespaceURI, self.localName)]
  439.             if self._is_id:
  440.                 self._is_id = False
  441.                 elem._magic_id_nodes -= 1
  442.                 self.ownerDocument._magic_id_count -= 1
  443.             
  444.         
  445.         for child in self.childNodes:
  446.             child.unlink()
  447.         
  448.         del self.childNodes[:]
  449.  
  450.     
  451.     def _get_isId(self):
  452.         if self._is_id:
  453.             return True
  454.         doc = self.ownerDocument
  455.         elem = self.ownerElement
  456.         if doc is None or elem is None:
  457.             return False
  458.         info = doc._get_elem_info(elem)
  459.         if info is None:
  460.             return False
  461.         if self.namespaceURI:
  462.             return info.isIdNS(self.namespaceURI, self.localName)
  463.         return info.isId(self.nodeName)
  464.  
  465.     
  466.     def _get_schemaType(self):
  467.         doc = self.ownerDocument
  468.         elem = self.ownerElement
  469.         if doc is None or elem is None:
  470.             return _no_type
  471.         info = doc._get_elem_info(elem)
  472.         if info is None:
  473.             return _no_type
  474.         if self.namespaceURI:
  475.             return info.getAttributeTypeNS(self.namespaceURI, self.localName)
  476.         return info.getAttributeType(self.nodeName)
  477.  
  478.  
  479. defproperty(Attr, 'isId', doc = 'True if this attribute is an ID.')
  480. defproperty(Attr, 'localName', doc = 'Namespace-local name of this attribute.')
  481. defproperty(Attr, 'schemaType', doc = 'Schema type for this attribute.')
  482.  
  483. class NamedNodeMap(object):
  484.     __slots__ = ('_attrs', '_attrsNS', '_ownerElement')
  485.     
  486.     def __init__(self, attrs, attrsNS, ownerElement):
  487.         self._attrs = attrs
  488.         self._attrsNS = attrsNS
  489.         self._ownerElement = ownerElement
  490.  
  491.     
  492.     def _get_length(self):
  493.         return len(self._attrs)
  494.  
  495.     
  496.     def item(self, index):
  497.         
  498.         try:
  499.             return self[self._attrs.keys()[index]]
  500.         except IndexError:
  501.             return None
  502.  
  503.  
  504.     
  505.     def items(self):
  506.         L = []
  507.         for node in self._attrs.values():
  508.             L.append((node.nodeName, node.value))
  509.         
  510.         return L
  511.  
  512.     
  513.     def itemsNS(self):
  514.         L = []
  515.         for node in self._attrs.values():
  516.             L.append(((node.namespaceURI, node.localName), node.value))
  517.         
  518.         return L
  519.  
  520.     
  521.     def has_key(self, key):
  522.         if isinstance(key, StringTypes):
  523.             return self._attrs.has_key(key)
  524.         return self._attrsNS.has_key(key)
  525.  
  526.     
  527.     def keys(self):
  528.         return self._attrs.keys()
  529.  
  530.     
  531.     def keysNS(self):
  532.         return self._attrsNS.keys()
  533.  
  534.     
  535.     def values(self):
  536.         return self._attrs.values()
  537.  
  538.     
  539.     def get(self, name, value = None):
  540.         return self._attrs.get(name, value)
  541.  
  542.     __len__ = _get_length
  543.     __hash__ = None
  544.     
  545.     def __cmp__(self, other):
  546.         if self._attrs is getattr(other, '_attrs', None):
  547.             return 0
  548.         return cmp(id(self), id(other))
  549.  
  550.     
  551.     def __getitem__(self, attname_or_tuple):
  552.         if isinstance(attname_or_tuple, tuple):
  553.             return self._attrsNS[attname_or_tuple]
  554.         return self._attrs[attname_or_tuple]
  555.  
  556.     
  557.     def __setitem__(self, attname, value):
  558.         if isinstance(value, StringTypes):
  559.             
  560.             try:
  561.                 node = self._attrs[attname]
  562.             except KeyError:
  563.                 node = Attr(attname)
  564.                 node.ownerDocument = self._ownerElement.ownerDocument
  565.                 self.setNamedItem(node)
  566.  
  567.             node.value = value
  568.         elif not isinstance(value, Attr):
  569.             raise TypeError, 'value must be a string or Attr object'
  570.         
  571.         node = value
  572.         self.setNamedItem(node)
  573.  
  574.     
  575.     def getNamedItem(self, name):
  576.         
  577.         try:
  578.             return self._attrs[name]
  579.         except KeyError:
  580.             return None
  581.  
  582.  
  583.     
  584.     def getNamedItemNS(self, namespaceURI, localName):
  585.         
  586.         try:
  587.             return self._attrsNS[(namespaceURI, localName)]
  588.         except KeyError:
  589.             return None
  590.  
  591.  
  592.     
  593.     def removeNamedItem(self, name):
  594.         n = self.getNamedItem(name)
  595.         if n is not None:
  596.             _clear_id_cache(self._ownerElement)
  597.             del self._attrs[n.nodeName]
  598.             del self._attrsNS[(n.namespaceURI, n.localName)]
  599.             if 'ownerElement' in n.__dict__:
  600.                 n.__dict__['ownerElement'] = None
  601.             
  602.             return n
  603.         raise xml.dom.NotFoundErr()
  604.  
  605.     
  606.     def removeNamedItemNS(self, namespaceURI, localName):
  607.         n = self.getNamedItemNS(namespaceURI, localName)
  608.         if n is not None:
  609.             _clear_id_cache(self._ownerElement)
  610.             del self._attrsNS[(n.namespaceURI, n.localName)]
  611.             del self._attrs[n.nodeName]
  612.             if 'ownerElement' in n.__dict__:
  613.                 n.__dict__['ownerElement'] = None
  614.             
  615.             return n
  616.         raise xml.dom.NotFoundErr()
  617.  
  618.     
  619.     def setNamedItem(self, node):
  620.         if not isinstance(node, Attr):
  621.             raise xml.dom.HierarchyRequestErr('%s cannot be child of %s' % (repr(node), repr(self)))
  622.         isinstance(node, Attr)
  623.         old = self._attrs.get(node.name)
  624.         if old:
  625.             old.unlink()
  626.         
  627.         self._attrs[node.name] = node
  628.         self._attrsNS[(node.namespaceURI, node.localName)] = node
  629.         node.ownerElement = self._ownerElement
  630.         _clear_id_cache(node.ownerElement)
  631.         return old
  632.  
  633.     
  634.     def setNamedItemNS(self, node):
  635.         return self.setNamedItem(node)
  636.  
  637.     
  638.     def __delitem__(self, attname_or_tuple):
  639.         node = self[attname_or_tuple]
  640.         _clear_id_cache(node.ownerElement)
  641.         node.unlink()
  642.  
  643.     
  644.     def __getstate__(self):
  645.         return (self._attrs, self._attrsNS, self._ownerElement)
  646.  
  647.     
  648.     def __setstate__(self, state):
  649.         (self._attrs, self._attrsNS, self._ownerElement) = state
  650.  
  651.  
  652. defproperty(NamedNodeMap, 'length', doc = 'Number of nodes in the NamedNodeMap.')
  653. AttributeList = NamedNodeMap
  654.  
  655. class TypeInfo(object):
  656.     __slots__ = ('namespace', 'name')
  657.     
  658.     def __init__(self, namespace, name):
  659.         self.namespace = namespace
  660.         self.name = name
  661.  
  662.     
  663.     def __repr__(self):
  664.         if self.namespace:
  665.             return '<TypeInfo %r (from %r)>' % (self.name, self.namespace)
  666.         return '<TypeInfo %r>' % self.name
  667.  
  668.     
  669.     def _get_name(self):
  670.         return self.name
  671.  
  672.     
  673.     def _get_namespace(self):
  674.         return self.namespace
  675.  
  676.  
  677. _no_type = TypeInfo(None, None)
  678.  
  679. class Element(Node):
  680.     nodeType = Node.ELEMENT_NODE
  681.     nodeValue = None
  682.     schemaType = _no_type
  683.     _magic_id_nodes = 0
  684.     _child_node_types = (Node.ELEMENT_NODE, Node.PROCESSING_INSTRUCTION_NODE, Node.COMMENT_NODE, Node.TEXT_NODE, Node.CDATA_SECTION_NODE, Node.ENTITY_REFERENCE_NODE)
  685.     
  686.     def __init__(self, tagName, namespaceURI = EMPTY_NAMESPACE, prefix = None, localName = None):
  687.         self.tagName = self.nodeName = tagName
  688.         self.prefix = prefix
  689.         self.namespaceURI = namespaceURI
  690.         self.childNodes = NodeList()
  691.         self._attrs = { }
  692.         self._attrsNS = { }
  693.  
  694.     
  695.     def _get_localName(self):
  696.         return self.tagName.split(':', 1)[-1]
  697.  
  698.     
  699.     def _get_tagName(self):
  700.         return self.tagName
  701.  
  702.     
  703.     def unlink(self):
  704.         for attr in self._attrs.values():
  705.             attr.unlink()
  706.         
  707.         self._attrs = None
  708.         self._attrsNS = None
  709.         Node.unlink(self)
  710.  
  711.     
  712.     def getAttribute(self, attname):
  713.         
  714.         try:
  715.             return self._attrs[attname].value
  716.         except KeyError:
  717.             return ''
  718.  
  719.  
  720.     
  721.     def getAttributeNS(self, namespaceURI, localName):
  722.         
  723.         try:
  724.             return self._attrsNS[(namespaceURI, localName)].value
  725.         except KeyError:
  726.             return ''
  727.  
  728.  
  729.     
  730.     def setAttribute(self, attname, value):
  731.         attr = self.getAttributeNode(attname)
  732.         if attr is None:
  733.             attr = Attr(attname)
  734.             d = attr.__dict__
  735.             d['value'] = d['nodeValue'] = value
  736.             d['ownerDocument'] = self.ownerDocument
  737.             self.setAttributeNode(attr)
  738.         elif value != attr.value:
  739.             d = attr.__dict__
  740.             d['value'] = d['nodeValue'] = value
  741.             if attr.isId:
  742.                 _clear_id_cache(self)
  743.             
  744.         
  745.  
  746.     
  747.     def setAttributeNS(self, namespaceURI, qualifiedName, value):
  748.         (prefix, localname) = _nssplit(qualifiedName)
  749.         attr = self.getAttributeNodeNS(namespaceURI, localname)
  750.         if attr is None:
  751.             attr = Attr(qualifiedName, namespaceURI, localname, prefix)
  752.             d = attr.__dict__
  753.             d['prefix'] = prefix
  754.             d['nodeName'] = qualifiedName
  755.             d['value'] = d['nodeValue'] = value
  756.             d['ownerDocument'] = self.ownerDocument
  757.             self.setAttributeNode(attr)
  758.         else:
  759.             d = attr.__dict__
  760.             if value != attr.value:
  761.                 d['value'] = d['nodeValue'] = value
  762.                 if attr.isId:
  763.                     _clear_id_cache(self)
  764.                 
  765.             
  766.             if attr.prefix != prefix:
  767.                 d['prefix'] = prefix
  768.                 d['nodeName'] = qualifiedName
  769.             
  770.  
  771.     
  772.     def getAttributeNode(self, attrname):
  773.         return self._attrs.get(attrname)
  774.  
  775.     
  776.     def getAttributeNodeNS(self, namespaceURI, localName):
  777.         return self._attrsNS.get((namespaceURI, localName))
  778.  
  779.     
  780.     def setAttributeNode(self, attr):
  781.         if attr.ownerElement not in (None, self):
  782.             raise xml.dom.InuseAttributeErr('attribute node already owned')
  783.         attr.ownerElement not in (None, self)
  784.         old1 = self._attrs.get(attr.name, None)
  785.         if old1 is not None:
  786.             self.removeAttributeNode(old1)
  787.         
  788.         old2 = self._attrsNS.get((attr.namespaceURI, attr.localName), None)
  789.         if old2 is not None and old2 is not old1:
  790.             self.removeAttributeNode(old2)
  791.         
  792.         _set_attribute_node(self, attr)
  793.         if old1 is not attr:
  794.             return old1
  795.         if old2 is not attr:
  796.             return old2
  797.  
  798.     setAttributeNodeNS = setAttributeNode
  799.     
  800.     def removeAttribute(self, name):
  801.         
  802.         try:
  803.             attr = self._attrs[name]
  804.         except KeyError:
  805.             raise xml.dom.NotFoundErr()
  806.  
  807.         self.removeAttributeNode(attr)
  808.  
  809.     
  810.     def removeAttributeNS(self, namespaceURI, localName):
  811.         
  812.         try:
  813.             attr = self._attrsNS[(namespaceURI, localName)]
  814.         except KeyError:
  815.             raise xml.dom.NotFoundErr()
  816.  
  817.         self.removeAttributeNode(attr)
  818.  
  819.     
  820.     def removeAttributeNode(self, node):
  821.         if node is None:
  822.             raise xml.dom.NotFoundErr()
  823.         node is None
  824.         
  825.         try:
  826.             self._attrs[node.name]
  827.         except KeyError:
  828.             raise xml.dom.NotFoundErr()
  829.  
  830.         _clear_id_cache(self)
  831.         node.unlink()
  832.         node.ownerDocument = self.ownerDocument
  833.  
  834.     removeAttributeNodeNS = removeAttributeNode
  835.     
  836.     def hasAttribute(self, name):
  837.         return self._attrs.has_key(name)
  838.  
  839.     
  840.     def hasAttributeNS(self, namespaceURI, localName):
  841.         return self._attrsNS.has_key((namespaceURI, localName))
  842.  
  843.     
  844.     def getElementsByTagName(self, name):
  845.         return _get_elements_by_tagName_helper(self, name, NodeList())
  846.  
  847.     
  848.     def getElementsByTagNameNS(self, namespaceURI, localName):
  849.         return _get_elements_by_tagName_ns_helper(self, namespaceURI, localName, NodeList())
  850.  
  851.     
  852.     def __repr__(self):
  853.         return '<DOM Element: %s at %#x>' % (self.tagName, id(self))
  854.  
  855.     
  856.     def writexml(self, writer, indent = '', addindent = '', newl = ''):
  857.         writer.write(indent + '<' + self.tagName)
  858.         attrs = self._get_attributes()
  859.         a_names = attrs.keys()
  860.         a_names.sort()
  861.         for a_name in a_names:
  862.             writer.write(' %s="' % a_name)
  863.             _write_data(writer, attrs[a_name].value)
  864.             writer.write('"')
  865.         
  866.         if self.childNodes:
  867.             writer.write('>%s' % newl)
  868.             for node in self.childNodes:
  869.                 node.writexml(writer, indent + addindent, addindent, newl)
  870.             
  871.             writer.write('%s</%s>%s' % (indent, self.tagName, newl))
  872.         else:
  873.             writer.write('/>%s' % newl)
  874.  
  875.     
  876.     def _get_attributes(self):
  877.         return NamedNodeMap(self._attrs, self._attrsNS, self)
  878.  
  879.     
  880.     def hasAttributes(self):
  881.         if self._attrs:
  882.             return True
  883.         return False
  884.  
  885.     
  886.     def setIdAttribute(self, name):
  887.         idAttr = self.getAttributeNode(name)
  888.         self.setIdAttributeNode(idAttr)
  889.  
  890.     
  891.     def setIdAttributeNS(self, namespaceURI, localName):
  892.         idAttr = self.getAttributeNodeNS(namespaceURI, localName)
  893.         self.setIdAttributeNode(idAttr)
  894.  
  895.     
  896.     def setIdAttributeNode(self, idAttr):
  897.         if idAttr is None or not self.isSameNode(idAttr.ownerElement):
  898.             raise xml.dom.NotFoundErr()
  899.         not self.isSameNode(idAttr.ownerElement)
  900.         if _get_containing_entref(self) is not None:
  901.             raise xml.dom.NoModificationAllowedErr()
  902.         _get_containing_entref(self) is not None
  903.  
  904.  
  905. defproperty(Element, 'attributes', doc = 'NamedNodeMap of attributes on the element.')
  906. defproperty(Element, 'localName', doc = 'Namespace-local name of this element.')
  907.  
  908. def _set_attribute_node(element, attr):
  909.     _clear_id_cache(element)
  910.     element._attrs[attr.name] = attr
  911.     element._attrsNS[(attr.namespaceURI, attr.localName)] = attr
  912.     attr.__dict__['ownerElement'] = element
  913.  
  914.  
  915. class Childless:
  916.     attributes = None
  917.     childNodes = EmptyNodeList()
  918.     firstChild = None
  919.     lastChild = None
  920.     
  921.     def _get_firstChild(self):
  922.         pass
  923.  
  924.     
  925.     def _get_lastChild(self):
  926.         pass
  927.  
  928.     
  929.     def appendChild(self, node):
  930.         raise xml.dom.HierarchyRequestErr(self.nodeName + ' nodes cannot have children')
  931.  
  932.     
  933.     def hasChildNodes(self):
  934.         return False
  935.  
  936.     
  937.     def insertBefore(self, newChild, refChild):
  938.         raise xml.dom.HierarchyRequestErr(self.nodeName + ' nodes do not have children')
  939.  
  940.     
  941.     def removeChild(self, oldChild):
  942.         raise xml.dom.NotFoundErr(self.nodeName + ' nodes do not have children')
  943.  
  944.     
  945.     def replaceChild(self, newChild, oldChild):
  946.         raise xml.dom.HierarchyRequestErr(self.nodeName + ' nodes do not have children')
  947.  
  948.  
  949.  
  950. class ProcessingInstruction(Childless, Node):
  951.     nodeType = Node.PROCESSING_INSTRUCTION_NODE
  952.     
  953.     def __init__(self, target, data):
  954.         self.target = self.nodeName = target
  955.         self.data = self.nodeValue = data
  956.  
  957.     
  958.     def _get_data(self):
  959.         return self.data
  960.  
  961.     
  962.     def _set_data(self, value):
  963.         d = self.__dict__
  964.         d['data'] = d['nodeValue'] = value
  965.  
  966.     
  967.     def _get_target(self):
  968.         return self.target
  969.  
  970.     
  971.     def _set_target(self, value):
  972.         d = self.__dict__
  973.         d['target'] = d['nodeName'] = value
  974.  
  975.     
  976.     def __setattr__(self, name, value):
  977.         if name == 'data' or name == 'nodeValue':
  978.             self.__dict__['data'] = self.__dict__['nodeValue'] = value
  979.         elif name == 'target' or name == 'nodeName':
  980.             self.__dict__['target'] = self.__dict__['nodeName'] = value
  981.         else:
  982.             self.__dict__[name] = value
  983.  
  984.     
  985.     def writexml(self, writer, indent = '', addindent = '', newl = ''):
  986.         writer.write('%s<?%s %s?>%s' % (indent, self.target, self.data, newl))
  987.  
  988.  
  989.  
  990. class CharacterData(Childless, Node):
  991.     
  992.     def _get_length(self):
  993.         return len(self.data)
  994.  
  995.     __len__ = _get_length
  996.     
  997.     def _get_data(self):
  998.         return self.__dict__['data']
  999.  
  1000.     
  1001.     def _set_data(self, data):
  1002.         d = self.__dict__
  1003.         d['data'] = d['nodeValue'] = data
  1004.  
  1005.     _get_nodeValue = _get_data
  1006.     _set_nodeValue = _set_data
  1007.     
  1008.     def __setattr__(self, name, value):
  1009.         if name == 'data' or name == 'nodeValue':
  1010.             self.__dict__['data'] = self.__dict__['nodeValue'] = value
  1011.         else:
  1012.             self.__dict__[name] = value
  1013.  
  1014.     
  1015.     def __repr__(self):
  1016.         data = self.data
  1017.         if len(data) > 10:
  1018.             dotdotdot = '...'
  1019.         else:
  1020.             dotdotdot = ''
  1021.         return '<DOM %s node "%r%s">' % (self.__class__.__name__, data[0:10], dotdotdot)
  1022.  
  1023.     
  1024.     def substringData(self, offset, count):
  1025.         if offset < 0:
  1026.             raise xml.dom.IndexSizeErr('offset cannot be negative')
  1027.         offset < 0
  1028.         if offset >= len(self.data):
  1029.             raise xml.dom.IndexSizeErr('offset cannot be beyond end of data')
  1030.         offset >= len(self.data)
  1031.         if count < 0:
  1032.             raise xml.dom.IndexSizeErr('count cannot be negative')
  1033.         count < 0
  1034.         return self.data[offset:offset + count]
  1035.  
  1036.     
  1037.     def appendData(self, arg):
  1038.         self.data = self.data + arg
  1039.  
  1040.     
  1041.     def insertData(self, offset, arg):
  1042.         if offset < 0:
  1043.             raise xml.dom.IndexSizeErr('offset cannot be negative')
  1044.         offset < 0
  1045.         if offset >= len(self.data):
  1046.             raise xml.dom.IndexSizeErr('offset cannot be beyond end of data')
  1047.         offset >= len(self.data)
  1048.         if arg:
  1049.             self.data = '%s%s%s' % (self.data[:offset], arg, self.data[offset:])
  1050.         
  1051.  
  1052.     
  1053.     def deleteData(self, offset, count):
  1054.         if offset < 0:
  1055.             raise xml.dom.IndexSizeErr('offset cannot be negative')
  1056.         offset < 0
  1057.         if offset >= len(self.data):
  1058.             raise xml.dom.IndexSizeErr('offset cannot be beyond end of data')
  1059.         offset >= len(self.data)
  1060.         if count < 0:
  1061.             raise xml.dom.IndexSizeErr('count cannot be negative')
  1062.         count < 0
  1063.         if count:
  1064.             self.data = self.data[:offset] + self.data[offset + count:]
  1065.         
  1066.  
  1067.     
  1068.     def replaceData(self, offset, count, arg):
  1069.         if offset < 0:
  1070.             raise xml.dom.IndexSizeErr('offset cannot be negative')
  1071.         offset < 0
  1072.         if offset >= len(self.data):
  1073.             raise xml.dom.IndexSizeErr('offset cannot be beyond end of data')
  1074.         offset >= len(self.data)
  1075.         if count < 0:
  1076.             raise xml.dom.IndexSizeErr('count cannot be negative')
  1077.         count < 0
  1078.         if count:
  1079.             self.data = '%s%s%s' % (self.data[:offset], arg, self.data[offset + count:])
  1080.         
  1081.  
  1082.  
  1083. defproperty(CharacterData, 'length', doc = 'Length of the string data.')
  1084.  
  1085. class Text(CharacterData):
  1086.     nodeType = Node.TEXT_NODE
  1087.     nodeName = '#text'
  1088.     attributes = None
  1089.     
  1090.     def splitText(self, offset):
  1091.         if offset < 0 or offset > len(self.data):
  1092.             raise xml.dom.IndexSizeErr('illegal offset value')
  1093.         offset > len(self.data)
  1094.         newText = self.__class__()
  1095.         newText.data = self.data[offset:]
  1096.         newText.ownerDocument = self.ownerDocument
  1097.         next = self.nextSibling
  1098.         if self.parentNode and self in self.parentNode.childNodes:
  1099.             if next is None:
  1100.                 self.parentNode.appendChild(newText)
  1101.             else:
  1102.                 self.parentNode.insertBefore(newText, next)
  1103.         
  1104.         self.data = self.data[:offset]
  1105.         return newText
  1106.  
  1107.     
  1108.     def writexml(self, writer, indent = '', addindent = '', newl = ''):
  1109.         _write_data(writer, '%s%s%s' % (indent, self.data, newl))
  1110.  
  1111.     
  1112.     def _get_wholeText(self):
  1113.         L = [
  1114.             self.data]
  1115.         n = self.previousSibling
  1116.         while n is not None:
  1117.             if n.nodeType in (Node.TEXT_NODE, Node.CDATA_SECTION_NODE):
  1118.                 L.insert(0, n.data)
  1119.                 n = n.previousSibling
  1120.                 continue
  1121.             break
  1122.         n = self.nextSibling
  1123.         while n is not None:
  1124.             if n.nodeType in (Node.TEXT_NODE, Node.CDATA_SECTION_NODE):
  1125.                 L.append(n.data)
  1126.                 n = n.nextSibling
  1127.                 continue
  1128.             break
  1129.         return ''.join(L)
  1130.  
  1131.     
  1132.     def replaceWholeText(self, content):
  1133.         parent = self.parentNode
  1134.         n = self.previousSibling
  1135.         while n is not None:
  1136.             if n.nodeType in (Node.TEXT_NODE, Node.CDATA_SECTION_NODE):
  1137.                 next = n.previousSibling
  1138.                 parent.removeChild(n)
  1139.                 n = next
  1140.                 continue
  1141.             break
  1142.         n = self.nextSibling
  1143.         if not content:
  1144.             parent.removeChild(self)
  1145.         
  1146.         while n is not None:
  1147.             if n.nodeType in (Node.TEXT_NODE, Node.CDATA_SECTION_NODE):
  1148.                 next = n.nextSibling
  1149.                 parent.removeChild(n)
  1150.                 n = next
  1151.                 continue
  1152.             break
  1153.         if content:
  1154.             d = self.__dict__
  1155.             d['data'] = content
  1156.             d['nodeValue'] = content
  1157.             return self
  1158.         return None
  1159.  
  1160.     
  1161.     def _get_isWhitespaceInElementContent(self):
  1162.         if self.data.strip():
  1163.             return False
  1164.         elem = _get_containing_element(self)
  1165.         if elem is None:
  1166.             return False
  1167.         info = self.ownerDocument._get_elem_info(elem)
  1168.         if info is None:
  1169.             return False
  1170.         return info.isElementContent()
  1171.  
  1172.  
  1173. defproperty(Text, 'isWhitespaceInElementContent', doc = 'True iff this text node contains only whitespace and is in element content.')
  1174. defproperty(Text, 'wholeText', doc = 'The text of all logically-adjacent text nodes.')
  1175.  
  1176. def _get_containing_element(node):
  1177.     c = node.parentNode
  1178.     while c is not None:
  1179.         if c.nodeType == Node.ELEMENT_NODE:
  1180.             return c
  1181.         c = c.parentNode
  1182.         continue
  1183.         c.nodeType == Node.ELEMENT_NODE
  1184.  
  1185.  
  1186. def _get_containing_entref(node):
  1187.     c = node.parentNode
  1188.     while c is not None:
  1189.         if c.nodeType == Node.ENTITY_REFERENCE_NODE:
  1190.             return c
  1191.         c = c.parentNode
  1192.         continue
  1193.         c.nodeType == Node.ENTITY_REFERENCE_NODE
  1194.  
  1195.  
  1196. class Comment(Childless, CharacterData):
  1197.     nodeType = Node.COMMENT_NODE
  1198.     nodeName = '#comment'
  1199.     
  1200.     def __init__(self, data):
  1201.         self.data = self.nodeValue = data
  1202.  
  1203.     
  1204.     def writexml(self, writer, indent = '', addindent = '', newl = ''):
  1205.         if '--' in self.data:
  1206.             raise ValueError("'--' is not allowed in a comment node")
  1207.         '--' in self.data
  1208.         writer.write('%s<!--%s-->%s' % (indent, self.data, newl))
  1209.  
  1210.  
  1211.  
  1212. class CDATASection(Text):
  1213.     nodeType = Node.CDATA_SECTION_NODE
  1214.     nodeName = '#cdata-section'
  1215.     
  1216.     def writexml(self, writer, indent = '', addindent = '', newl = ''):
  1217.         if self.data.find(']]>') >= 0:
  1218.             raise ValueError("']]>' not allowed in a CDATA section")
  1219.         self.data.find(']]>') >= 0
  1220.         writer.write('<![CDATA[%s]]>' % self.data)
  1221.  
  1222.  
  1223.  
  1224. class ReadOnlySequentialNamedNodeMap(object):
  1225.     __slots__ = ('_seq',)
  1226.     
  1227.     def __init__(self, seq = ()):
  1228.         self._seq = seq
  1229.  
  1230.     
  1231.     def __len__(self):
  1232.         return len(self._seq)
  1233.  
  1234.     
  1235.     def _get_length(self):
  1236.         return len(self._seq)
  1237.  
  1238.     
  1239.     def getNamedItem(self, name):
  1240.         for n in self._seq:
  1241.             if n.nodeName == name:
  1242.                 return n
  1243.         
  1244.  
  1245.     
  1246.     def getNamedItemNS(self, namespaceURI, localName):
  1247.         for n in self._seq:
  1248.             if n.namespaceURI == namespaceURI and n.localName == localName:
  1249.                 return n
  1250.         
  1251.  
  1252.     
  1253.     def __getitem__(self, name_or_tuple):
  1254.         if isinstance(name_or_tuple, tuple):
  1255.             node = self.getNamedItemNS(*name_or_tuple)
  1256.         else:
  1257.             node = self.getNamedItem(name_or_tuple)
  1258.         if node is None:
  1259.             raise KeyError, name_or_tuple
  1260.         node is None
  1261.         return node
  1262.  
  1263.     
  1264.     def item(self, index):
  1265.         if index < 0:
  1266.             return None
  1267.         
  1268.         try:
  1269.             return self._seq[index]
  1270.         except IndexError:
  1271.             index < 0
  1272.             index < 0
  1273.             return None
  1274.  
  1275.  
  1276.     
  1277.     def removeNamedItem(self, name):
  1278.         raise xml.dom.NoModificationAllowedErr('NamedNodeMap instance is read-only')
  1279.  
  1280.     
  1281.     def removeNamedItemNS(self, namespaceURI, localName):
  1282.         raise xml.dom.NoModificationAllowedErr('NamedNodeMap instance is read-only')
  1283.  
  1284.     
  1285.     def setNamedItem(self, node):
  1286.         raise xml.dom.NoModificationAllowedErr('NamedNodeMap instance is read-only')
  1287.  
  1288.     
  1289.     def setNamedItemNS(self, node):
  1290.         raise xml.dom.NoModificationAllowedErr('NamedNodeMap instance is read-only')
  1291.  
  1292.     
  1293.     def __getstate__(self):
  1294.         return [
  1295.             self._seq]
  1296.  
  1297.     
  1298.     def __setstate__(self, state):
  1299.         self._seq = state[0]
  1300.  
  1301.  
  1302. defproperty(ReadOnlySequentialNamedNodeMap, 'length', doc = 'Number of entries in the NamedNodeMap.')
  1303.  
  1304. class Identified:
  1305.     
  1306.     def _identified_mixin_init(self, publicId, systemId):
  1307.         self.publicId = publicId
  1308.         self.systemId = systemId
  1309.  
  1310.     
  1311.     def _get_publicId(self):
  1312.         return self.publicId
  1313.  
  1314.     
  1315.     def _get_systemId(self):
  1316.         return self.systemId
  1317.  
  1318.  
  1319.  
  1320. class DocumentType(Identified, Childless, Node):
  1321.     nodeType = Node.DOCUMENT_TYPE_NODE
  1322.     nodeValue = None
  1323.     name = None
  1324.     publicId = None
  1325.     systemId = None
  1326.     internalSubset = None
  1327.     
  1328.     def __init__(self, qualifiedName):
  1329.         self.entities = ReadOnlySequentialNamedNodeMap()
  1330.         self.notations = ReadOnlySequentialNamedNodeMap()
  1331.         if qualifiedName:
  1332.             (prefix, localname) = _nssplit(qualifiedName)
  1333.             self.name = localname
  1334.         
  1335.         self.nodeName = self.name
  1336.  
  1337.     
  1338.     def _get_internalSubset(self):
  1339.         return self.internalSubset
  1340.  
  1341.     
  1342.     def cloneNode(self, deep):
  1343.         if self.ownerDocument is None:
  1344.             clone = DocumentType(None)
  1345.             clone.name = self.name
  1346.             clone.nodeName = self.name
  1347.             operation = xml.dom.UserDataHandler.NODE_CLONED
  1348.             if deep:
  1349.                 clone.entities._seq = []
  1350.                 clone.notations._seq = []
  1351.                 for n in self.notations._seq:
  1352.                     notation = Notation(n.nodeName, n.publicId, n.systemId)
  1353.                     clone.notations._seq.append(notation)
  1354.                     n._call_user_data_handler(operation, n, notation)
  1355.                 
  1356.                 for e in self.entities._seq:
  1357.                     entity = Entity(e.nodeName, e.publicId, e.systemId, e.notationName)
  1358.                     entity.actualEncoding = e.actualEncoding
  1359.                     entity.encoding = e.encoding
  1360.                     entity.version = e.version
  1361.                     clone.entities._seq.append(entity)
  1362.                     e._call_user_data_handler(operation, n, entity)
  1363.                 
  1364.             
  1365.             self._call_user_data_handler(operation, self, clone)
  1366.             return clone
  1367.         return None
  1368.  
  1369.     
  1370.     def writexml(self, writer, indent = '', addindent = '', newl = ''):
  1371.         writer.write('<!DOCTYPE ')
  1372.         writer.write(self.name)
  1373.         if self.publicId:
  1374.             writer.write("%s  PUBLIC '%s'%s  '%s'" % (newl, self.publicId, newl, self.systemId))
  1375.         elif self.systemId:
  1376.             writer.write("%s  SYSTEM '%s'" % (newl, self.systemId))
  1377.         
  1378.         if self.internalSubset is not None:
  1379.             writer.write(' [')
  1380.             writer.write(self.internalSubset)
  1381.             writer.write(']')
  1382.         
  1383.         writer.write('>' + newl)
  1384.  
  1385.  
  1386.  
  1387. class Entity(Identified, Node):
  1388.     attributes = None
  1389.     nodeType = Node.ENTITY_NODE
  1390.     nodeValue = None
  1391.     actualEncoding = None
  1392.     encoding = None
  1393.     version = None
  1394.     
  1395.     def __init__(self, name, publicId, systemId, notation):
  1396.         self.nodeName = name
  1397.         self.notationName = notation
  1398.         self.childNodes = NodeList()
  1399.         self._identified_mixin_init(publicId, systemId)
  1400.  
  1401.     
  1402.     def _get_actualEncoding(self):
  1403.         return self.actualEncoding
  1404.  
  1405.     
  1406.     def _get_encoding(self):
  1407.         return self.encoding
  1408.  
  1409.     
  1410.     def _get_version(self):
  1411.         return self.version
  1412.  
  1413.     
  1414.     def appendChild(self, newChild):
  1415.         raise xml.dom.HierarchyRequestErr('cannot append children to an entity node')
  1416.  
  1417.     
  1418.     def insertBefore(self, newChild, refChild):
  1419.         raise xml.dom.HierarchyRequestErr('cannot insert children below an entity node')
  1420.  
  1421.     
  1422.     def removeChild(self, oldChild):
  1423.         raise xml.dom.HierarchyRequestErr('cannot remove children from an entity node')
  1424.  
  1425.     
  1426.     def replaceChild(self, newChild, oldChild):
  1427.         raise xml.dom.HierarchyRequestErr('cannot replace children of an entity node')
  1428.  
  1429.  
  1430.  
  1431. class Notation(Identified, Childless, Node):
  1432.     nodeType = Node.NOTATION_NODE
  1433.     nodeValue = None
  1434.     
  1435.     def __init__(self, name, publicId, systemId):
  1436.         self.nodeName = name
  1437.         self._identified_mixin_init(publicId, systemId)
  1438.  
  1439.  
  1440.  
  1441. class DOMImplementation(DOMImplementationLS):
  1442.     _features = [
  1443.         ('core', '1.0'),
  1444.         ('core', '2.0'),
  1445.         ('core', '3.0'),
  1446.         ('core', None),
  1447.         ('xml', '1.0'),
  1448.         ('xml', '2.0'),
  1449.         ('xml', '3.0'),
  1450.         ('xml', None),
  1451.         ('ls-load', '3.0'),
  1452.         ('ls-load', None)]
  1453.     
  1454.     def hasFeature(self, feature, version):
  1455.         if version == '':
  1456.             version = None
  1457.         
  1458.         return (feature.lower(), version) in self._features
  1459.  
  1460.     
  1461.     def createDocument(self, namespaceURI, qualifiedName, doctype):
  1462.         if doctype and doctype.parentNode is not None:
  1463.             raise xml.dom.WrongDocumentErr('doctype object owned by another DOM tree')
  1464.         doctype.parentNode is not None
  1465.         doc = self._create_document()
  1466.         if namespaceURI is None and qualifiedName is None:
  1467.             pass
  1468.         add_root_element = not (doctype is None)
  1469.         if not qualifiedName and add_root_element:
  1470.             raise xml.dom.InvalidCharacterErr('Element with no name')
  1471.         add_root_element
  1472.         if add_root_element:
  1473.             (prefix, localname) = _nssplit(qualifiedName)
  1474.             if prefix == 'xml' and namespaceURI != 'http://www.w3.org/XML/1998/namespace':
  1475.                 raise xml.dom.NamespaceErr("illegal use of 'xml' prefix")
  1476.             namespaceURI != 'http://www.w3.org/XML/1998/namespace'
  1477.             if prefix and not namespaceURI:
  1478.                 raise xml.dom.NamespaceErr('illegal use of prefix without namespaces')
  1479.             not namespaceURI
  1480.             element = doc.createElementNS(namespaceURI, qualifiedName)
  1481.             if doctype:
  1482.                 doc.appendChild(doctype)
  1483.             
  1484.             doc.appendChild(element)
  1485.         
  1486.         if doctype:
  1487.             doctype.parentNode = doctype.ownerDocument = doc
  1488.         
  1489.         doc.doctype = doctype
  1490.         doc.implementation = self
  1491.         return doc
  1492.  
  1493.     
  1494.     def createDocumentType(self, qualifiedName, publicId, systemId):
  1495.         doctype = DocumentType(qualifiedName)
  1496.         doctype.publicId = publicId
  1497.         doctype.systemId = systemId
  1498.         return doctype
  1499.  
  1500.     
  1501.     def getInterface(self, feature):
  1502.         if self.hasFeature(feature, None):
  1503.             return self
  1504.         return None
  1505.  
  1506.     
  1507.     def _create_document(self):
  1508.         return Document()
  1509.  
  1510.  
  1511.  
  1512. class ElementInfo(object):
  1513.     __slots__ = ('tagName',)
  1514.     
  1515.     def __init__(self, name):
  1516.         self.tagName = name
  1517.  
  1518.     
  1519.     def getAttributeType(self, aname):
  1520.         return _no_type
  1521.  
  1522.     
  1523.     def getAttributeTypeNS(self, namespaceURI, localName):
  1524.         return _no_type
  1525.  
  1526.     
  1527.     def isElementContent(self):
  1528.         return False
  1529.  
  1530.     
  1531.     def isEmpty(self):
  1532.         return False
  1533.  
  1534.     
  1535.     def isId(self, aname):
  1536.         return False
  1537.  
  1538.     
  1539.     def isIdNS(self, namespaceURI, localName):
  1540.         return False
  1541.  
  1542.     
  1543.     def __getstate__(self):
  1544.         return self.tagName
  1545.  
  1546.     
  1547.     def __setstate__(self, state):
  1548.         self.tagName = state
  1549.  
  1550.  
  1551.  
  1552. def _clear_id_cache(node):
  1553.     if node.nodeType == Node.DOCUMENT_NODE:
  1554.         node._id_cache.clear()
  1555.         node._id_search_stack = None
  1556.     elif _in_document(node):
  1557.         node.ownerDocument._id_cache.clear()
  1558.         node.ownerDocument._id_search_stack = None
  1559.     
  1560.  
  1561.  
  1562. class Document(Node, DocumentLS):
  1563.     _child_node_types = (Node.ELEMENT_NODE, Node.PROCESSING_INSTRUCTION_NODE, Node.COMMENT_NODE, Node.DOCUMENT_TYPE_NODE)
  1564.     nodeType = Node.DOCUMENT_NODE
  1565.     nodeName = '#document'
  1566.     nodeValue = None
  1567.     attributes = None
  1568.     doctype = None
  1569.     parentNode = None
  1570.     previousSibling = None
  1571.     nextSibling = None
  1572.     implementation = DOMImplementation()
  1573.     actualEncoding = None
  1574.     encoding = None
  1575.     standalone = None
  1576.     version = None
  1577.     strictErrorChecking = False
  1578.     errorHandler = None
  1579.     documentURI = None
  1580.     _magic_id_count = 0
  1581.     
  1582.     def __init__(self):
  1583.         self.childNodes = NodeList()
  1584.         self._elem_info = { }
  1585.         self._id_cache = { }
  1586.         self._id_search_stack = None
  1587.  
  1588.     
  1589.     def _get_elem_info(self, element):
  1590.         if element.namespaceURI:
  1591.             key = (element.namespaceURI, element.localName)
  1592.         else:
  1593.             key = element.tagName
  1594.         return self._elem_info.get(key)
  1595.  
  1596.     
  1597.     def _get_actualEncoding(self):
  1598.         return self.actualEncoding
  1599.  
  1600.     
  1601.     def _get_doctype(self):
  1602.         return self.doctype
  1603.  
  1604.     
  1605.     def _get_documentURI(self):
  1606.         return self.documentURI
  1607.  
  1608.     
  1609.     def _get_encoding(self):
  1610.         return self.encoding
  1611.  
  1612.     
  1613.     def _get_errorHandler(self):
  1614.         return self.errorHandler
  1615.  
  1616.     
  1617.     def _get_standalone(self):
  1618.         return self.standalone
  1619.  
  1620.     
  1621.     def _get_strictErrorChecking(self):
  1622.         return self.strictErrorChecking
  1623.  
  1624.     
  1625.     def _get_version(self):
  1626.         return self.version
  1627.  
  1628.     
  1629.     def appendChild(self, node):
  1630.         if node.nodeType not in self._child_node_types:
  1631.             raise xml.dom.HierarchyRequestErr('%s cannot be child of %s' % (repr(node), repr(self)))
  1632.         node.nodeType not in self._child_node_types
  1633.         if node.parentNode is not None:
  1634.             node.parentNode.removeChild(node)
  1635.         
  1636.         if node.nodeType == Node.ELEMENT_NODE and self._get_documentElement():
  1637.             raise xml.dom.HierarchyRequestErr('two document elements disallowed')
  1638.         self._get_documentElement()
  1639.         return Node.appendChild(self, node)
  1640.  
  1641.     
  1642.     def removeChild(self, oldChild):
  1643.         
  1644.         try:
  1645.             self.childNodes.remove(oldChild)
  1646.         except ValueError:
  1647.             raise xml.dom.NotFoundErr()
  1648.  
  1649.         oldChild.nextSibling = None
  1650.         oldChild.previousSibling = None
  1651.         oldChild.parentNode = None
  1652.         if self.documentElement is oldChild:
  1653.             self.documentElement = None
  1654.         
  1655.         return oldChild
  1656.  
  1657.     
  1658.     def _get_documentElement(self):
  1659.         for node in self.childNodes:
  1660.             if node.nodeType == Node.ELEMENT_NODE:
  1661.                 return node
  1662.         
  1663.  
  1664.     
  1665.     def unlink(self):
  1666.         if self.doctype is not None:
  1667.             self.doctype.unlink()
  1668.             self.doctype = None
  1669.         
  1670.         Node.unlink(self)
  1671.  
  1672.     
  1673.     def cloneNode(self, deep):
  1674.         if not deep:
  1675.             return None
  1676.         clone = self.implementation.createDocument(None, None, None)
  1677.         clone.encoding = self.encoding
  1678.         clone.standalone = self.standalone
  1679.         clone.version = self.version
  1680.         for n in self.childNodes:
  1681.             childclone = _clone_node(n, deep, clone)
  1682.             clone.childNodes.append(childclone)
  1683.             if childclone.nodeType == Node.DOCUMENT_NODE:
  1684.                 pass
  1685.             elif childclone.nodeType == Node.DOCUMENT_TYPE_NODE:
  1686.                 clone.doctype = childclone
  1687.             
  1688.             childclone.parentNode = clone
  1689.         
  1690.         self._call_user_data_handler(xml.dom.UserDataHandler.NODE_CLONED, self, clone)
  1691.         return clone
  1692.  
  1693.     
  1694.     def createDocumentFragment(self):
  1695.         d = DocumentFragment()
  1696.         d.ownerDocument = self
  1697.         return d
  1698.  
  1699.     
  1700.     def createElement(self, tagName):
  1701.         e = Element(tagName)
  1702.         e.ownerDocument = self
  1703.         return e
  1704.  
  1705.     
  1706.     def createTextNode(self, data):
  1707.         if not isinstance(data, StringTypes):
  1708.             raise TypeError, 'node contents must be a string'
  1709.         isinstance(data, StringTypes)
  1710.         t = Text()
  1711.         t.data = data
  1712.         t.ownerDocument = self
  1713.         return t
  1714.  
  1715.     
  1716.     def createCDATASection(self, data):
  1717.         if not isinstance(data, StringTypes):
  1718.             raise TypeError, 'node contents must be a string'
  1719.         isinstance(data, StringTypes)
  1720.         c = CDATASection()
  1721.         c.data = data
  1722.         c.ownerDocument = self
  1723.         return c
  1724.  
  1725.     
  1726.     def createComment(self, data):
  1727.         c = Comment(data)
  1728.         c.ownerDocument = self
  1729.         return c
  1730.  
  1731.     
  1732.     def createProcessingInstruction(self, target, data):
  1733.         p = ProcessingInstruction(target, data)
  1734.         p.ownerDocument = self
  1735.         return p
  1736.  
  1737.     
  1738.     def createAttribute(self, qName):
  1739.         a = Attr(qName)
  1740.         a.ownerDocument = self
  1741.         a.value = ''
  1742.         return a
  1743.  
  1744.     
  1745.     def createElementNS(self, namespaceURI, qualifiedName):
  1746.         (prefix, localName) = _nssplit(qualifiedName)
  1747.         e = Element(qualifiedName, namespaceURI, prefix)
  1748.         e.ownerDocument = self
  1749.         return e
  1750.  
  1751.     
  1752.     def createAttributeNS(self, namespaceURI, qualifiedName):
  1753.         (prefix, localName) = _nssplit(qualifiedName)
  1754.         a = Attr(qualifiedName, namespaceURI, localName, prefix)
  1755.         a.ownerDocument = self
  1756.         a.value = ''
  1757.         return a
  1758.  
  1759.     
  1760.     def _create_entity(self, name, publicId, systemId, notationName):
  1761.         e = Entity(name, publicId, systemId, notationName)
  1762.         e.ownerDocument = self
  1763.         return e
  1764.  
  1765.     
  1766.     def _create_notation(self, name, publicId, systemId):
  1767.         n = Notation(name, publicId, systemId)
  1768.         n.ownerDocument = self
  1769.         return n
  1770.  
  1771.     
  1772.     def getElementById(self, id):
  1773.         if id in self._id_cache:
  1774.             return self._id_cache[id]
  1775.         if not self._elem_info or self._magic_id_count:
  1776.             return None
  1777.         stack = self._id_search_stack
  1778.         if stack is None:
  1779.             stack = [
  1780.                 self.documentElement]
  1781.             self._id_search_stack = stack
  1782.         elif not stack:
  1783.             return None
  1784.         id in self._id_cache
  1785.         result = None
  1786.         for child in node.childNodes:
  1787.             if child.nodeType in _nodeTypes_with_children:
  1788.                 continue
  1789.             _[1][child]
  1790.             [](_[1])
  1791.             info = self._get_elem_info(node)
  1792.             if info:
  1793.                 for attr in node.attributes.values():
  1794.                     if attr.namespaceURI:
  1795.                         if info.isIdNS(attr.namespaceURI, attr.localName):
  1796.                             self._id_cache[attr.value] = node
  1797.                             if attr.value == id:
  1798.                                 result = node
  1799.                             elif not node._magic_id_nodes:
  1800.                                 break
  1801.                             
  1802.                         
  1803.                     info.isIdNS(attr.namespaceURI, attr.localName)
  1804.                     if info.isId(attr.name):
  1805.                         self._id_cache[attr.value] = node
  1806.                         if attr.value == id:
  1807.                             result = node
  1808.                         elif not node._magic_id_nodes:
  1809.                             break
  1810.                         
  1811.                     attr.value == id
  1812.                     if attr._is_id:
  1813.                         self._id_cache[attr.value] = node
  1814.                         if attr.value == id:
  1815.                             result = node
  1816.                         elif node._magic_id_nodes == 1:
  1817.                             break
  1818.                         
  1819.                     attr.value == id
  1820.                 
  1821.             elif node._magic_id_nodes:
  1822.                 for attr in node.attributes.values():
  1823.                     if attr._is_id:
  1824.                         self._id_cache[attr.value] = node
  1825.                         if attr.value == id:
  1826.                             result = node
  1827.                         
  1828.                     attr.value == id
  1829.                 
  1830.             
  1831.             if result is not None:
  1832.                 break
  1833.                 continue
  1834.         return result
  1835.  
  1836.     
  1837.     def getElementsByTagName(self, name):
  1838.         return _get_elements_by_tagName_helper(self, name, NodeList())
  1839.  
  1840.     
  1841.     def getElementsByTagNameNS(self, namespaceURI, localName):
  1842.         return _get_elements_by_tagName_ns_helper(self, namespaceURI, localName, NodeList())
  1843.  
  1844.     
  1845.     def isSupported(self, feature, version):
  1846.         return self.implementation.hasFeature(feature, version)
  1847.  
  1848.     
  1849.     def importNode(self, node, deep):
  1850.         if node.nodeType == Node.DOCUMENT_NODE:
  1851.             raise xml.dom.NotSupportedErr('cannot import document nodes')
  1852.         node.nodeType == Node.DOCUMENT_NODE
  1853.         if node.nodeType == Node.DOCUMENT_TYPE_NODE:
  1854.             raise xml.dom.NotSupportedErr('cannot import document type nodes')
  1855.         node.nodeType == Node.DOCUMENT_TYPE_NODE
  1856.         return _clone_node(node, deep, self)
  1857.  
  1858.     
  1859.     def writexml(self, writer, indent = '', addindent = '', newl = '', encoding = None):
  1860.         if encoding is None:
  1861.             writer.write('<?xml version="1.0" ?>' + newl)
  1862.         else:
  1863.             writer.write('<?xml version="1.0" encoding="%s"?>%s' % (encoding, newl))
  1864.         for node in self.childNodes:
  1865.             node.writexml(writer, indent, addindent, newl)
  1866.         
  1867.  
  1868.     
  1869.     def renameNode(self, n, namespaceURI, name):
  1870.         if n.ownerDocument is not self:
  1871.             raise xml.dom.WrongDocumentErr('cannot rename nodes from other documents;\nexpected %s,\nfound %s' % (self, n.ownerDocument))
  1872.         n.ownerDocument is not self
  1873.         if n.nodeType not in (Node.ELEMENT_NODE, Node.ATTRIBUTE_NODE):
  1874.             raise xml.dom.NotSupportedErr('renameNode() only applies to element and attribute nodes')
  1875.         n.nodeType not in (Node.ELEMENT_NODE, Node.ATTRIBUTE_NODE)
  1876.         if namespaceURI != EMPTY_NAMESPACE:
  1877.             if ':' in name:
  1878.                 (prefix, localName) = name.split(':', 1)
  1879.                 if prefix == 'xmlns' and namespaceURI != xml.dom.XMLNS_NAMESPACE:
  1880.                     raise xml.dom.NamespaceErr("illegal use of 'xmlns' prefix")
  1881.                 namespaceURI != xml.dom.XMLNS_NAMESPACE
  1882.             elif name == 'xmlns' and namespaceURI != xml.dom.XMLNS_NAMESPACE and n.nodeType == Node.ATTRIBUTE_NODE:
  1883.                 raise xml.dom.NamespaceErr("illegal use of the 'xmlns' attribute")
  1884.             
  1885.             prefix = None
  1886.             localName = name
  1887.         else:
  1888.             prefix = None
  1889.             localName = None
  1890.         if n.nodeType == Node.ATTRIBUTE_NODE:
  1891.             element = n.ownerElement
  1892.             if element is not None:
  1893.                 is_id = n._is_id
  1894.                 element.removeAttributeNode(n)
  1895.             
  1896.         else:
  1897.             element = None
  1898.         d = n.__dict__
  1899.         d['prefix'] = prefix
  1900.         d['localName'] = localName
  1901.         d['namespaceURI'] = namespaceURI
  1902.         d['nodeName'] = name
  1903.         if n.nodeType == Node.ELEMENT_NODE:
  1904.             d['tagName'] = name
  1905.         else:
  1906.             d['name'] = name
  1907.             if element is not None:
  1908.                 element.setAttributeNode(n)
  1909.                 if is_id:
  1910.                     element.setIdAttributeNode(n)
  1911.                 
  1912.             
  1913.         return n
  1914.  
  1915.  
  1916. defproperty(Document, 'documentElement', doc = 'Top-level element of this document.')
  1917.  
  1918. def _clone_node(node, deep, newOwnerDocument):
  1919.     if node.ownerDocument.isSameNode(newOwnerDocument):
  1920.         operation = xml.dom.UserDataHandler.NODE_CLONED
  1921.     else:
  1922.         operation = xml.dom.UserDataHandler.NODE_IMPORTED
  1923.     if node.nodeType == Node.ELEMENT_NODE:
  1924.         clone = newOwnerDocument.createElementNS(node.namespaceURI, node.nodeName)
  1925.         for attr in node.attributes.values():
  1926.             clone.setAttributeNS(attr.namespaceURI, attr.nodeName, attr.value)
  1927.             a = clone.getAttributeNodeNS(attr.namespaceURI, attr.localName)
  1928.             a.specified = attr.specified
  1929.         
  1930.         if deep:
  1931.             for child in node.childNodes:
  1932.                 c = _clone_node(child, deep, newOwnerDocument)
  1933.                 clone.appendChild(c)
  1934.             
  1935.         
  1936.     elif node.nodeType == Node.DOCUMENT_FRAGMENT_NODE:
  1937.         clone = newOwnerDocument.createDocumentFragment()
  1938.         if deep:
  1939.             for child in node.childNodes:
  1940.                 c = _clone_node(child, deep, newOwnerDocument)
  1941.                 clone.appendChild(c)
  1942.             
  1943.         
  1944.     elif node.nodeType == Node.TEXT_NODE:
  1945.         clone = newOwnerDocument.createTextNode(node.data)
  1946.     elif node.nodeType == Node.CDATA_SECTION_NODE:
  1947.         clone = newOwnerDocument.createCDATASection(node.data)
  1948.     elif node.nodeType == Node.PROCESSING_INSTRUCTION_NODE:
  1949.         clone = newOwnerDocument.createProcessingInstruction(node.target, node.data)
  1950.     elif node.nodeType == Node.COMMENT_NODE:
  1951.         clone = newOwnerDocument.createComment(node.data)
  1952.     elif node.nodeType == Node.ATTRIBUTE_NODE:
  1953.         clone = newOwnerDocument.createAttributeNS(node.namespaceURI, node.nodeName)
  1954.         clone.specified = True
  1955.         clone.value = node.value
  1956.     elif node.nodeType == Node.DOCUMENT_TYPE_NODE:
  1957.         operation = xml.dom.UserDataHandler.NODE_IMPORTED
  1958.         clone = newOwnerDocument.implementation.createDocumentType(node.name, node.publicId, node.systemId)
  1959.         clone.ownerDocument = newOwnerDocument
  1960.         if deep:
  1961.             clone.entities._seq = []
  1962.             clone.notations._seq = []
  1963.             for n in node.notations._seq:
  1964.                 notation = Notation(n.nodeName, n.publicId, n.systemId)
  1965.                 notation.ownerDocument = newOwnerDocument
  1966.                 clone.notations._seq.append(notation)
  1967.                 if hasattr(n, '_call_user_data_handler'):
  1968.                     n._call_user_data_handler(operation, n, notation)
  1969.                     continue
  1970.             
  1971.             for e in node.entities._seq:
  1972.                 entity = Entity(e.nodeName, e.publicId, e.systemId, e.notationName)
  1973.                 entity.actualEncoding = e.actualEncoding
  1974.                 entity.encoding = e.encoding
  1975.                 entity.version = e.version
  1976.                 entity.ownerDocument = newOwnerDocument
  1977.                 clone.entities._seq.append(entity)
  1978.                 if hasattr(e, '_call_user_data_handler'):
  1979.                     e._call_user_data_handler(operation, n, entity)
  1980.                     continue
  1981.             
  1982.         
  1983.     else:
  1984.         raise xml.dom.NotSupportedErr('Cannot clone node %s' % repr(node))
  1985.     if node.nodeType == Node.ELEMENT_NODE(node, '_call_user_data_handler'):
  1986.         node._call_user_data_handler(operation, node, clone)
  1987.     
  1988.     return clone
  1989.  
  1990.  
  1991. def _nssplit(qualifiedName):
  1992.     fields = qualifiedName.split(':', 1)
  1993.     if len(fields) == 2:
  1994.         return fields
  1995.     return (None, fields[0])
  1996.  
  1997.  
  1998. def _get_StringIO():
  1999.     StringIO = StringIO
  2000.     import StringIO
  2001.     return StringIO()
  2002.  
  2003.  
  2004. def _do_pulldom_parse(func, args, kwargs):
  2005.     events = func(*args, **kwargs)
  2006.     (toktype, rootNode) = events.getEvent()
  2007.     events.expandNode(rootNode)
  2008.     events.clear()
  2009.     return rootNode
  2010.  
  2011.  
  2012. def parse(file, parser = None, bufsize = None):
  2013.     if parser is None and not bufsize:
  2014.         expatbuilder = expatbuilder
  2015.         import xml.dom
  2016.         return expatbuilder.parse(file)
  2017.     pulldom = pulldom
  2018.     import xml.dom
  2019.     return _do_pulldom_parse(pulldom.parse, (file,), {
  2020.         'parser': parser,
  2021.         'bufsize': bufsize })
  2022.  
  2023.  
  2024. def parseString(string, parser = None):
  2025.     if parser is None:
  2026.         expatbuilder = expatbuilder
  2027.         import xml.dom
  2028.         return expatbuilder.parseString(string)
  2029.     pulldom = pulldom
  2030.     import xml.dom
  2031.     return _do_pulldom_parse(pulldom.parseString, (string,), {
  2032.         'parser': parser })
  2033.  
  2034.  
  2035. def getDOMImplementation(features = None):
  2036.     if features:
  2037.         if isinstance(features, StringTypes):
  2038.             features = domreg._parse_feature_string(features)
  2039.         
  2040.         for f, v in features:
  2041.             if not Document.implementation.hasFeature(f, v):
  2042.                 return None
  2043.         
  2044.     
  2045.     return Document.implementation
  2046.  
  2047.