| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- import threading
- import StringIO
- from lxml import etree
- from path import path
- NS_MAP = {'svg': "http://www.w3.org/2000/svg",
- 'inkscape': "http://www.inkscape.org/namespaces/inkscape"}
- # thread safe parser storage
- class ParserTLS(threading.local):
- def getParser(self):
- parser = getattr(self, "parser", None)
- if parser is not None:
- return parser
- self.parser = parser = etree.XMLParser()
- return parser
- parsel_tls = ParserTLS()
- def TreeToString(tree, pretty=False, encoding=None, method="xml"):
- return etree.tostring(tree, pretty_print=pretty, encoding=encoding, method=method)
- def TreeToFile(tree, fname, encoding='utf-8'):
- tree.write(fname, encoding=encoding, xml_declaration=True, method="xml")
- def FileToTree(fname):
- return etree.parse(fname, parsel_tls.getParser())
- def StringToTree(s):
- if not s:
- raise ValueError("Empty or invalid string %r (%s)'" % (s, type(s)))
- return etree.parse(StringIO.StringIO(s), parsel_tls.getParser())
- def subelement(destEl, tag, pos=None, attribs=None):
- e = etree.SubElement(destEl, tag)
- if pos is not None:
- e.getparent().insert(pos, e)
- if attribs is not None:
- e.attrib.update(dict(((k, unicode(v)) for k, v in attribs.items())))
- return e
- prettyXSL = """<?xml version="1.0" encoding="UTF-8"?>
- <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
- <xsl:output encoding="UTF-8" method="xml"/>
- <xsl:param name="indent-increment" select="' '"/>
- <xsl:template match="* | comment()|processing-instruction()">
- <xsl:param name="indent" select="'
'"/>
- <xsl:value-of select="$indent"/>
- <xsl:copy>
- <xsl:copy-of select="@*"/>
- <xsl:apply-templates>
- <xsl:with-param name="indent" select="concat($indent, $indent-increment)"/>
- </xsl:apply-templates>
- <xsl:if test="*">
- <xsl:value-of select="$indent"/>
- </xsl:if>
- </xsl:copy>
- </xsl:template>
- <!-- WARNING: this is dangerous. Handle with care -->
- <xsl:template match="text()[normalize-space(.)='']"/>
- </xsl:stylesheet>"""
- def prettyPrint(data):
- ''' pretty-print data - can be a:
- * xml string
- * list of etree.elements (return single pretty-prints that will be \n concatenated)
- * single etree or single element
- '''
- xslt_doc = etree.fromstring(prettyXSL)
- transform = etree.XSLT(xslt_doc)
- if isinstance(data, basestring):
- doc = etree.fromstring(data)
- return etree.tostring(transform(doc))
- elif isinstance(data, (tuple, list)): #assume data is list of etree.elements
- return '\n'.join(etree.tostring(transform(e)) for e in data)
- else:
- return etree.tostring(transform(data))
|