1
1
"TurboGears support for Zope Page Templates"
5
from template import PageTemplate
7
#from zope.pagetemplate.pagetemplatefile import PageTemplateFile
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
tinstance = _zpt_cache[tfile] = TemplateWrapper(
18
simpleTAL.compileXMLTemplate(open(tfile)), tfile)
21
class TemplateWrapper(object):
23
def __init__(self, template, filename):
24
self.template = template
25
self.filename = filename
27
def expand(self, **info):
28
context = simpleTALES.Context(allowPythonPath=1)
29
for k, v in info.iteritems():
30
context.addGlobal(k, v)
31
s = StringIO.StringIO()
32
self.template.expandInline(context, s)
37
return self.template.macros
39
## class TGPageTemplateFile(PageTemplateFile):
41
## def pt_getContext(self, args=(), options={}, **ignored):
42
## namespace = super(TGPageTemplateFile, self).pt_getContext(
43
## args, options, **ignored)
44
## namespace.update(options)
47
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 = {}
50
def __init__(self, extra_vars_func=None):
51
self.get_extra_vars = extra_vars_func
26
53
def load_template(self, classname, loadingSite=False):
27
54
"""Searches for a template along the Python path.
29
56
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.
57
Templates are automatically checked for changes and reloaded as
34
ct = self.compiledTemplates
36
60
divider = classname.rfind(".")
38
62
package = classname[0:divider]
41
65
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)
67
tfile = pkg_resources.resource_filename(
68
package, "%s.%s" % (basename, self.extension))
70
71
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())
91
return str(tinstance(**data))
72
"""Renders data in the desired format.
93
def transform(self, info, template):
94
"Render the output to Elements"
74
@param info: the data / context itself
77
@type format: "string"
78
@para template: name of the template to use
79
@type template: string
81
tinstance = self.load_template(template)
82
log.debug("Applying template %s" % (tinstance.filename))
84
if self.get_extra_vars:
85
data.update(self.get_extra_vars())
87
return tinstance.expand(**data).encode('utf-8')