author | Tero Marttila <terom@fixme.fi> |
Thu, 04 Jun 2009 11:23:28 +0300 | |
changeset 52 | 3071d0709c4a |
child 53 | 14d73f544764 |
permissions | -rw-r--r-- |
52
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
1 |
""" |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
2 |
Generating HTML tags |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
3 |
""" |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
4 |
|
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
5 |
from cgi import escape |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
6 |
|
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
7 |
def tag_attr (name, value) : |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
8 |
return u'%s="%s"' % (name.rstrip('_'), escape(value, True)) |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
9 |
|
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
10 |
def tag_subcontent (subcontent) : |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
11 |
if not subcontent : |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
12 |
# skip |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
13 |
return |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
14 |
|
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
15 |
elif not isinstance(subcontent, basestring) and hasattr(subcontent, '__iter__') : |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
16 |
# render each sub-item recursively |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
17 |
for sc in subcontent : |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
18 |
for line in tag_subcontent(sc) : |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
19 |
yield line |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
20 |
|
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
21 |
else : |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
22 |
yield subcontent |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
23 |
|
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
24 |
def tag_content (content) : |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
25 |
if not content: |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
26 |
# no output |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
27 |
return |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
28 |
|
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
29 |
elif isinstance(content, basestring) : |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
30 |
# escape raw vlues |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
31 |
yield escape(unicode(content)) |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
32 |
|
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
33 |
else : |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
34 |
# treat it as subcontent |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
35 |
for line in tag_subcontent(content) : |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
36 |
yield line |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
37 |
|
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
38 |
def tag (name, *content, **attrs) : |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
39 |
attr_stuff = " " + " ".join(tag_attr(n, v) for n, v in attrs.iteritems()) if attrs else "" |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
40 |
|
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
41 |
if content and all(content) : |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
42 |
# tag with content |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
43 |
yield u"<%s%s>" % (name, attr_stuff) |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
44 |
|
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
45 |
for c in content : |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
46 |
for line in tag_content(c) : |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
47 |
yield u"\t" + line |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
48 |
|
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
49 |
yield u"</%s>" % (name, ) |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
50 |
|
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
51 |
else : |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
52 |
# singleton tag |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
53 |
yield u"<%s%s />" % (name, attr_stuff) |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
54 |
|
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
55 |
def raw (data) : |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
56 |
yield data |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
57 |
|
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
58 |
class TagFactory (object) : |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
59 |
def __getattr__ (self, name) : |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
60 |
def build_tag (*content, **attrs) : |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
61 |
return tag(name, *content, **attrs) |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
62 |
|
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
63 |
return build_tag |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
64 |
|
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
65 |
tags = TagFactory() |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
66 |
|
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
67 |
def render_lines (tags, charset=None) : |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
68 |
for line in tag_content(tags) : |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
69 |
if charset : |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
70 |
yield line.encode(charset) |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
71 |
|
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
72 |
else : |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
73 |
yield line |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
74 |
|
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
75 |
def render (tags, charset=None) : |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
76 |
data = u'\n'.join(render_lines(tags)) |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
77 |
|
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
78 |
if charset : |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
79 |
return data.encode(charset) |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
80 |
|
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
81 |
else : |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
82 |
return data |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
83 |
|
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
84 |
def render_out (tags, out, charset='utf-8') : |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
85 |
""" |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
86 |
Write the rendered tags into the given output stream using the given encoding |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
87 |
""" |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
88 |
|
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
89 |
for line in render_lines(tags, charset) : |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
90 |
out.write(line + '\n') |
3071d0709c4a
start writing some kind of nested-HTML-tag-generators magic to use instead of templates :)
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
91 |