~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to turbosimpletal/zptsupport.py

  • Committer: Michael Hudson
  • Date: 2008-06-13 05:33:39 UTC
  • mto: This revision was merged to the branch mainline in revision 164.
  • Revision ID: michael.hudson@canonical.com-20080613053339-w1in3qyd8gq3e8zg
more progress

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
"TurboGears support for Zope Page Templates"
 
2
 
 
3
import StringIO
 
4
import logging
 
5
import os
 
6
import pkg_resources
 
7
 
 
8
from simpletal import simpleTAL, simpleTALES
 
9
 
 
10
log = logging.getLogger("turbogears.zptsupport")
 
11
 
 
12
 
 
13
_zpt_cache = {}
 
14
def zpt(tfile):
 
15
    tinstance = _zpt_cache.get(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)
 
20
    return tinstance
 
21
 
 
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
    def expand_(self, f, **info):
 
39
        context = simpleTALES.Context(allowPythonPath=1)
 
40
        for k, v in info.iteritems():
 
41
            context.addGlobal(k, v)
 
42
        self.template.expand(context, f, 'utf-8')
 
43
 
 
44
    @property
 
45
    def macros(self):
 
46
        return self.template.macros
 
47
 
 
48
 
 
49
class TurboZpt(object):
 
50
    extension = "pt"
 
51
 
 
52
    def __init__(self, extra_vars_func=None):
 
53
        self.get_extra_vars = extra_vars_func
 
54
 
 
55
    def load_template(self, classname, loadingSite=False):
 
56
        """Searches for a template along the Python path.
 
57
 
 
58
        Template files must end in ".pt" and be in legitimate packages.
 
59
        Templates are automatically checked for changes and reloaded as
 
60
        neccessary.
 
61
        """
 
62
        divider = classname.rfind(".")
 
63
        if divider > -1:
 
64
            package = classname[0:divider]
 
65
            basename = classname[divider+1:]
 
66
        else:
 
67
            raise ValueError, "All templates must be in a package"
 
68
 
 
69
        tfile = pkg_resources.resource_filename(
 
70
            package, "%s.%s" % (basename, self.extension))
 
71
        return zpt(tfile)
 
72