Changeset 434

Show
Ignore:
Timestamp:
02/02/03 00:45:17 (6 years ago)
Author:
sholloway
Message:

Changed namespace_map in XMLBuilder to use XMLNamespaceMap class. Should provide better functionality and more uniform behavior.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/RBFoundation/RBFoundation/ChainedDict.py

    r327 r434  
    8080    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    8181 
    82     chained = {} 
     82    __slots__ = ['chained', 'source'] 
    8383 
    8484    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
  • trunk/RBFoundation/RBFoundation/XMLBuilder.py

    r396 r434  
    3939from xml.parsers.expat import ParserCreate as _ParserCreate 
    4040from WeakBind import BindCallable as _BindCallable 
    41 from ChainedDict import ChainedDict 
     41from XMLNamespaceMap import XMLNamespaceMap 
    4242 
    4343#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     
    5252    def _xmlInitStarted(self): pass  
    5353    def _xmlInitComplete(self): pass  
     54    def _xmlGetElement(self): return self 
    5455    def _xmlChildFactory(self, owner, parent, node, attributes, namespacemap): return None 
    5556    def _toXML(self, strSplit='', *args, **kw): 
     
    7879    def __init__(self): 
    7980        self._elements = [] 
    80         self._current_namespacemap = ChainedDict() 
     81        self._current_namespacemap = XMLNamespaceMap() 
    8182 
    8283    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     
    9596        return self 
    9697 
     98    def _GetElement(self, idx=-1): 
     99        """Used by _start_element to point to the parent of the node.  Derived classes should 
     100        override this method the owner is different than the XMLBuilder""" 
     101        if self._elements: 
     102            element = self._elements[idx] 
     103            try: xmlGetResult = element._xmlGetElement 
     104            except AttributeError: return element 
     105            else: return xmlGetResult() 
     106        else: return None  
     107 
     108    def _GetAttributes(self, node, attributes): 
     109        result = {} 
     110        for attrname, attrvalue in attributes.iteritems(): 
     111            attrnamespace, attrname = self._SplitQualifiedName(attrname) 
     112            if not attrnamespace or attrnamespace == node[0]:  
     113                result[node[0], attrname] = attrvalue 
     114                result[attrname] = attrvalue 
     115            else: result[attrnamespace, attrname] = attrvalue 
     116        return result 
     117 
    97118    def _start_namespace_decl_handler(self, prefix, uri): 
    98119        """Part of the tree-style template method, called at the before the beginning of an XML node parse  
    99120        to manage namespaces.""" 
    100         self._current_namespacemap [uri] = prefix 
     121        self._current_namespacemap.setxmlns(prefix, uri) 
    101122 
    102123    def _end_namespace_decl_handler(self, prefix): 
     
    108129        """Part of the tree-style template method, called at the beginning of an XML node parse. 
    109130        Instantiates the element returned by _GetElementFactory.""" 
    110  
    111131        node = self._SplitQualifiedName(name) 
    112  
    113         newattributes = {} 
    114         for attrname, attrvalue in attributes.iteritems(): 
    115             attrnamespace, attrname = self._SplitQualifiedName(attrname) 
    116             if not attrnamespace or attrnamespace == node[0]:  
    117                 newattributes[node[0], attrname] = attrvalue 
    118                 newattributes[attrname] = attrvalue 
    119             else: newattributes[attrnamespace, attrname] = attrvalue 
    120  
    121         self._current_namespacemap = ChainedDict({}, self._current_namespacemap) 
    122  
    123         args = (self._GetOwner(), self._elements and self._elements[-1] or None, node, newattributes, self._current_namespacemap.chained) 
     132        newattributes = self._GetAttributes(node, attributes) 
     133        args = (self._GetOwner(), self._GetElement(), node, newattributes, self._current_namespacemap) 
     134        self._current_namespacemap  = self._current_namespacemap.newchain() 
    124135        build_factory = self._GetElementFactory(*args) 
    125136        newelement = build_factory(*args) 
     
    132143        """Part of the tree-style template method, called at the closing of an XML node parse. 
    133144        Simply notifies the element that it is complete.""" 
    134         self._current_namespacemap = ChainedDict({}, self._current_namespacemap.chained
     145        self._current_namespacemap = self._current_namespacemap.newchain(-1
    135146 
    136147        if self._elements: 
    137             result = self._elements.pop() 
    138             result._xmlInitComplete() 
     148            element = self._elements.pop() 
     149            element._xmlInitComplete() 
     150            # Get the appropriate result, if it is overriden 
     151            try: xmlGetElement = element._xmlGetElement 
     152            except AttributeError: result = element 
     153            else: result = xmlGetElement() 
    139154        else: result = None 
    140  
    141155        return result 
    142156 
  • trunk/RBFoundation/RBFoundation/XMLNode.py

    r433 r434  
    3030from types import SliceType as _SliceType 
    3131from types import NoneType as _NoneType 
     32from XMLNamespaceMap import XMLNamespaceMap 
    3233 
    3334#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     
    117118    nodebuilder = None 
    118119    default_attributes = {} 
    119     default_namespaces = {} 
     120    default_namespaces = XMLNamespaceMap() 
    120121    default_elements = [] 
    121122    __xmlattrmixin__ = None 
     
    125126    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    126127 
    127     def __init__(self, node, namespace=None, prefix='', attrlookup=None): 
     128    def __init__(self, node, namespace=None, prefix='', default_namespaces=None, attrlookup=None): 
    128129        self.enableattrlookup(attrlookup) 
    129         self.namespaces = self.default_namespaces.copy() 
     130        self.namespaces = (default_namespaces or self.default_namespaces).copy() 
    130131        self.elems = self.default_elements[:] 
    131132        self.attrs = self.default_attributes.copy() 
     
    226227        self.adddata(data) 
    227228 
    228     def _makenode(self, *args, **kw): 
    229         nodebuilder = self.nodebuilder or self.__class__ 
    230         result = nodebuilder(*args, **kw) 
    231         return result 
    232  
    233229    def addnode(self, *args, **kw): 
    234230        """Adds a child node to xmlnode.""" 
     
    252248 
    253249    def setxmlns(self, prefix, namespace): 
    254         if namespace is None: 
    255             try: del self.namespaces[prefix or ''] 
    256             except KeyError: pass 
    257         else: 
    258             self.namespaces[prefix or ''] = namespace 
     250        self.namespaces.setxmlns(prefix, namespace) 
    259251 
    260252    #~ iteration over elements ~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     
    393385                self.prefix, namespace = namespace 
    394386        if namespace is not None: 
    395             self.namespaces[self.prefix or ''] = namespace 
     387            self.namespaces.setxmlns(self.prefix or '', namespace) 
    396388    def _delnamespace(self): 
    397389        """Removes the namespace of the xmlnode""" 
     
    410402        result = ['<' + nodename] 
    411403 
    412         for prefix, ns in self.namespaces.iteritems(): 
    413             if prefix: 
    414                 result.append(' xmlns:%s=%s' % (prefix, xmlquoteattr(ns))) 
    415             else: result.append(' xmlns=%s' % (xmlquoteattr(ns),)) 
     404        result.append(self.namespaces.xmlstr()) 
    416405 
    417406        for name, value in self.attrs.iteritems(): 
     
    426415            result.append('/>') 
    427416        return ''.join(result)   
     417 
    428418    def toXML(self, *args, **kw):  
    429419        """See toxml.""" 
    430420        return self.toxml(*args, **kw) 
     421 
     422    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     423    #~ Protected Methods  
     424    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     425 
    431426    def _toXML(self, *args, **kw): 
    432427        """See toxml.""" 
    433428        return self.toxml(*args, **kw) 
     429 
     430    def _getnodefactory(self, *args, **kw): 
     431        return self.nodebuilder or self.__class__ 
     432 
     433    def _makenode(self, *args, **kw): 
     434        nodebuilder = self._getnodefactory(*args, **kw) 
     435        result = nodebuilder(*args, **kw) 
     436        return result 
    434437 
    435438    def _elemstoxml(self, pretty, level, indent, newline): 
     
    459462 
    460463        def __init__(self, owner, parent, node, attributes, namespacemap): 
    461             prefix = namespacemap.source.get(node[0], None) 
    462             if prefix is not None: 
    463                 xmlnode.__init__(self, node[1], node[0], prefix) 
    464             else: xmlnode.__init__(self, node[1]) 
     464            try: 
     465                prefix = namespacemap.prefix(node[0], False) 
     466                xmlnode.__init__(self, node[1], node[0], prefix, default_namespaces=namespacemap) 
     467            except KeyError: 
     468                xmlnode.__init__(self, node[1], default_namespaces=namespacemap) 
    465469 
    466470            for key, value in attributes.iteritems(): 
    467471                if isinstance(key, tuple): 
    468                     prefix = namespacemap.get(key[0]) 
    469                     if not prefix: key = key[1] 
    470                     else: key = '%s:%s' % (prefix, key[1]) 
     472                    try: 
     473                        prefix = namespacemap.prefix(key[0]) 
     474                        if not prefix: key = key[1] 
     475                        else: key = ':'.join((prefix, key[1])) 
     476                    except KeyError: key = key[1] 
    471477                self.attrs[key] = value 
    472  
    473             for xmlns, prefix in namespacemap.source.iteritems(): 
    474                 self.namespaces[prefix or ''] = xmlns 
    475478 
    476479        def _addElement(self, node, obj):  
     
    480483        def _xmlInitStarted(self): pass  
    481484        def _xmlInitComplete(self): pass  
     485        def _xmlGetElement(self): return self 
    482486        def _xmlChildFactory(self, owner, parent, node, attributes, namespacemap):  
    483487            return self.__class__ 
    484488        def _toXML(self, *args, **kw): 
    485             return self.toXML() 
     489            return self.toxml() 
    486490 
    487491    class Producer(XMLBuilder.XMLBuilder):  
  • trunk/RBFoundation/RBFoundation/XMLObjectify.py

    r432 r434  
    292292        namespace = namespace or self.__namespace__ 
    293293        klass = klass or self.__class__ 
    294         namespacemap = XMLBuilder.ChainedDict({}, self.__namespace_map__
     294        namespacemap = self.__namespace_map__.newchain(
    295295        return self._addElement((namespace, node), klass(self, self, (namespace, node), attributes, namespacemap)) 
    296296         
     
    347347                (default is 0) 
    348348        """ 
    349         if isinstance(nsOuter, str): nsOuter = {nsOuter: None
    350         elif nsOuter is None: nsOuter = {self.__namespace__: None
     349        if isinstance(nsOuter, str): nsOuter = {nsOuter: ''
     350        elif nsOuter is None: nsOuter = {self.__namespace__: ''
    351351        if self.__namespace_map__: 
    352352            nsOuter = nsOuter.copy() 
    353             nsOuter.update(self.__namespace_map__) 
     353            for key, value in self.__namespace_map__.iterxmlns(): 
     354                nsOuter[key] = value 
    354355 
    355356        if self.__namespace__ in nsOuter: 
     
    357358        else: 
    358359            # Remove old default namespace 
    359             nodePrefix = None 
     360            nodePrefix = '' 
    360361            for key, value in nsOuter.items(): 
    361                 if value is nodePrefix: del nsOuter[key] 
    362             for key, value in self.__namespace_map__.items(): 
    363                 if value is nodePrefix: del self.__namespace_map__[key] 
    364             # Add current namespace as "default" 
     362                if value == nodePrefix: del nsOuter[key] 
    365363            if self.__namespace__: 
     364                # Add current namespace as "default" 
    366365                nsOuter[self.__namespace__] = nodePrefix 
    367                 self.__namespace_map__[self.__namespace__] = nodePrefix 
     366                self.__namespace_map__.setxmlns('', self.__namespace__) 
     367            else: 
     368                # Remove the silly default namespace 
     369                try: del self.__namespace_map__[''] 
     370                except KeyError: pass 
    368371 
    369372        # Node start 
     
    374377 
    375378        # Namespaces 
    376         for uri, prefix in self.__namespace_map__.iteritems(): 
    377             if prefix: 
    378                 result += ' xmlns:%s=%s' % (prefix, quoteattr(uri)) 
    379             else:  
    380                 result += ' xmlns=%s' % (quoteattr(uri)) 
     379        result += self.__namespace_map__.xmlstr() 
    381380 
    382381        # Attributes 
     
    418417                (default is '') 
    419418        """ 
    420         if isinstance(nsOuter, str): nsOuter = {nsOuter:None
    421         elif nsOuter is None: nsOuter = {self.__namespace__: None
     419        if isinstance(nsOuter, str): nsOuter = {nsOuter:''
     420        elif nsOuter is None: nsOuter = {self.__namespace__: ''
    422421        result = [] 
    423422        for tupleNSNode, each in self._elements: 
  • trunk/RBSkinning/RBSkinning/xmlObjectifySkin/remove.py

    r395 r434  
    4747 
    4848        if self.settings['nsprefix'] is not None: 
    49             nsMap = self.parent().__namespace_map__ 
    50             for uri, prefix in nsMap.iteritems(): 
    51                 if prefix == (self.settings['nsprefix'] or None): 
    52                     del nsMap[uri] 
    53                     break 
    54  
     49            nsprefix = self.settings['nsprefix'] or '' 
     50            del self.parent().__namespace_map__[nsprefix] 
    5551        elif self.settings['attr'] is not None: 
    5652            del self.parent().settings[self.settings['attr']] 
  • trunk/RBSkinning/RBSkinning/xmlObjectifySkin/substitute.py

    r395 r434  
    5757            self.parent().__namespace__ = self.object 
    5858        elif 'nsprefix' in self.source_settings: 
    59             self.parent().__namespace_map__[self.settings['nsprefix'] or None] = self.object 
     59            nsprefix = self.settings['nsprefix'] or '' 
     60            self.parent().__namespace_map__.setxmlns(nsprefix, self.object) 
    6061        elif 'attr' in self.source_settings: 
    6162            self.parent().settings[self.settings['attr']] = self.object 
  • trunk/RBSkinning/RBSkinning/xmlObjectifySkin/substitute_long.py

    r395 r434  
    5757            self.parent().__namespace__ = self.object 
    5858        elif 'nsprefix' in self.source_settings: 
    59             self.parent().__namespace_map__[self.settings['nsprefix'] or None] = self.object 
     59            nsprefix = self.settings['nsprefix'] or '' 
     60            self.parent().__namespace_map__.setxmlns(nsprefix, self.object) 
    6061        elif 'attr' in self.source_settings: 
    6162            self.parent().settings[self.settings['attr']] = self.object