Changeset 434
- Timestamp:
- 02/02/03 00:45:17 (6 years ago)
- Files:
-
- trunk/RBFoundation/RBFoundation/ChainedDict.py (modified) (1 diff)
- trunk/RBFoundation/RBFoundation/XMLBuilder.py (modified) (6 diffs)
- trunk/RBFoundation/RBFoundation/XMLNode.py (modified) (10 diffs)
- trunk/RBFoundation/RBFoundation/XMLObjectify.py (modified) (5 diffs)
- trunk/RBSkinning/RBSkinning/xmlObjectifySkin/remove.py (modified) (1 diff)
- trunk/RBSkinning/RBSkinning/xmlObjectifySkin/substitute.py (modified) (1 diff)
- trunk/RBSkinning/RBSkinning/xmlObjectifySkin/substitute_long.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/RBFoundation/RBFoundation/ChainedDict.py
r327 r434 80 80 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 81 81 82 chained = {}82 __slots__ = ['chained', 'source'] 83 83 84 84 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ trunk/RBFoundation/RBFoundation/XMLBuilder.py
r396 r434 39 39 from xml.parsers.expat import ParserCreate as _ParserCreate 40 40 from WeakBind import BindCallable as _BindCallable 41 from ChainedDict import ChainedDict41 from XMLNamespaceMap import XMLNamespaceMap 42 42 43 43 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 52 52 def _xmlInitStarted(self): pass 53 53 def _xmlInitComplete(self): pass 54 def _xmlGetElement(self): return self 54 55 def _xmlChildFactory(self, owner, parent, node, attributes, namespacemap): return None 55 56 def _toXML(self, strSplit='', *args, **kw): … … 78 79 def __init__(self): 79 80 self._elements = [] 80 self._current_namespacemap = ChainedDict()81 self._current_namespacemap = XMLNamespaceMap() 81 82 82 83 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 95 96 return self 96 97 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 97 118 def _start_namespace_decl_handler(self, prefix, uri): 98 119 """Part of the tree-style template method, called at the before the beginning of an XML node parse 99 120 to manage namespaces.""" 100 self._current_namespacemap [uri] = prefix121 self._current_namespacemap.setxmlns(prefix, uri) 101 122 102 123 def _end_namespace_decl_handler(self, prefix): … … 108 129 """Part of the tree-style template method, called at the beginning of an XML node parse. 109 130 Instantiates the element returned by _GetElementFactory.""" 110 111 131 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() 124 135 build_factory = self._GetElementFactory(*args) 125 136 newelement = build_factory(*args) … … 132 143 """Part of the tree-style template method, called at the closing of an XML node parse. 133 144 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) 135 146 136 147 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() 139 154 else: result = None 140 141 155 return result 142 156 trunk/RBFoundation/RBFoundation/XMLNode.py
r433 r434 30 30 from types import SliceType as _SliceType 31 31 from types import NoneType as _NoneType 32 from XMLNamespaceMap import XMLNamespaceMap 32 33 33 34 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 117 118 nodebuilder = None 118 119 default_attributes = {} 119 default_namespaces = {}120 default_namespaces = XMLNamespaceMap() 120 121 default_elements = [] 121 122 __xmlattrmixin__ = None … … 125 126 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 126 127 127 def __init__(self, node, namespace=None, prefix='', attrlookup=None):128 def __init__(self, node, namespace=None, prefix='', default_namespaces=None, attrlookup=None): 128 129 self.enableattrlookup(attrlookup) 129 self.namespaces = self.default_namespaces.copy()130 self.namespaces = (default_namespaces or self.default_namespaces).copy() 130 131 self.elems = self.default_elements[:] 131 132 self.attrs = self.default_attributes.copy() … … 226 227 self.adddata(data) 227 228 228 def _makenode(self, *args, **kw):229 nodebuilder = self.nodebuilder or self.__class__230 result = nodebuilder(*args, **kw)231 return result232 233 229 def addnode(self, *args, **kw): 234 230 """Adds a child node to xmlnode.""" … … 252 248 253 249 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) 259 251 260 252 #~ iteration over elements ~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 393 385 self.prefix, namespace = namespace 394 386 if namespace is not None: 395 self.namespaces [self.prefix or ''] = namespace387 self.namespaces.setxmlns(self.prefix or '', namespace) 396 388 def _delnamespace(self): 397 389 """Removes the namespace of the xmlnode""" … … 410 402 result = ['<' + nodename] 411 403 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()) 416 405 417 406 for name, value in self.attrs.iteritems(): … … 426 415 result.append('/>') 427 416 return ''.join(result) 417 428 418 def toXML(self, *args, **kw): 429 419 """See toxml.""" 430 420 return self.toxml(*args, **kw) 421 422 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 423 #~ Protected Methods 424 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 425 431 426 def _toXML(self, *args, **kw): 432 427 """See toxml.""" 433 428 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 434 437 435 438 def _elemstoxml(self, pretty, level, indent, newline): … … 459 462 460 463 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) 465 469 466 470 for key, value in attributes.iteritems(): 467 471 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] 471 477 self.attrs[key] = value 472 473 for xmlns, prefix in namespacemap.source.iteritems():474 self.namespaces[prefix or ''] = xmlns475 478 476 479 def _addElement(self, node, obj): … … 480 483 def _xmlInitStarted(self): pass 481 484 def _xmlInitComplete(self): pass 485 def _xmlGetElement(self): return self 482 486 def _xmlChildFactory(self, owner, parent, node, attributes, namespacemap): 483 487 return self.__class__ 484 488 def _toXML(self, *args, **kw): 485 return self.to XML()489 return self.toxml() 486 490 487 491 class Producer(XMLBuilder.XMLBuilder): trunk/RBFoundation/RBFoundation/XMLObjectify.py
r432 r434 292 292 namespace = namespace or self.__namespace__ 293 293 klass = klass or self.__class__ 294 namespacemap = XMLBuilder.ChainedDict({}, self.__namespace_map__)294 namespacemap = self.__namespace_map__.newchain() 295 295 return self._addElement((namespace, node), klass(self, self, (namespace, node), attributes, namespacemap)) 296 296 … … 347 347 (default is 0) 348 348 """ 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__: ''} 351 351 if self.__namespace_map__: 352 352 nsOuter = nsOuter.copy() 353 nsOuter.update(self.__namespace_map__) 353 for key, value in self.__namespace_map__.iterxmlns(): 354 nsOuter[key] = value 354 355 355 356 if self.__namespace__ in nsOuter: … … 357 358 else: 358 359 # Remove old default namespace 359 nodePrefix = None360 nodePrefix = '' 360 361 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] 365 363 if self.__namespace__: 364 # Add current namespace as "default" 366 365 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 368 371 369 372 # Node start … … 374 377 375 378 # 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() 381 380 382 381 # Attributes … … 418 417 (default is '') 419 418 """ 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__: ''} 422 421 result = [] 423 422 for tupleNSNode, each in self._elements: trunk/RBSkinning/RBSkinning/xmlObjectifySkin/remove.py
r395 r434 47 47 48 48 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] 55 51 elif self.settings['attr'] is not None: 56 52 del self.parent().settings[self.settings['attr']] trunk/RBSkinning/RBSkinning/xmlObjectifySkin/substitute.py
r395 r434 57 57 self.parent().__namespace__ = self.object 58 58 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) 60 61 elif 'attr' in self.source_settings: 61 62 self.parent().settings[self.settings['attr']] = self.object trunk/RBSkinning/RBSkinning/xmlObjectifySkin/substitute_long.py
r395 r434 57 57 self.parent().__namespace__ = self.object 58 58 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) 60 61 elif 'attr' in self.source_settings: 61 62 self.parent().settings[self.settings['attr']] = self.object
