annotate markup/plugin.py @ 192:cda3bdfc19ed

Expression evaluation now differentiates between undefined variables and variables that are defined but set to `None`.
author cmlenz
date Wed, 23 Aug 2006 17:49:14 +0000
parents 35e768b0a58b
children 547511535aaa
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():
161
a25f9fc5787d Various docstring additions and other cosmetic changes.
cmlenz
parents: 151
diff changeset
38 for item in et_to_stream(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
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
57 def load_template(self, 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
58 """Find a template specified in python 'dot' notation."""
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
59 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
60 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
61 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
62 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
63 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
64
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 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
66
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 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
68 """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
69 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
70
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 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
72 """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
73 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
74 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
75
192
cda3bdfc19ed Expression evaluation now differentiates between undefined variables and variables that are defined but set to `None`.
cmlenz
parents: 183
diff changeset
76 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
77 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
78 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
79 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
80 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
81
192
cda3bdfc19ed Expression evaluation now differentiates between undefined variables and variables that are defined but set to `None`.
cmlenz
parents: 183
diff changeset
82 # 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
83 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
84 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
85 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
86 def value_of(name, default=None):
cda3bdfc19ed Expression evaluation now differentiates between undefined variables and variables that are defined but set to `None`.
cmlenz
parents: 183
diff changeset
87 val = ctxt.get(name, Undefined)
cda3bdfc19ed Expression evaluation now differentiates between undefined variables and variables that are defined but set to `None`.
cmlenz
parents: 183
diff changeset
88 if val 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
89 return val
cda3bdfc19ed Expression evaluation now differentiates between undefined variables and variables that are defined but set to `None`.
cmlenz
parents: 183
diff changeset
90 return default
cda3bdfc19ed Expression evaluation now differentiates between undefined variables and variables that are defined but set to `None`.
cmlenz
parents: 183
diff changeset
91 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
92
cda3bdfc19ed Expression evaluation now differentiates between undefined variables and variables that are defined but set to `None`.
cmlenz
parents: 183
diff changeset
93 return template.generate(ctxt)
Copyright (C) 2012-2017 Edgewall Software