| from __future__ import absolute_import, division, unicode_literals |
| |
| from xml.sax.xmlreader import AttributesNSImpl |
| |
| from ..constants import adjustForeignAttributes, unadjustForeignAttributes |
| |
| prefix_mapping = {} |
| for prefix, localName, namespace in adjustForeignAttributes.values(): |
| if prefix is not None: |
| prefix_mapping[prefix] = namespace |
| |
| |
| def to_sax(walker, handler): |
| """Call SAX-like content handler based on treewalker walker |
| |
| :arg walker: the treewalker to use to walk the tree to convert it |
| |
| :arg handler: SAX handler to use |
| |
| """ |
| handler.startDocument() |
| for prefix, namespace in prefix_mapping.items(): |
| handler.startPrefixMapping(prefix, namespace) |
| |
| for token in walker: |
| type = token["type"] |
| if type == "Doctype": |
| continue |
| elif type in ("StartTag", "EmptyTag"): |
| attrs = AttributesNSImpl(token["data"], |
| unadjustForeignAttributes) |
| handler.startElementNS((token["namespace"], token["name"]), |
| token["name"], |
| attrs) |
| if type == "EmptyTag": |
| handler.endElementNS((token["namespace"], token["name"]), |
| token["name"]) |
| elif type == "EndTag": |
| handler.endElementNS((token["namespace"], token["name"]), |
| token["name"]) |
| elif type in ("Characters", "SpaceCharacters"): |
| handler.characters(token["data"]) |
| elif type == "Comment": |
| pass |
| else: |
| assert False, "Unknown token type" |
| |
| for prefix, namespace in prefix_mapping.items(): |
| handler.endPrefixMapping(prefix) |
| handler.endDocument() |