0001"""
0002Parses XML and HTML to `lxml <http://codespeak.net/lxml/>`_ nodes
0003"""
0004
0005from lxml import etree
0006from httpencode.format import Format
0007
0008def load_xml(fp, content_type):
0009    return etree.parse(fp)
0010
0011def dump_xml_iter(data, content_type):
0012    return [etree.tostring(data)]
0013
0014xml = Format(
0015    'lxml_xml', ['text/xml', 'application/xml'],
0016    type='lxml.etree',
0017    load=load_xml,
0018    dump_iter=dump_xml_iter,
0019    secure=True)
0020
0021def load_html(fp, content_type):
0022    return etree.parse(fp, etree.HTMLParser())
0023
0024def dump_html_iter(data, content_type):
0025    return [html_transform(data)]
0026
0027html_xsl = '''
0028<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
0029  <xsl:output method="html" encoding="UTF-8" />
0030  <xsl:template match="/">
0031    <xsl:copy-of select="."/>
0032  </xsl:template>
0033</xsl:transform>
0034'''
0035
0036html_transform = etree.XSLT(etree.XML(html_xsl))
0037
0038# Should include other HTML types
0039html = Format(
0040    'lxml_html', ['text/html'],
0041    type='lxml.etree',
0042    load=load_html,
0043    dump_iter=dump_html_iter,
0044    secure=True)