annotate markup/plugin.py @ 209:fc6b2fb66518 trunk

* Fix bug in handling of undefined entities. Thanks to Arnar for reporting the issue on IRC. * Enable the `XMLParser` to handle HTML entities without requiring the declaration of a HTML document type.
author cmlenz
date Tue, 29 Aug 2006 16:34:40 +0000
parents b0e1adbf1173
children 58d974683419
rev   line source
4
49364e784c47 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 -*-
49364e784c47 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
59eb24184e9c Switch copyright to Edgewall and URLs to markup.edgewall.org.
cmlenz
parents: 29
diff changeset
3 # Copyright (C) 2006 Edgewall Software
21
b4d17897d053 * 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
49364e784c47 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.
49364e784c47 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 #
49364e784c47 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
49364e784c47 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
59eb24184e9c 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
49364e784c47 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 #
49364e784c47 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
49364e784c47 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
59eb24184e9c 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
49364e784c47 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
ab8703fa68b8 * 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
ab8703fa68b8 * 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.
ab8703fa68b8 * 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 """
ab8703fa68b8 * 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
49364e784c47 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
49364e784c47 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
2f30ce3fb85e Renamed `Attributes` to `Attrs` to reduce the verbosity.
cmlenz
parents: 161
diff changeset
21 from markup.core import Attrs, Stream, QName
192
b64e36bc1100 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
b64e36bc1100 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
49364e784c47 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
49364e784c47 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
b64e36bc1100 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
7b1f07496bf7 Various docstring additions and other cosmetic changes.
cmlenz
parents: 151
diff changeset
27 """Converts the given ElementTree element to a markup stream."""
72
ee092ccb3af1 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
ee092ccb3af1 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('{'):
ee092ccb3af1 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:]
ee092ccb3af1 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
1f6ca5028770 Follow-up to [227]. Forgot to rename one instance of `Attributes`.
cmlenz
parents: 182
diff changeset
32 attrib = Attrs(element.items())
72
ee092ccb3af1 add a function `ET` in the template plugin including `ElementTree` elements in the output stream
mgood
parents: 66
diff changeset
33
161
7b1f07496bf7 Various docstring additions and other cosmetic changes.
cmlenz
parents: 151
diff changeset
34 yield (Stream.START, (tag_name, attrib), (None, -1, -1))
72
ee092ccb3af1 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
fb71efbd6ad4 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
ee092ccb3af1 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
eb0ba1060564 Fix refactoring leftover from [242]. Closes #40.
cmlenz
parents: 192
diff changeset
38 for item in ET(child):
72
ee092ccb3af1 add a function `ET` in the template plugin including `ElementTree` elements in the output stream
mgood
parents: 66
diff changeset
39 yield item
151
fb71efbd6ad4 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
ee092ccb3af1 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
fb71efbd6ad4 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
49364e784c47 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
f5ec6d4a61e4 * Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents: 72
diff changeset
44
4
49364e784c47 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
ab8703fa68b8 * 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
49364e784c47 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
49364e784c47 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):
49364e784c47 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:
49364e784c47 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 = {}
49364e784c47 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
49364e784c47 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
49364e784c47 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)
49364e784c47 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
49364e784c47 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
49364e784c47 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
49364e784c47 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):
49364e784c47 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."""
49364e784c47 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('.')
49364e784c47 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:
49364e784c47 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]
49364e784c47 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
b4d17897d053 * 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
49364e784c47 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
49364e784c47 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)
49364e784c47 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
49364e784c47 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
b4d17897d053 * 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
49364e784c47 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)
49364e784c47 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
49364e784c47 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
b4d17897d053 * 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
49364e784c47 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):
49364e784c47 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)
49364e784c47 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
b64e36bc1100 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
49364e784c47 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:
49364e784c47 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())
49364e784c47 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
b64e36bc1100 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
49364e784c47 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
b64e36bc1100 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
b64e36bc1100 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):
b64e36bc1100 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
b64e36bc1100 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
b64e36bc1100 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):
197
b0e1adbf1173 simplify the `value_of` method exported in the template plugin
mgood
parents: 196
diff changeset
87 return ctxt.get(name, default)
192
b64e36bc1100 Expression evaluation now differentiates between undefined variables and variables that are defined but set to `None`.
cmlenz
parents: 183
diff changeset
88 ctxt['value_of'] = value_of
b64e36bc1100 Expression evaluation now differentiates between undefined variables and variables that are defined but set to `None`.
cmlenz
parents: 183
diff changeset
89
b64e36bc1100 Expression evaluation now differentiates between undefined variables and variables that are defined but set to `None`.
cmlenz
parents: 183
diff changeset
90 return template.generate(ctxt)
Copyright (C) 2012-2017 Edgewall Software