~loggerhead-team/loggerhead/trunk-rich

128.6.1 by Michael Hudson
add a lightly hacked copy of turbozpt (it's not much code)
1
"TurboGears support for Zope Page Templates"
2
128.6.57 by Michael Hudson
all tests pass, apart from the revision size limit one
3
import StringIO
128.6.67 by Michael Hudson
tidy up turbosimpletal a bit, add recompilation templates that have changed on
4
import os
128.6.1 by Michael Hudson
add a lightly hacked copy of turbozpt (it's not much code)
5
import pkg_resources
6
128.6.57 by Michael Hudson
all tests pass, apart from the revision size limit one
7
from simpletal import simpleTAL, simpleTALES
128.6.40 by Michael Hudson
remove the obscure here hack and tidy up turbozpt some more
8
128.6.67 by Michael Hudson
tidy up turbosimpletal a bit, add recompilation templates that have changed on
9
128.6.40 by Michael Hudson
remove the obscure here hack and tidy up turbozpt some more
10
_zpt_cache = {}
11
def zpt(tfile):
12
    tinstance = _zpt_cache.get(tfile)
128.6.67 by Michael Hudson
tidy up turbosimpletal a bit, add recompilation templates that have changed on
13
    stat = os.stat(tfile)
14
    if tinstance is None or tinstance.stat != stat:
128.6.58 by Michael Hudson
quiet simpletal's logging, unicode fixes
15
        tinstance = _zpt_cache[tfile] = TemplateWrapper(
128.6.67 by Michael Hudson
tidy up turbosimpletal a bit, add recompilation templates that have changed on
16
            simpleTAL.compileXMLTemplate(open(tfile)), tfile, stat)
128.6.40 by Michael Hudson
remove the obscure here hack and tidy up turbozpt some more
17
    return tinstance
18
128.6.67 by Michael Hudson
tidy up turbosimpletal a bit, add recompilation templates that have changed on
19
128.6.57 by Michael Hudson
all tests pass, apart from the revision size limit one
20
class TemplateWrapper(object):
21
128.6.67 by Michael Hudson
tidy up turbosimpletal a bit, add recompilation templates that have changed on
22
    def __init__(self, template, filename, stat):
128.6.57 by Michael Hudson
all tests pass, apart from the revision size limit one
23
        self.template = template
128.6.58 by Michael Hudson
quiet simpletal's logging, unicode fixes
24
        self.filename = filename
128.6.67 by Michael Hudson
tidy up turbosimpletal a bit, add recompilation templates that have changed on
25
        self.stat = stat
128.6.57 by Michael Hudson
all tests pass, apart from the revision size limit one
26
128.6.59 by Michael Hudson
mostly more unicode fixes
27
    def expand(self, **info):
128.6.57 by Michael Hudson
all tests pass, apart from the revision size limit one
28
        context = simpleTALES.Context(allowPythonPath=1)
128.6.59 by Michael Hudson
mostly more unicode fixes
29
        for k, v in info.iteritems():
128.6.57 by Michael Hudson
all tests pass, apart from the revision size limit one
30
            context.addGlobal(k, v)
31
        s = StringIO.StringIO()
128.6.59 by Michael Hudson
mostly more unicode fixes
32
        self.template.expandInline(context, s)
128.6.57 by Michael Hudson
all tests pass, apart from the revision size limit one
33
        return s.getvalue()
34
159.2.4 by Michael Hudson
more progress
35
    def expand_(self, f, **info):
36
        context = simpleTALES.Context(allowPythonPath=1)
37
        for k, v in info.iteritems():
38
            context.addGlobal(k, v)
39
        self.template.expand(context, f, 'utf-8')
40
128.6.57 by Michael Hudson
all tests pass, apart from the revision size limit one
41
    @property
42
    def macros(self):
43
        return self.template.macros
44
128.6.40 by Michael Hudson
remove the obscure here hack and tidy up turbozpt some more
45
128.6.30 by Michael Hudson
clean up dusty parts of turbozpt
46
class TurboZpt(object):
128.6.1 by Michael Hudson
add a lightly hacked copy of turbozpt (it's not much code)
47
    extension = "pt"
128.6.30 by Michael Hudson
clean up dusty parts of turbozpt
48
49
    def __init__(self, extra_vars_func=None):
50
        self.get_extra_vars = extra_vars_func
51
128.6.1 by Michael Hudson
add a lightly hacked copy of turbozpt (it's not much code)
52
    def load_template(self, classname, loadingSite=False):
53
        """Searches for a template along the Python path.
54
55
        Template files must end in ".pt" and be in legitimate packages.
128.6.30 by Michael Hudson
clean up dusty parts of turbozpt
56
        Templates are automatically checked for changes and reloaded as
57
        neccessary.
128.6.1 by Michael Hudson
add a lightly hacked copy of turbozpt (it's not much code)
58
        """
59
        divider = classname.rfind(".")
60
        if divider > -1:
61
            package = classname[0:divider]
62
            basename = classname[divider+1:]
63
        else:
64
            raise ValueError, "All templates must be in a package"
65
128.6.30 by Michael Hudson
clean up dusty parts of turbozpt
66
        tfile = pkg_resources.resource_filename(
67
            package, "%s.%s" % (basename, self.extension))
68
        return zpt(tfile)
128.6.1 by Michael Hudson
add a lightly hacked copy of turbozpt (it's not much code)
69