formencode.htmlgen
– Convenient building of ElementTree nodes¶
Kind of like htmlgen, only much simpler. The only important symbol
that is exported is html
.
This builds ElementTree nodes, but with some extra useful methods.
(Open issue: should it use ElementTree
more, and the raw
Element
stuff less?)
You create tags with attribute access. I.e., the A
anchor tag is
html.a
. The attributes of the HTML tag are done with keyword
arguments. The contents of the tag are the non-keyword arguments
(concatenated). You can also use the special c
keyword, passing a
list, tuple, or single tag, and it will make up the contents (this is
useful because keywords have to come after all non-keyword arguments,
which is non-intuitive). Or you can chain them, adding the keywords
with one call, then the body with a second call, like:
>>> str(html.a(href='http://yahoo.com')('<Yahoo>'))
'<a href="http://yahoo.com"><Yahoo></a>'
Note that strings will be quoted; only tags given explicitly will remain unquoted.
If the value of an attribute is None, then no attribute will be inserted. So:
>>> str(html.a(href='http://www.yahoo.com', name=None,
... c='Click Here'))
'<a href="http://www.yahoo.com">Click Here</a>'
If the value is None, then the empty string is used. Otherwise str() is called on the value.
html
can also be called, and it will produce a special list from
its arguments, which adds a __str__
method that does html.str
(which handles quoting, flattening these lists recursively, and using
‘’ for None
).
html.comment
will generate an HTML comment, like
html.comment('comment text')
– note that it cannot take keyword
arguments (because they wouldn’t mean anything).
Examples:
>>> str(html.html(
... html.head(html.title("Page Title")),
... html.body(
... bgcolor='#000066',
... text='#ffffff',
... c=[html.h1('Page Title'),
... html.p('Hello world!')],
... )))
'<html><head><title>Page Title</title></head><body bgcolor="#000066" text="#ffffff"><h1>Page Title</h1><p>Hello world!</p></body></html>'
>>> str(html.a(href='#top')('return to top'))
'<a href="#top">return to top</a>'