1
1
"TurboGears support for Zope Page Templates"
5
from template import PageTemplate
8
from simpletal import simpleTAL, simpleTALES
9
10
log = logging.getLogger("turbogears.zptsupport")
11
def _recompile_template(package, basename, tfile, classname):
12
log.debug("Recompiling template for %s" % classname)
13
mod = PageTemplate(tfile)
14
mtime = os.stat(tfile).st_mtime
15
tinstance = _zpt_cache.get(tfile)
17
if tinstance is None or tinstance.stat != stat:
18
tinstance = _zpt_cache[tfile] = TemplateWrapper(
19
simpleTAL.compileXMLTemplate(open(tfile)), tfile, stat)
23
class TemplateWrapper(object):
25
def __init__(self, template, filename, stat):
26
self.template = template
27
self.filename = filename
30
def expand(self, **info):
31
context = simpleTALES.Context(allowPythonPath=1)
32
for k, v in info.iteritems():
33
context.addGlobal(k, v)
34
s = StringIO.StringIO()
35
self.template.expandInline(context, s)
40
return self.template.macros
43
class TurboZpt(object):
21
def __init__(self, extra_vars_func=None, options={}):
22
self.options = options
23
self.get_extra_vars = extra_vars_func
24
self.compiledTemplates = {}
46
def __init__(self, extra_vars_func=None):
47
self.get_extra_vars = extra_vars_func
26
49
def load_template(self, classname, loadingSite=False):
27
50
"""Searches for a template along the Python path.
29
52
Template files must end in ".pt" and be in legitimate packages.
30
U can set "zpt.cache_templates" option to cache a loaded template
31
class and only check for updates. Templates are automatically
32
checked for changes and reloaded as neccessary.
53
Templates are automatically checked for changes and reloaded as
34
ct = self.compiledTemplates
36
56
divider = classname.rfind(".")
38
58
package = classname[0:divider]
41
61
raise ValueError, "All templates must be in a package"
43
cache_templates = self.options.get("zpt.cache_templates", True)
44
tfile = pkg_resources.resource_filename(package,
50
if ct.has_key(classname):
51
mtime = os.stat(tfile).st_mtime
53
if mod.__mtime__ != mtime:
55
mod = _recompile_template(package, basename, tfile, classname)
58
# use template from cache
61
# First time compile template
62
mod = PageTemplate(tfile)
63
mod.__mtime__ = os.stat(tfile).st_mtime
66
mod = PageTemplate(tfile)
63
tfile = pkg_resources.resource_filename(
64
package, "%s.%s" % (basename, self.extension))
70
67
def render(self, info, format="html", fragment=False, template=None):
71
"""Renders data in the desired format.
73
@param info: the data / context itself
76
@type format: "string"
77
@para template: name of the template to use
78
@type template: string
80
#if isinstance(template, type):
84
tinstance = self.load_template(template)
85
log.debug("Applying template %s" % (tinstance.filename))
87
if self.get_extra_vars:
88
data.update(self.get_extra_vars())
90
print '!!!!', data.keys()
91
return tinstance(**data)
68
"""Renders data in the desired format.
93
def transform(self, info, template):
94
"Render the output to Elements"
70
@param info: the data / context itself
73
@type format: "string"
74
@para template: name of the template to use
75
@type template: string
77
tinstance = self.load_template(template)
78
log.debug("Applying template %s" % (tinstance.filename))
80
if self.get_extra_vars:
81
data.update(self.get_extra_vars())
83
return tinstance.expand(**data).encode('utf-8')