~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to turbosimpletal/zptsupport.py

  • Committer: Michael Hudson
  • Date: 2008-06-11 05:05:43 UTC
  • mfrom: (128.6.75 zpt-templating)
  • Revision ID: michael.hudson@canonical.com-20080611050543-o8vel8ydossw3wkc
merge zpt-templating.
this gets rid of all the kid templates and replaces them with zope page
templates and adds glue to render them under turbogears with the simpletal
library.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
"TurboGears support for Zope Page Templates"
2
2
 
 
3
import StringIO
3
4
import logging
4
5
import os
5
6
import pkg_resources
6
7
 
7
 
from zope.pagetemplate.pagetemplatefile import PageTemplateFile
 
8
from simpletal import simpleTAL, simpleTALES
8
9
 
9
10
log = logging.getLogger("turbogears.zptsupport")
10
11
 
 
12
 
11
13
_zpt_cache = {}
12
 
 
13
14
def zpt(tfile):
14
15
    tinstance = _zpt_cache.get(tfile)
15
 
    if tinstance is None:
16
 
        tinstance = _zpt_cache[tfile] = TGPageTemplateFile(tfile)
 
16
    stat = os.stat(tfile)
 
17
    if tinstance is None or tinstance.stat != stat:
 
18
        tinstance = _zpt_cache[tfile] = TemplateWrapper(
 
19
            simpleTAL.compileXMLTemplate(open(tfile)), tfile, stat)
17
20
    return tinstance
18
21
 
19
 
class TGPageTemplateFile(PageTemplateFile):
20
 
 
21
 
    def pt_getContext(self, args=(), options={}, **ignored):
22
 
        namespace = super(TGPageTemplateFile, self).pt_getContext(
23
 
            args, options, **ignored)
24
 
        namespace.update(options)
25
 
        return namespace
 
22
 
 
23
class TemplateWrapper(object):
 
24
 
 
25
    def __init__(self, template, filename, stat):
 
26
        self.template = template
 
27
        self.filename = filename
 
28
        self.stat = stat
 
29
 
 
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)
 
36
        return s.getvalue()
 
37
 
 
38
    @property
 
39
    def macros(self):
 
40
        return self.template.macros
 
41
 
26
42
 
27
43
class TurboZpt(object):
28
44
    extension = "pt"
64
80
        if self.get_extra_vars:
65
81
            data.update(self.get_extra_vars())
66
82
        data.update(info)
67
 
        return tinstance(**data).encode('utf-8')
 
83
        return tinstance.expand(**data).encode('utf-8')