xref: /third_party/python/Lib/xml/dom/minicompat.py (revision 7db96d56)
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