Mercurial > repos > shellac > guppy_basecaller
diff env/lib/python3.7/site-packages/lxml/sax.py @ 5:9b1c78e6ba9c draft default tip
"planemo upload commit 6c0a8142489327ece472c84e558c47da711a9142"
author | shellac |
---|---|
date | Mon, 01 Jun 2020 08:59:25 -0400 |
parents | 79f47841a781 |
children |
line wrap: on
line diff
--- a/env/lib/python3.7/site-packages/lxml/sax.py Thu May 14 16:47:39 2020 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,278 +0,0 @@ -# cython: language_level=2 - -""" -SAX-based adapter to copy trees from/to the Python standard library. - -Use the `ElementTreeContentHandler` class to build an ElementTree from -SAX events. - -Use the `ElementTreeProducer` class or the `saxify()` function to fire -the SAX events of an ElementTree against a SAX ContentHandler. - -See http://codespeak.net/lxml/sax.html -""" - -from __future__ import absolute_import - -from xml.sax.handler import ContentHandler -from lxml import etree -from lxml.etree import ElementTree, SubElement -from lxml.etree import Comment, ProcessingInstruction - - -class SaxError(etree.LxmlError): - """General SAX error. - """ - - -def _getNsTag(tag): - if tag[0] == '{': - return tuple(tag[1:].split('}', 1)) - else: - return None, tag - - -class ElementTreeContentHandler(ContentHandler): - """Build an lxml ElementTree from SAX events. - """ - def __init__(self, makeelement=None): - ContentHandler.__init__(self) - self._root = None - self._root_siblings = [] - self._element_stack = [] - self._default_ns = None - self._ns_mapping = { None : [None] } - self._new_mappings = {} - if makeelement is None: - makeelement = etree.Element - self._makeelement = makeelement - - def _get_etree(self): - "Contains the generated ElementTree after parsing is finished." - return ElementTree(self._root) - - etree = property(_get_etree, doc=_get_etree.__doc__) - - def setDocumentLocator(self, locator): - pass - - def startDocument(self): - pass - - def endDocument(self): - pass - - def startPrefixMapping(self, prefix, uri): - self._new_mappings[prefix] = uri - try: - self._ns_mapping[prefix].append(uri) - except KeyError: - self._ns_mapping[prefix] = [uri] - if prefix is None: - self._default_ns = uri - - def endPrefixMapping(self, prefix): - ns_uri_list = self._ns_mapping[prefix] - ns_uri_list.pop() - if prefix is None: - self._default_ns = ns_uri_list[-1] - - def _buildTag(self, ns_name_tuple): - ns_uri, local_name = ns_name_tuple - if ns_uri: - el_tag = "{%s}%s" % ns_name_tuple - elif self._default_ns: - el_tag = "{%s}%s" % (self._default_ns, local_name) - else: - el_tag = local_name - return el_tag - - def startElementNS(self, ns_name, qname, attributes=None): - el_name = self._buildTag(ns_name) - if attributes: - attrs = {} - try: - iter_attributes = attributes.iteritems() - except AttributeError: - iter_attributes = attributes.items() - - for name_tuple, value in iter_attributes: - if name_tuple[0]: - attr_name = "{%s}%s" % name_tuple - else: - attr_name = name_tuple[1] - attrs[attr_name] = value - else: - attrs = None - - element_stack = self._element_stack - if self._root is None: - element = self._root = \ - self._makeelement(el_name, attrs, self._new_mappings) - if self._root_siblings and hasattr(element, 'addprevious'): - for sibling in self._root_siblings: - element.addprevious(sibling) - del self._root_siblings[:] - else: - element = SubElement(element_stack[-1], el_name, - attrs, self._new_mappings) - element_stack.append(element) - - self._new_mappings.clear() - - def processingInstruction(self, target, data): - pi = ProcessingInstruction(target, data) - if self._root is None: - self._root_siblings.append(pi) - else: - self._element_stack[-1].append(pi) - - def endElementNS(self, ns_name, qname): - element = self._element_stack.pop() - el_tag = self._buildTag(ns_name) - if el_tag != element.tag: - raise SaxError("Unexpected element closed: " + el_tag) - - def startElement(self, name, attributes=None): - if attributes: - attributes = dict( - [((None, k), v) for k, v in attributes.items()] - ) - self.startElementNS((None, name), name, attributes) - - def endElement(self, name): - self.endElementNS((None, name), name) - - def characters(self, data): - last_element = self._element_stack[-1] - try: - # if there already is a child element, we must append to its tail - last_element = last_element[-1] - last_element.tail = (last_element.tail or '') + data - except IndexError: - # otherwise: append to the text - last_element.text = (last_element.text or '') + data - - ignorableWhitespace = characters - - -class ElementTreeProducer(object): - """Produces SAX events for an element and children. - """ - def __init__(self, element_or_tree, content_handler): - try: - element = element_or_tree.getroot() - except AttributeError: - element = element_or_tree - self._element = element - self._content_handler = content_handler - from xml.sax.xmlreader import AttributesNSImpl as attr_class - self._attr_class = attr_class - self._empty_attributes = attr_class({}, {}) - - def saxify(self): - self._content_handler.startDocument() - - element = self._element - if hasattr(element, 'getprevious'): - siblings = [] - sibling = element.getprevious() - while getattr(sibling, 'tag', None) is ProcessingInstruction: - siblings.append(sibling) - sibling = sibling.getprevious() - for sibling in siblings[::-1]: - self._recursive_saxify(sibling, {}) - - self._recursive_saxify(element, {}) - - if hasattr(element, 'getnext'): - sibling = element.getnext() - while getattr(sibling, 'tag', None) is ProcessingInstruction: - self._recursive_saxify(sibling, {}) - sibling = sibling.getnext() - - self._content_handler.endDocument() - - def _recursive_saxify(self, element, parent_nsmap): - content_handler = self._content_handler - tag = element.tag - if tag is Comment or tag is ProcessingInstruction: - if tag is ProcessingInstruction: - content_handler.processingInstruction( - element.target, element.text) - tail = element.tail - if tail: - content_handler.characters(tail) - return - - element_nsmap = element.nsmap - new_prefixes = [] - if element_nsmap != parent_nsmap: - # There have been updates to the namespace - for prefix, ns_uri in element_nsmap.items(): - if parent_nsmap.get(prefix) != ns_uri: - new_prefixes.append( (prefix, ns_uri) ) - - attribs = element.items() - if attribs: - attr_values = {} - attr_qnames = {} - for attr_ns_name, value in attribs: - attr_ns_tuple = _getNsTag(attr_ns_name) - attr_values[attr_ns_tuple] = value - attr_qnames[attr_ns_tuple] = self._build_qname( - attr_ns_tuple[0], attr_ns_tuple[1], element_nsmap, - preferred_prefix=None, is_attribute=True) - sax_attributes = self._attr_class(attr_values, attr_qnames) - else: - sax_attributes = self._empty_attributes - - ns_uri, local_name = _getNsTag(tag) - qname = self._build_qname( - ns_uri, local_name, element_nsmap, element.prefix, is_attribute=False) - - for prefix, uri in new_prefixes: - content_handler.startPrefixMapping(prefix, uri) - content_handler.startElementNS( - (ns_uri, local_name), qname, sax_attributes) - text = element.text - if text: - content_handler.characters(text) - for child in element: - self._recursive_saxify(child, element_nsmap) - content_handler.endElementNS((ns_uri, local_name), qname) - for prefix, uri in new_prefixes: - content_handler.endPrefixMapping(prefix) - tail = element.tail - if tail: - content_handler.characters(tail) - - def _build_qname(self, ns_uri, local_name, nsmap, preferred_prefix, is_attribute): - if ns_uri is None: - return local_name - - if not is_attribute and nsmap.get(preferred_prefix) == ns_uri: - prefix = preferred_prefix - else: - # Pick the first matching prefix, in alphabetical order. - candidates = [ - pfx for (pfx, uri) in nsmap.items() - if pfx is not None and uri == ns_uri - ] - prefix = ( - candidates[0] if len(candidates) == 1 - else min(candidates) if candidates - else None - ) - - if prefix is None: - # Default namespace - return local_name - return prefix + ':' + local_name - - -def saxify(element_or_tree, content_handler): - """One-shot helper to generate SAX events from an XML tree and fire - them against a SAX ContentHandler. - """ - return ElementTreeProducer(element_or_tree, content_handler).saxify()