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