Mercurial > genshi > genshi-test
annotate markup/plugin.py @ 229:110d69dbbda3
Add support for loading a template from a string to the template engine plugin. Closes #52. Thanks to Alberto for the patch.
author | cmlenz |
---|---|
date | Mon, 11 Sep 2006 09:47:21 +0000 |
parents | a593d57f478f |
children |
rev | line source |
---|---|
4
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
1 # -*- coding: utf-8 -*- |
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
2 # |
66
822089ae65ce
Switch copyright to Edgewall and URLs to markup.edgewall.org.
cmlenz
parents:
29
diff
changeset
|
3 # Copyright (C) 2006 Edgewall Software |
21
eca77129518a
* Include paths are now interpreted relative to the path of the including template. Closes #3.
cmlenz
parents:
4
diff
changeset
|
4 # Copyright (C) 2006 Matthew Good |
4
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
5 # All rights reserved. |
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
6 # |
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
7 # This software is licensed as described in the file COPYING, which |
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
8 # you should have received as part of this distribution. The terms |
66
822089ae65ce
Switch copyright to Edgewall and URLs to markup.edgewall.org.
cmlenz
parents:
29
diff
changeset
|
9 # are also available at http://markup.edgewall.org/wiki/License. |
4
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
10 # |
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
11 # This software consists of voluntary contributions made by many |
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
12 # individuals. For the exact contribution history, see the revision |
66
822089ae65ce
Switch copyright to Edgewall and URLs to markup.edgewall.org.
cmlenz
parents:
29
diff
changeset
|
13 # history and logs, available at http://markup.edgewall.org/log/. |
4
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
14 |
29
4b6cee37ce62
* Minor simplification of template directives: they no longer get passed the template instance and the position, as no directive was actually using
cmlenz
parents:
27
diff
changeset
|
15 """Basic support for the template engine plugin API used by TurboGears and |
4b6cee37ce62
* Minor simplification of template directives: they no longer get passed the template instance and the position, as no directive was actually using
cmlenz
parents:
27
diff
changeset
|
16 CherryPy/Buffet. |
4b6cee37ce62
* Minor simplification of template directives: they no longer get passed the template instance and the position, as no directive was actually using
cmlenz
parents:
27
diff
changeset
|
17 """ |
4b6cee37ce62
* Minor simplification of template directives: they no longer get passed the template instance and the position, as no directive was actually using
cmlenz
parents:
27
diff
changeset
|
18 |
4
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
19 from pkg_resources import resource_filename |
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
20 |
182
41db0260ebb1
Renamed `Attributes` to `Attrs` to reduce the verbosity.
cmlenz
parents:
161
diff
changeset
|
21 from markup.core import Attrs, Stream, QName |
192
cda3bdfc19ed
Expression evaluation now differentiates between undefined variables and variables that are defined but set to `None`.
cmlenz
parents:
183
diff
changeset
|
22 from markup.eval import Undefined |
cda3bdfc19ed
Expression evaluation now differentiates between undefined variables and variables that are defined but set to `None`.
cmlenz
parents:
183
diff
changeset
|
23 from markup.input import HTML, XML |
4
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
24 from markup.template import Context, Template, TemplateLoader |
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
25 |
192
cda3bdfc19ed
Expression evaluation now differentiates between undefined variables and variables that are defined but set to `None`.
cmlenz
parents:
183
diff
changeset
|
26 def ET(element): |
161
a25f9fc5787d
Various docstring additions and other cosmetic changes.
cmlenz
parents:
151
diff
changeset
|
27 """Converts the given ElementTree element to a markup stream.""" |
72
29f22f4fd583
add a function `ET` in the template plugin including `ElementTree` elements in the output stream
mgood
parents:
66
diff
changeset
|
28 tag_name = element.tag |
29f22f4fd583
add a function `ET` in the template plugin including `ElementTree` elements in the output stream
mgood
parents:
66
diff
changeset
|
29 if tag_name.startswith('{'): |
29f22f4fd583
add a function `ET` in the template plugin including `ElementTree` elements in the output stream
mgood
parents:
66
diff
changeset
|
30 tag_name = tag_name[1:] |
29f22f4fd583
add a function `ET` in the template plugin including `ElementTree` elements in the output stream
mgood
parents:
66
diff
changeset
|
31 tag_name = QName(tag_name) |
183
35e768b0a58b
Follow-up to [227]. Forgot to rename one instance of `Attributes`.
cmlenz
parents:
182
diff
changeset
|
32 attrib = Attrs(element.items()) |
72
29f22f4fd583
add a function `ET` in the template plugin including `ElementTree` elements in the output stream
mgood
parents:
66
diff
changeset
|
33 |
161
a25f9fc5787d
Various docstring additions and other cosmetic changes.
cmlenz
parents:
151
diff
changeset
|
34 yield (Stream.START, (tag_name, attrib), (None, -1, -1)) |
72
29f22f4fd583
add a function `ET` in the template plugin including `ElementTree` elements in the output stream
mgood
parents:
66
diff
changeset
|
35 if element.text: |
151
77779d507d40
The convention for an unknown position is `(None, -1, -1)`.
cmlenz
parents:
149
diff
changeset
|
36 yield Stream.TEXT, element.text, (None, -1, -1) |
72
29f22f4fd583
add a function `ET` in the template plugin including `ElementTree` elements in the output stream
mgood
parents:
66
diff
changeset
|
37 for child in element.getchildren(): |
196 | 38 for item in ET(child): |
72
29f22f4fd583
add a function `ET` in the template plugin including `ElementTree` elements in the output stream
mgood
parents:
66
diff
changeset
|
39 yield item |
151
77779d507d40
The convention for an unknown position is `(None, -1, -1)`.
cmlenz
parents:
149
diff
changeset
|
40 yield Stream.END, tag_name, (None, -1, -1) |
72
29f22f4fd583
add a function `ET` in the template plugin including `ElementTree` elements in the output stream
mgood
parents:
66
diff
changeset
|
41 if element.tail: |
151
77779d507d40
The convention for an unknown position is `(None, -1, -1)`.
cmlenz
parents:
149
diff
changeset
|
42 yield Stream.TEXT, element.tail, (None, -1, -1) |
4
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
43 |
77
f1aa49c759b2
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
72
diff
changeset
|
44 |
4
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
45 class TemplateEnginePlugin(object): |
29
4b6cee37ce62
* Minor simplification of template directives: they no longer get passed the template instance and the position, as no directive was actually using
cmlenz
parents:
27
diff
changeset
|
46 """Implementation of the plugin API.""" |
4
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
47 |
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
48 def __init__(self, extra_vars_func=None, options=None): |
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
49 if options is None: |
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
50 options = {} |
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
51 # TODO get loader_args from the options dict |
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
52 |
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
53 self.loader = TemplateLoader(auto_reload=True) |
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
54 self.options = options |
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
55 self.get_extra_vars = extra_vars_func |
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
56 |
229
110d69dbbda3
Add support for loading a template from a string to the template engine plugin. Closes #52. Thanks to Alberto for the patch.
cmlenz
parents:
197
diff
changeset
|
57 def load_template(self, templatename, template_string=None): |
110d69dbbda3
Add support for loading a template from a string to the template engine plugin. Closes #52. Thanks to Alberto for the patch.
cmlenz
parents:
197
diff
changeset
|
58 """Find a template specified in python 'dot' notation, or load one from |
110d69dbbda3
Add support for loading a template from a string to the template engine plugin. Closes #52. Thanks to Alberto for the patch.
cmlenz
parents:
197
diff
changeset
|
59 a string. |
110d69dbbda3
Add support for loading a template from a string to the template engine plugin. Closes #52. Thanks to Alberto for the patch.
cmlenz
parents:
197
diff
changeset
|
60 """ |
110d69dbbda3
Add support for loading a template from a string to the template engine plugin. Closes #52. Thanks to Alberto for the patch.
cmlenz
parents:
197
diff
changeset
|
61 if template_string is not None: |
110d69dbbda3
Add support for loading a template from a string to the template engine plugin. Closes #52. Thanks to Alberto for the patch.
cmlenz
parents:
197
diff
changeset
|
62 return Template(template_string) |
110d69dbbda3
Add support for loading a template from a string to the template engine plugin. Closes #52. Thanks to Alberto for the patch.
cmlenz
parents:
197
diff
changeset
|
63 |
4
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
64 divider = templatename.rfind('.') |
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
65 if divider >= 0: |
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
66 package = templatename[:divider] |
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
67 basename = templatename[divider + 1:] + '.html' |
21
eca77129518a
* Include paths are now interpreted relative to the path of the including template. Closes #3.
cmlenz
parents:
4
diff
changeset
|
68 templatename = resource_filename(package, basename) |
4
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
69 |
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
70 return self.loader.load(templatename) |
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
71 |
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
72 def render(self, info, format='html', fragment=False, template=None): |
21
eca77129518a
* Include paths are now interpreted relative to the path of the including template. Closes #3.
cmlenz
parents:
4
diff
changeset
|
73 """Render the template to a string using the provided info.""" |
4
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
74 return self.transform(info, template).render(method=format) |
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
75 |
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
76 def transform(self, info, template): |
21
eca77129518a
* Include paths are now interpreted relative to the path of the including template. Closes #3.
cmlenz
parents:
4
diff
changeset
|
77 """Render the output to an event stream.""" |
4
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
78 if not isinstance(template, Template): |
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
79 template = self.load_template(template) |
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
80 |
192
cda3bdfc19ed
Expression evaluation now differentiates between undefined variables and variables that are defined but set to `None`.
cmlenz
parents:
183
diff
changeset
|
81 data = {'ET': ET, 'HTML': HTML, 'XML': XML} |
4
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
82 if self.get_extra_vars: |
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
83 data.update(self.get_extra_vars()) |
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
84 data.update(info) |
192
cda3bdfc19ed
Expression evaluation now differentiates between undefined variables and variables that are defined but set to `None`.
cmlenz
parents:
183
diff
changeset
|
85 ctxt = Context(**data) |
4
f8612f05af99
Added first stab of an implementation of the !TurboGears [http://www.turbogears.org/docs/plugins/template.html plugin API for template engines], and also a !TurboGears-based example using this plugin. Both written by Matt Good.
cmlenz
parents:
diff
changeset
|
86 |
192
cda3bdfc19ed
Expression evaluation now differentiates between undefined variables and variables that are defined but set to `None`.
cmlenz
parents:
183
diff
changeset
|
87 # Some functions for Kid compatibility |
cda3bdfc19ed
Expression evaluation now differentiates between undefined variables and variables that are defined but set to `None`.
cmlenz
parents:
183
diff
changeset
|
88 def defined(name): |
cda3bdfc19ed
Expression evaluation now differentiates between undefined variables and variables that are defined but set to `None`.
cmlenz
parents:
183
diff
changeset
|
89 return ctxt.get(name, Undefined) is not Undefined |
cda3bdfc19ed
Expression evaluation now differentiates between undefined variables and variables that are defined but set to `None`.
cmlenz
parents:
183
diff
changeset
|
90 ctxt['defined'] = defined |
cda3bdfc19ed
Expression evaluation now differentiates between undefined variables and variables that are defined but set to `None`.
cmlenz
parents:
183
diff
changeset
|
91 def value_of(name, default=None): |
197
a593d57f478f
simplify the `value_of` method exported in the template plugin
mgood
parents:
196
diff
changeset
|
92 return ctxt.get(name, default) |
192
cda3bdfc19ed
Expression evaluation now differentiates between undefined variables and variables that are defined but set to `None`.
cmlenz
parents:
183
diff
changeset
|
93 ctxt['value_of'] = value_of |
cda3bdfc19ed
Expression evaluation now differentiates between undefined variables and variables that are defined but set to `None`.
cmlenz
parents:
183
diff
changeset
|
94 |
cda3bdfc19ed
Expression evaluation now differentiates between undefined variables and variables that are defined but set to `None`.
cmlenz
parents:
183
diff
changeset
|
95 return template.generate(ctxt) |