Package xmlschema_acue :: Module namespaces

Source Code for Module xmlschema_acue.namespaces

  1  # -*- coding: utf-8 -*- 
  2  # 
  3  # Copyright (c), 2016-2019, SISSA (International School for Advanced Studies). 
  4  # All rights reserved. 
  5  # This file is distributed under the terms of the MIT License. 
  6  # See the file 'LICENSE' in the root directory of the present 
  7  # distribution, or http://opensource.org/licenses/MIT. 
  8  # 
  9  # @author Davide Brunato <brunato@sissa.it> 
 10  # 
 11  """ 
 12  This module contains namespace definitions for W3C core standards and namespace related classes. 
 13  """ 
 14  from __future__ import unicode_literals 
 15   
 16  from xmlschema_acue.compat import MutableMapping, Mapping 
 17  from xmlschema_acue.helpers import get_namespace 
 18   
 19  XSD_NAMESPACE = 'http://www.w3.org/2001/XMLSchema' 
 20  "URI of the XML Schema Definition namespace (xs|xsd)" 
 21   
 22  XSI_NAMESPACE = 'http://www.w3.org/2001/XMLSchema-instance' 
 23  "URI of the XML Schema Instance namespace (xsi)" 
 24   
 25  XML_NAMESPACE = 'http://www.w3.org/XML/1998/namespace' 
 26  "URI of the XML namespace (xml)" 
 27   
 28  XHTML_NAMESPACE = 'http://www.w3.org/1999/xhtml' 
 29  XHTML_DATATYPES_NAMESPACE = "http://www.w3.org/1999/xhtml/datatypes/" 
 30  "URIs of the Extensible Hypertext Markup Language namespace (html)" 
 31   
 32  XLINK_NAMESPACE = 'http://www.w3.org/1999/xlink' 
 33  "URI of the XML Linking Language (XLink)" 
 34   
 35  XSLT_NAMESPACE = "http://www.w3.org/1999/XSL/Transform" 
 36  "URI of the XSL Transformations namespace (xslt)" 
 37   
 38  HFP_NAMESPACE = 'http://www.w3.org/2001/XMLSchema-hasFacetAndProperty' 
 39  "URI of the XML Schema has Facet and Property namespace (hfp)" 
 40   
 41  VC_NAMESPACE = "http://www.w3.org/2007/XMLSchema-versioning" 
 42  "URI of the XML Schema Versioning namespace (vc)" 
43 44 45 -class NamespaceResourcesMap(MutableMapping):
46 """ 47 Dictionary for storing information about namespace resources. The values are 48 lists of strings. Setting an existing value appends the string to the value. 49 Setting a value with a list sets/replaces the value. 50 """
51 - def __init__(self, *args, **kwargs):
52 self._store = dict() 53 self.update(*args, **kwargs)
54
55 - def __getitem__(self, uri):
56 return self._store[uri]
57
58 - def __setitem__(self, uri, value):
59 if isinstance(value, list): 60 self._store[uri] = value[:] 61 else: 62 try: 63 self._store[uri].append(value) 64 except KeyError: 65 self._store[uri] = [value]
66
67 - def __delitem__(self, uri):
68 del self._store[uri]
69
70 - def __iter__(self):
71 return iter(self._store)
72
73 - def __len__(self):
74 return len(self._store)
75
76 - def __repr__(self):
77 return repr(self._store)
78
79 - def clear(self):
80 self._store.clear()
81
82 83 -class NamespaceMapper(MutableMapping):
84 """ 85 A class to map/unmap namespace prefixes to URIs. 86 87 :param namespaces: Initial data with namespace prefixes and URIs. 88 """
89 - def __init__(self, namespaces=None, register_namespace=None):
90 self._namespaces = {} 91 self.register_namespace = register_namespace 92 if namespaces is not None: 93 self.update(namespaces)
94
95 - def __getitem__(self, key):
96 return self._namespaces[key]
97
98 - def __setitem__(self, key, value):
99 self._namespaces[key] = value 100 try: 101 self.register_namespace(key, value) 102 except (TypeError, ValueError): 103 pass
104
105 - def __delitem__(self, key):
106 del self._namespaces[key]
107
108 - def __iter__(self):
109 return iter(self._namespaces)
110
111 - def __len__(self):
112 return len(self._namespaces)
113 114 @property
115 - def default_namespace(self):
116 return self._namespaces.get('')
117
118 - def clear(self):
119 self._namespaces.clear()
120
121 - def map_qname(self, qname):
122 try: 123 if qname[0] != '{' or not self._namespaces: 124 return qname 125 except IndexError: 126 return qname 127 128 qname_uri = get_namespace(qname) 129 for prefix, uri in self.items(): 130 if uri != qname_uri: 131 continue 132 if prefix: 133 self._namespaces[prefix] = uri 134 return qname.replace(u'{%s}' % uri, u'%s:' % prefix) 135 else: 136 if uri: 137 self._namespaces[prefix] = uri 138 return qname.replace(u'{%s}' % uri, '') 139 else: 140 return qname
141
142 - def unmap_qname(self, qname):
143 try: 144 if qname[0] == '{' or not self: 145 return qname 146 except IndexError: 147 return qname 148 149 try: 150 prefix, name = qname.split(':', 1) 151 except ValueError: 152 if self.get(''): 153 return u'{%s}%s' % (self.get(''), qname) 154 else: 155 return qname 156 else: 157 try: 158 uri = self._namespaces[prefix] 159 except KeyError: 160 return qname 161 else: 162 return u'{%s}%s' % (uri, name) if uri else name
163
164 - def transfer(self, other):
165 transferred = [] 166 for k, v in other.items(): 167 if k in self: 168 if v != self[k]: 169 continue 170 else: 171 self[k] = v 172 transferred.append(k) 173 for k in transferred: 174 del other[k]
175
176 177 -class NamespaceView(Mapping):
178 """ 179 A read-only map for filtered access to a dictionary that stores objects mapped from QNames. 180 """
181 - def __init__(self, qname_dict, namespace_uri):
182 self.target_dict = qname_dict 183 self.namespace = namespace_uri 184 if namespace_uri: 185 self.key_fmt = '{' + namespace_uri + '}%s' 186 else: 187 self.key_fmt = '%s'
188
189 - def __getitem__(self, key):
190 return self.target_dict[self.key_fmt % key]
191
192 - def __len__(self):
193 return len(self.as_dict())
194
195 - def __iter__(self):
196 return iter(self.as_dict())
197
198 - def __repr__(self):
199 return '%s(%s)' % (self.__class__.__name__, str(self.as_dict()))
200
201 - def __contains__(self, key):
202 return self.key_fmt % key in self.target_dict
203
204 - def __eq__(self, other):
205 return self.as_dict() == dict(other.items())
206
207 - def copy(self, **kwargs):
208 return self.__class__(self, **kwargs)
209
210 - def as_dict(self, fqn_keys=False):
211 if fqn_keys: 212 return { 213 k: v for k, v in self.target_dict.items() 214 if self.namespace == get_namespace(k) 215 } 216 else: 217 return { 218 k if k[0] != '{' else k[k.rindex('}') + 1:]: v 219 for k, v in self.target_dict.items() 220 if self.namespace == get_namespace(k) 221 }
222