Coverage for lino/utils/xmlgen/__init__.py : 86%

Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
# -*- coding: UTF-8 -*- # Copyright 2011-2015 Luc Saffre # License: BSD (see file COPYING for details)
`ElementTree Builder <http://effbot.org/zone/element-builder.htm>`_
.. autosummary:: :toctree:
html intervat odf cbss sepa
>>> E = Namespace('http://my.ns', ... "bar baz bar-o-baz foo-bar class def")
>>> bob = E.bar_o_baz() >>> baz = E.add_child(bob, 'baz', class_='first') >>> print E.tostring(baz) <baz xmlns="http://my.ns" class="first" />
>>> bob = E.bar_o_baz('Hello', class_='first', foo_bar="3") >>> print E.tostring(bob) <bar-o-baz xmlns="http://my.ns" class="first" foo-bar="3">Hello</bar-o-baz>
The following reproduces a pifall. Here is the initial code:
>>> E = Namespace(None, "div br") >>> bob = E.div("a", E.br(), "b", E. br(), "c", E.br(), "d") >>> print E.tostring(bob) <div>a<br />b<br />c<br />d</div>
The idea is to use `join_elems` to insert the <br> tags:
>>> from lino.utils import join_elems
But surprise:
>>> elems = join_elems(["a", "b", "c", "d"], sep=E.br()) >>> print E.tostring(E.div(*elems)) <div>a<br />bcd<br />bcd<br />bcd</div>
What happened here is that the same `<br>` element instance was being inserted multiple times at different places. The correct usage is without the parentheses so that `join_elems` instantiates each time a new element:
>>> elems = join_elems(["a", "b", "c", "d"], sep=E.br) >>> print E.tostring(E.div(*elems)) <div>a<br />b<br />c<br />d</div>
"""
#~ from lino.utils import Warning
"""Return a pretty-printed XML string for the Element. """ return prettify(etree.tostring(elem, 'utf-8')) # the following also indented: # from http://renesd.blogspot.com/2007/05/pretty-print-xml-with-python.html # via http://broadcast.oreilly.com/2010/03/pymotw-creating-xml-documents.html #~ from xml.dom import minidom #~ rough_string = etree.tostring(elem, 'utf-8') #~ reparsed = minidom.parseString(rough_string) #~ return reparsed.toprettyxml(indent=" ")
"""The `python-future <http://python-future.org/>`__ package introduces a special helper class `newstr` which simulates, under Python 2, the behaviour of Python 3 strings. But `xml.etree.ElementTree <https://docs.python.org/2/library/xml.etree.elementtree.html>`__ in Python 2 doesn't know about `python-future` and produces invalid XML when you feed it with such a string.
So this function converts any `newstr` back to a real newstr.
TODO: Not yet tested under Python 3. At the best it is just unefficient.
"""
and del from not while as elif global or with assert else if pass yield break except import print class exec in raise continue finally is return def for lambda try """.split())
#~ datetime.datetime: py2str, #~ IncompleteDate : lambda e,v : str(v), datetime.datetime: lambda e, v: v.strftime("%Y%m%dT%H%M%S"), datetime.date: lambda e, v: v.strftime("%Y-%m-%d"), int: lambda e, v: str(v), }
"""An XML namespace. Base class for :class:`lino.utils.xmlgen.html.HtmlNamespace` and the namespaces defined in :mod:`lino.utils.xmlgen.intervat`.
"""
#~ if prefix is not None: #~ self.prefix = prefix #~ kw.setdefault('typemap',TYPEMAP) #~ kw.setdefault('makeelement',self.makeelement) #~ nsmap = kw.setdefault('nsmap',{})
self.prefix = prefix #~ kw.update(namespace=self.targetNamespace)
etree.register_namespace(self.prefix, self.targetNamespace) #~ if prefix: #~ nsmap[prefix] = self.targetNamespace #~ if used_namespaces is not None: #~ self.used_namespaces = used_namespaces #~ if self.used_namespaces is not None: #~ for ns in self.used_namespaces: #~ nsmap[ns.prefix] = ns.targetNamespace #~ self._element_maker = ElementMaker(**kw) #~ self._source_elements = {}
#~ kw.setdefault('xml_declaration',False) #~ kw.setdefault('encoding','utf-8') #~ kw.update(xml_declaration=False) #~ kw.update(encoding='utf-8') #~ return s #~ return minidom.parseString(s).toprettyxml(indent=" ")
#~ ns = self._element_maker._namespace #~ if ns is None: return kw
#~ if tag == 'div': #~ logger.info("20130805 create_element %s",children) elem.attrib.update(self.makeattribs(**item)) #~ if len(elem) and len(elem[-1]) == 0: else: else: raise TypeError("bad argument: %r" % item) #~ print "20130805 added %s --> %s" % (item,self.tostring(elem))
#~ if iname in ('class','for','in','def'): #~ setattr(self,iname,getattr(self._element_maker,name))
#~ if self.targetNamespace is None or name.startswith('{'): #~ return elem.get(name) return elem.get(self._element_maker._namespace + name)
#~ def update_attribs(self,root,**kw): root.attrib.update(self.makeattribs(**kw))
ecl = getattr(self, _name) #~ kw = self.makeattribs(**kw) #~ print 20120420, kw e = ecl(*args, **kw) parent.append(e) return e
"""Build an element tree from the given XML source string.
This just forwards to the :meth:`xml.etree.ElementTree.fromstring` library function. See the `Parsing XML <https://docs.python.org/2.7/library/xml.etree.elementtree.html#parsing-xml>`__ section of the Python docs.
""" return etree.etree.fromstringlist([s], **kwargs)
"""Parses the given string into an XML Element.""" return RAW(*args)
import doctest doctest.testmod()
_test() |