class _NSContext(object): """ A mapping from XML namespaces onto their prefixes in the document. """ def __init__(self, parent=None): """ Pull out the parent's namespaces, if there's no parent then default to XML. """ self.parent = parent if parent is not None: self.nss = OrderedDict(parent.nss) else: self.nss = {"http://www.w3.org/XML/1998/namespace": "xml"} def get(self, k, d=None): """ Get a prefix for a namespace. @param d: The default prefix value. """ return self.nss.get(k, d) def __setitem__(self, k, v): """ Proxy through to setting the prefix for the namespace. """ self.nss.__setitem__(k, v) def __getitem__(self, k): """ Proxy through to getting the prefix for the namespace. """ return self.nss.__getitem__(k)
class _NSContext(object): """ A mapping from XML namespaces onto their prefixes in the document. """ def __init__(self, parent=None): """ Pull out the parent's namespaces, if there's no parent then default to XML. """ self.parent = parent if parent is not None: self.nss = OrderedDict(parent.nss) else: self.nss = {'http://www.w3.org/XML/1998/namespace': 'xml'} def get(self, k, d=None): """ Get a prefix for a namespace. @param d: The default prefix value. """ return self.nss.get(k, d) def __setitem__(self, k, v): """ Proxy through to setting the prefix for the namespace. """ self.nss.__setitem__(k, v) def __getitem__(self, k): """ Proxy through to getting the prefix for the namespace. """ return self.nss.__getitem__(k)
def __init__(self, parent=None): """ Pull out the parent's namespaces, if there's no parent then default to XML. """ self.parent = parent if parent is not None: self.nss = OrderedDict(parent.nss) else: self.nss = {'http://www.w3.org/XML/1998/namespace': 'xml'}
def test_serializedMultipleAttributes(self): """ Multiple attributes are separated by a single space in their serialized form. """ tag = tags.img() tag.attributes = OrderedDict([("src", "foo"), ("name", "bar")]) self.assertFlattensImmediately(tag, b'<img src="foo" name="bar" />')
def __init__(self, parent=None): """ Pull out the parent's namespaces, if there's no parent then default to XML. """ self.parent = parent if parent is not None: self.nss = OrderedDict(parent.nss) else: self.nss = {"http://www.w3.org/XML/1998/namespace": "xml"}
def startElementNS(self, namespaceAndName, qname, attrs): """ Gets called when we encounter a new xmlns attribute. @param namespaceAndName: a (namespace, name) tuple, where name determines which type of action to take, if the namespace matches L{TEMPLATE_NAMESPACE}. @param qname: ignored. @param attrs: attributes on the element being started. """ filename = self.sourceFilename lineNumber = self.locator.getLineNumber() columnNumber = self.locator.getColumnNumber() ns, name = namespaceAndName if ns == TEMPLATE_NAMESPACE: if name == "transparent": name = "" elif name == "slot": try: # Try to get the default value for the slot default = attrs[(None, "default")] except KeyError: # If there wasn't one, then use None to indicate no # default. default = None el = slot( attrs[(None, "name")], default=default, filename=filename, lineNumber=lineNumber, columnNumber=columnNumber, ) self.stack.append(el) self.current.append(el) self.current = el.children return render = None attrs = OrderedDict(attrs) for k, v in items(attrs): attrNS, justTheName = k if attrNS != TEMPLATE_NAMESPACE: continue if justTheName == "render": render = v del attrs[k] # nonTemplateAttrs is a dictionary mapping attributes that are *not* in # TEMPLATE_NAMESPACE to their values. Those in TEMPLATE_NAMESPACE were # just removed from 'attrs' in the loop immediately above. The key in # nonTemplateAttrs is either simply the attribute name (if it was not # specified as having a namespace in the template) or prefix:name, # preserving the xml namespace prefix given in the document. nonTemplateAttrs = OrderedDict() for (attrNs, attrName), v in items(attrs): nsPrefix = self.prefixMap.get(attrNs) if nsPrefix is None: attrKey = attrName else: attrKey = "%s:%s" % (nsPrefix, attrName) nonTemplateAttrs[attrKey] = v if ns == TEMPLATE_NAMESPACE and name == "attr": if not self.stack: # TODO: define a better exception for this? raise AssertionError("<{%s}attr> as top-level element" % (TEMPLATE_NAMESPACE,)) if "name" not in nonTemplateAttrs: # TODO: same here raise AssertionError("<{%s}attr> requires a name attribute" % (TEMPLATE_NAMESPACE,)) el = Tag("", render=render, filename=filename, lineNumber=lineNumber, columnNumber=columnNumber) self.stack[-1].attributes[nonTemplateAttrs["name"]] = el self.stack.append(el) self.current = el.children return # Apply any xmlns attributes if self.xmlnsAttrs: nonTemplateAttrs.update(OrderedDict(self.xmlnsAttrs)) self.xmlnsAttrs = [] # Add the prefix that was used in the parsed template for non-template # namespaces (which will not be consumed anyway). if ns != TEMPLATE_NAMESPACE and ns is not None: prefix = self.prefixMap[ns] if prefix is not None: name = "%s:%s" % (self.prefixMap[ns], name) el = Tag( name, attributes=OrderedDict(nonTemplateAttrs), render=render, filename=filename, lineNumber=lineNumber, columnNumber=columnNumber, ) self.stack.append(el) self.current.append(el) self.current = el.children
def startElementNS(self, namespaceAndName, qname, attrs): """ Gets called when we encounter a new xmlns attribute. @param namespaceAndName: a (namespace, name) tuple, where name determines which type of action to take, if the namespace matches L{TEMPLATE_NAMESPACE}. @param qname: ignored. @param attrs: attributes on the element being started. """ filename = self.sourceFilename lineNumber = self.locator.getLineNumber() columnNumber = self.locator.getColumnNumber() ns, name = namespaceAndName if ns == TEMPLATE_NAMESPACE: if name == 'transparent': name = '' elif name == 'slot': try: # Try to get the default value for the slot default = attrs[(None, 'default')] except KeyError: # If there wasn't one, then use None to indicate no # default. default = None el = slot(attrs[(None, 'name')], default=default, filename=filename, lineNumber=lineNumber, columnNumber=columnNumber) self.stack.append(el) self.current.append(el) self.current = el.children return render = None attrs = OrderedDict(attrs) for k, v in items(attrs): attrNS, justTheName = k if attrNS != TEMPLATE_NAMESPACE: continue if justTheName == 'render': render = v del attrs[k] # nonTemplateAttrs is a dictionary mapping attributes that are *not* in # TEMPLATE_NAMESPACE to their values. Those in TEMPLATE_NAMESPACE were # just removed from 'attrs' in the loop immediately above. The key in # nonTemplateAttrs is either simply the attribute name (if it was not # specified as having a namespace in the template) or prefix:name, # preserving the xml namespace prefix given in the document. nonTemplateAttrs = OrderedDict() for (attrNs, attrName), v in items(attrs): nsPrefix = self.prefixMap.get(attrNs) if nsPrefix is None: attrKey = attrName else: attrKey = '%s:%s' % (nsPrefix, attrName) nonTemplateAttrs[attrKey] = v if ns == TEMPLATE_NAMESPACE and name == 'attr': if not self.stack: # TODO: define a better exception for this? raise AssertionError('<{%s}attr> as top-level element' % (TEMPLATE_NAMESPACE, )) if 'name' not in nonTemplateAttrs: # TODO: same here raise AssertionError('<{%s}attr> requires a name attribute' % (TEMPLATE_NAMESPACE, )) el = Tag('', render=render, filename=filename, lineNumber=lineNumber, columnNumber=columnNumber) self.stack[-1].attributes[nonTemplateAttrs['name']] = el self.stack.append(el) self.current = el.children return # Apply any xmlns attributes if self.xmlnsAttrs: nonTemplateAttrs.update(OrderedDict(self.xmlnsAttrs)) self.xmlnsAttrs = [] # Add the prefix that was used in the parsed template for non-template # namespaces (which will not be consumed anyway). if ns != TEMPLATE_NAMESPACE and ns is not None: prefix = self.prefixMap[ns] if prefix is not None: name = '%s:%s' % (self.prefixMap[ns], name) el = Tag(name, attributes=OrderedDict(nonTemplateAttrs), render=render, filename=filename, lineNumber=lineNumber, columnNumber=columnNumber) self.stack.append(el) self.current.append(el) self.current = el.children