1*cda5da8dSAndroid Build Coastguard Worker"""Python version compatibility support for minidom. 2*cda5da8dSAndroid Build Coastguard Worker 3*cda5da8dSAndroid Build Coastguard WorkerThis module contains internal implementation details and 4*cda5da8dSAndroid Build Coastguard Workershould not be imported; use xml.dom.minidom instead. 5*cda5da8dSAndroid Build Coastguard Worker""" 6*cda5da8dSAndroid Build Coastguard Worker 7*cda5da8dSAndroid Build Coastguard Worker# This module should only be imported using "import *". 8*cda5da8dSAndroid Build Coastguard Worker# 9*cda5da8dSAndroid Build Coastguard Worker# The following names are defined: 10*cda5da8dSAndroid Build Coastguard Worker# 11*cda5da8dSAndroid Build Coastguard Worker# NodeList -- lightest possible NodeList implementation 12*cda5da8dSAndroid Build Coastguard Worker# 13*cda5da8dSAndroid Build Coastguard Worker# EmptyNodeList -- lightest possible NodeList that is guaranteed to 14*cda5da8dSAndroid Build Coastguard Worker# remain empty (immutable) 15*cda5da8dSAndroid Build Coastguard Worker# 16*cda5da8dSAndroid Build Coastguard Worker# StringTypes -- tuple of defined string types 17*cda5da8dSAndroid Build Coastguard Worker# 18*cda5da8dSAndroid Build Coastguard Worker# defproperty -- function used in conjunction with GetattrMagic; 19*cda5da8dSAndroid Build Coastguard Worker# using these together is needed to make them work 20*cda5da8dSAndroid Build Coastguard Worker# as efficiently as possible in both Python 2.2+ 21*cda5da8dSAndroid Build Coastguard Worker# and older versions. For example: 22*cda5da8dSAndroid Build Coastguard Worker# 23*cda5da8dSAndroid Build Coastguard Worker# class MyClass(GetattrMagic): 24*cda5da8dSAndroid Build Coastguard Worker# def _get_myattr(self): 25*cda5da8dSAndroid Build Coastguard Worker# return something 26*cda5da8dSAndroid Build Coastguard Worker# 27*cda5da8dSAndroid Build Coastguard Worker# defproperty(MyClass, "myattr", 28*cda5da8dSAndroid Build Coastguard Worker# "return some value") 29*cda5da8dSAndroid Build Coastguard Worker# 30*cda5da8dSAndroid Build Coastguard Worker# For Python 2.2 and newer, this will construct a 31*cda5da8dSAndroid Build Coastguard Worker# property object on the class, which avoids 32*cda5da8dSAndroid Build Coastguard Worker# needing to override __getattr__(). It will only 33*cda5da8dSAndroid Build Coastguard Worker# work for read-only attributes. 34*cda5da8dSAndroid Build Coastguard Worker# 35*cda5da8dSAndroid Build Coastguard Worker# For older versions of Python, inheriting from 36*cda5da8dSAndroid Build Coastguard Worker# GetattrMagic will use the traditional 37*cda5da8dSAndroid Build Coastguard Worker# __getattr__() hackery to achieve the same effect, 38*cda5da8dSAndroid Build Coastguard Worker# but less efficiently. 39*cda5da8dSAndroid Build Coastguard Worker# 40*cda5da8dSAndroid Build Coastguard Worker# defproperty() should be used for each version of 41*cda5da8dSAndroid Build Coastguard Worker# the relevant _get_<property>() function. 42*cda5da8dSAndroid Build Coastguard Worker 43*cda5da8dSAndroid Build Coastguard Worker__all__ = ["NodeList", "EmptyNodeList", "StringTypes", "defproperty"] 44*cda5da8dSAndroid Build Coastguard Worker 45*cda5da8dSAndroid Build Coastguard Workerimport xml.dom 46*cda5da8dSAndroid Build Coastguard Worker 47*cda5da8dSAndroid Build Coastguard WorkerStringTypes = (str,) 48*cda5da8dSAndroid Build Coastguard Worker 49*cda5da8dSAndroid Build Coastguard Worker 50*cda5da8dSAndroid Build Coastguard Workerclass NodeList(list): 51*cda5da8dSAndroid Build Coastguard Worker __slots__ = () 52*cda5da8dSAndroid Build Coastguard Worker 53*cda5da8dSAndroid Build Coastguard Worker def item(self, index): 54*cda5da8dSAndroid Build Coastguard Worker if 0 <= index < len(self): 55*cda5da8dSAndroid Build Coastguard Worker return self[index] 56*cda5da8dSAndroid Build Coastguard Worker 57*cda5da8dSAndroid Build Coastguard Worker def _get_length(self): 58*cda5da8dSAndroid Build Coastguard Worker return len(self) 59*cda5da8dSAndroid Build Coastguard Worker 60*cda5da8dSAndroid Build Coastguard Worker def _set_length(self, value): 61*cda5da8dSAndroid Build Coastguard Worker raise xml.dom.NoModificationAllowedErr( 62*cda5da8dSAndroid Build Coastguard Worker "attempt to modify read-only attribute 'length'") 63*cda5da8dSAndroid Build Coastguard Worker 64*cda5da8dSAndroid Build Coastguard Worker length = property(_get_length, _set_length, 65*cda5da8dSAndroid Build Coastguard Worker doc="The number of nodes in the NodeList.") 66*cda5da8dSAndroid Build Coastguard Worker 67*cda5da8dSAndroid Build Coastguard Worker # For backward compatibility 68*cda5da8dSAndroid Build Coastguard Worker def __setstate__(self, state): 69*cda5da8dSAndroid Build Coastguard Worker if state is None: 70*cda5da8dSAndroid Build Coastguard Worker state = [] 71*cda5da8dSAndroid Build Coastguard Worker self[:] = state 72*cda5da8dSAndroid Build Coastguard Worker 73*cda5da8dSAndroid Build Coastguard Worker 74*cda5da8dSAndroid Build Coastguard Workerclass EmptyNodeList(tuple): 75*cda5da8dSAndroid Build Coastguard Worker __slots__ = () 76*cda5da8dSAndroid Build Coastguard Worker 77*cda5da8dSAndroid Build Coastguard Worker def __add__(self, other): 78*cda5da8dSAndroid Build Coastguard Worker NL = NodeList() 79*cda5da8dSAndroid Build Coastguard Worker NL.extend(other) 80*cda5da8dSAndroid Build Coastguard Worker return NL 81*cda5da8dSAndroid Build Coastguard Worker 82*cda5da8dSAndroid Build Coastguard Worker def __radd__(self, other): 83*cda5da8dSAndroid Build Coastguard Worker NL = NodeList() 84*cda5da8dSAndroid Build Coastguard Worker NL.extend(other) 85*cda5da8dSAndroid Build Coastguard Worker return NL 86*cda5da8dSAndroid Build Coastguard Worker 87*cda5da8dSAndroid Build Coastguard Worker def item(self, index): 88*cda5da8dSAndroid Build Coastguard Worker return None 89*cda5da8dSAndroid Build Coastguard Worker 90*cda5da8dSAndroid Build Coastguard Worker def _get_length(self): 91*cda5da8dSAndroid Build Coastguard Worker return 0 92*cda5da8dSAndroid Build Coastguard Worker 93*cda5da8dSAndroid Build Coastguard Worker def _set_length(self, value): 94*cda5da8dSAndroid Build Coastguard Worker raise xml.dom.NoModificationAllowedErr( 95*cda5da8dSAndroid Build Coastguard Worker "attempt to modify read-only attribute 'length'") 96*cda5da8dSAndroid Build Coastguard Worker 97*cda5da8dSAndroid Build Coastguard Worker length = property(_get_length, _set_length, 98*cda5da8dSAndroid Build Coastguard Worker doc="The number of nodes in the NodeList.") 99*cda5da8dSAndroid Build Coastguard Worker 100*cda5da8dSAndroid Build Coastguard Worker 101*cda5da8dSAndroid Build Coastguard Workerdef defproperty(klass, name, doc): 102*cda5da8dSAndroid Build Coastguard Worker get = getattr(klass, ("_get_" + name)) 103*cda5da8dSAndroid Build Coastguard Worker def set(self, value, name=name): 104*cda5da8dSAndroid Build Coastguard Worker raise xml.dom.NoModificationAllowedErr( 105*cda5da8dSAndroid Build Coastguard Worker "attempt to modify read-only attribute " + repr(name)) 106*cda5da8dSAndroid Build Coastguard Worker assert not hasattr(klass, "_set_" + name), \ 107*cda5da8dSAndroid Build Coastguard Worker "expected not to find _set_" + name 108*cda5da8dSAndroid Build Coastguard Worker prop = property(get, set, doc=doc) 109*cda5da8dSAndroid Build Coastguard Worker setattr(klass, name, prop) 110