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