17db96d56Sopenharmony_ci"""Python version compatibility support for minidom. 27db96d56Sopenharmony_ci 37db96d56Sopenharmony_ciThis module contains internal implementation details and 47db96d56Sopenharmony_cishould not be imported; use xml.dom.minidom instead. 57db96d56Sopenharmony_ci""" 67db96d56Sopenharmony_ci 77db96d56Sopenharmony_ci# This module should only be imported using "import *". 87db96d56Sopenharmony_ci# 97db96d56Sopenharmony_ci# The following names are defined: 107db96d56Sopenharmony_ci# 117db96d56Sopenharmony_ci# NodeList -- lightest possible NodeList implementation 127db96d56Sopenharmony_ci# 137db96d56Sopenharmony_ci# EmptyNodeList -- lightest possible NodeList that is guaranteed to 147db96d56Sopenharmony_ci# remain empty (immutable) 157db96d56Sopenharmony_ci# 167db96d56Sopenharmony_ci# StringTypes -- tuple of defined string types 177db96d56Sopenharmony_ci# 187db96d56Sopenharmony_ci# defproperty -- function used in conjunction with GetattrMagic; 197db96d56Sopenharmony_ci# using these together is needed to make them work 207db96d56Sopenharmony_ci# as efficiently as possible in both Python 2.2+ 217db96d56Sopenharmony_ci# and older versions. For example: 227db96d56Sopenharmony_ci# 237db96d56Sopenharmony_ci# class MyClass(GetattrMagic): 247db96d56Sopenharmony_ci# def _get_myattr(self): 257db96d56Sopenharmony_ci# return something 267db96d56Sopenharmony_ci# 277db96d56Sopenharmony_ci# defproperty(MyClass, "myattr", 287db96d56Sopenharmony_ci# "return some value") 297db96d56Sopenharmony_ci# 307db96d56Sopenharmony_ci# For Python 2.2 and newer, this will construct a 317db96d56Sopenharmony_ci# property object on the class, which avoids 327db96d56Sopenharmony_ci# needing to override __getattr__(). It will only 337db96d56Sopenharmony_ci# work for read-only attributes. 347db96d56Sopenharmony_ci# 357db96d56Sopenharmony_ci# For older versions of Python, inheriting from 367db96d56Sopenharmony_ci# GetattrMagic will use the traditional 377db96d56Sopenharmony_ci# __getattr__() hackery to achieve the same effect, 387db96d56Sopenharmony_ci# but less efficiently. 397db96d56Sopenharmony_ci# 407db96d56Sopenharmony_ci# defproperty() should be used for each version of 417db96d56Sopenharmony_ci# the relevant _get_<property>() function. 427db96d56Sopenharmony_ci 437db96d56Sopenharmony_ci__all__ = ["NodeList", "EmptyNodeList", "StringTypes", "defproperty"] 447db96d56Sopenharmony_ci 457db96d56Sopenharmony_ciimport xml.dom 467db96d56Sopenharmony_ci 477db96d56Sopenharmony_ciStringTypes = (str,) 487db96d56Sopenharmony_ci 497db96d56Sopenharmony_ci 507db96d56Sopenharmony_ciclass NodeList(list): 517db96d56Sopenharmony_ci __slots__ = () 527db96d56Sopenharmony_ci 537db96d56Sopenharmony_ci def item(self, index): 547db96d56Sopenharmony_ci if 0 <= index < len(self): 557db96d56Sopenharmony_ci return self[index] 567db96d56Sopenharmony_ci 577db96d56Sopenharmony_ci def _get_length(self): 587db96d56Sopenharmony_ci return len(self) 597db96d56Sopenharmony_ci 607db96d56Sopenharmony_ci def _set_length(self, value): 617db96d56Sopenharmony_ci raise xml.dom.NoModificationAllowedErr( 627db96d56Sopenharmony_ci "attempt to modify read-only attribute 'length'") 637db96d56Sopenharmony_ci 647db96d56Sopenharmony_ci length = property(_get_length, _set_length, 657db96d56Sopenharmony_ci doc="The number of nodes in the NodeList.") 667db96d56Sopenharmony_ci 677db96d56Sopenharmony_ci # For backward compatibility 687db96d56Sopenharmony_ci def __setstate__(self, state): 697db96d56Sopenharmony_ci if state is None: 707db96d56Sopenharmony_ci state = [] 717db96d56Sopenharmony_ci self[:] = state 727db96d56Sopenharmony_ci 737db96d56Sopenharmony_ci 747db96d56Sopenharmony_ciclass EmptyNodeList(tuple): 757db96d56Sopenharmony_ci __slots__ = () 767db96d56Sopenharmony_ci 777db96d56Sopenharmony_ci def __add__(self, other): 787db96d56Sopenharmony_ci NL = NodeList() 797db96d56Sopenharmony_ci NL.extend(other) 807db96d56Sopenharmony_ci return NL 817db96d56Sopenharmony_ci 827db96d56Sopenharmony_ci def __radd__(self, other): 837db96d56Sopenharmony_ci NL = NodeList() 847db96d56Sopenharmony_ci NL.extend(other) 857db96d56Sopenharmony_ci return NL 867db96d56Sopenharmony_ci 877db96d56Sopenharmony_ci def item(self, index): 887db96d56Sopenharmony_ci return None 897db96d56Sopenharmony_ci 907db96d56Sopenharmony_ci def _get_length(self): 917db96d56Sopenharmony_ci return 0 927db96d56Sopenharmony_ci 937db96d56Sopenharmony_ci def _set_length(self, value): 947db96d56Sopenharmony_ci raise xml.dom.NoModificationAllowedErr( 957db96d56Sopenharmony_ci "attempt to modify read-only attribute 'length'") 967db96d56Sopenharmony_ci 977db96d56Sopenharmony_ci length = property(_get_length, _set_length, 987db96d56Sopenharmony_ci doc="The number of nodes in the NodeList.") 997db96d56Sopenharmony_ci 1007db96d56Sopenharmony_ci 1017db96d56Sopenharmony_cidef defproperty(klass, name, doc): 1027db96d56Sopenharmony_ci get = getattr(klass, ("_get_" + name)) 1037db96d56Sopenharmony_ci def set(self, value, name=name): 1047db96d56Sopenharmony_ci raise xml.dom.NoModificationAllowedErr( 1057db96d56Sopenharmony_ci "attempt to modify read-only attribute " + repr(name)) 1067db96d56Sopenharmony_ci assert not hasattr(klass, "_set_" + name), \ 1077db96d56Sopenharmony_ci "expected not to find _set_" + name 1087db96d56Sopenharmony_ci prop = property(get, set, doc=doc) 1097db96d56Sopenharmony_ci setattr(klass, name, prop) 110