1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
"TurboGears support for Zope Page Templates"
import sys, os
from template import PageTemplate
import pkg_resources
import logging
log = logging.getLogger("turbogears.zptsupport")
def _recompile_template(package, basename, tfile, classname):
log.debug("Recompiling template for %s" % classname)
mod = PageTemplate(tfile)
mtime = os.stat(tfile).st_mtime
mod.__mtime__ = mtime
return mod
class TurboZpt:
extension = "pt"
def __init__(self, extra_vars_func=None, options={}):
self.options = options
self.get_extra_vars = extra_vars_func
self.compiledTemplates = {}
def load_template(self, classname, loadingSite=False):
"""Searches for a template along the Python path.
Template files must end in ".pt" and be in legitimate packages.
U can set "zpt.cache_templates" option to cache a loaded template
class and only check for updates. Templates are automatically
checked for changes and reloaded as neccessary.
"""
ct = self.compiledTemplates
divider = classname.rfind(".")
if divider > -1:
package = classname[0:divider]
basename = classname[divider+1:]
else:
raise ValueError, "All templates must be in a package"
cache_templates = self.options.get("zpt.cache_templates", True)
tfile = pkg_resources.resource_filename(package,
"%s.%s" %
(basename,
self.extension))
if cache_templates:
if ct.has_key(classname):
mtime = os.stat(tfile).st_mtime
mod = ct[classname]
if mod.__mtime__ != mtime:
# Recompile template
mod = _recompile_template(package, basename, tfile, classname)
ct[classname] = mod
#else:
# use template from cache
# pass
else:
# First time compile template
mod = PageTemplate(tfile)
mod.__mtime__ = os.stat(tfile).st_mtime
ct[classname] = mod
else:
mod = PageTemplate(tfile)
return mod
def render(self, info, format="html", fragment=False, template=None):
"""Renders data in the desired format.
@param info: the data / context itself
@type info: dict
@para format: "html"
@type format: "string"
@para template: name of the template to use
@type template: string
"""
#if isinstance(template, type):
# tclass = template
#else:
tinstance = self.load_template(template)
log.debug("Applying template %s" % (tinstance.filename))
data = dict()
if self.get_extra_vars:
data.update(self.get_extra_vars())
data.update(info)
return tinstance(**data).encode('utf-8')
def transform(self, info, template):
"Render the output to Elements"
pass
|