~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
3
import sys, os
4
5
from template import PageTemplate
6
import pkg_resources
7
8
import logging
9
log = logging.getLogger("turbogears.zptsupport")
10
11
def _recompile_template(package, basename, tfile, classname):
12
    log.debug("Recompiling template for %s" % classname)
13
    mod = PageTemplate(tfile)
14
    mtime = os.stat(tfile).st_mtime
15
    mod.__mtime__ = mtime
16
    return mod
17
18
class TurboZpt:
19
    extension = "pt"
20
    
21
    def __init__(self, extra_vars_func=None, options={}):
22
	self.options = options
23
	self.get_extra_vars = extra_vars_func
24
        self.compiledTemplates = {}
25
    
26
    def load_template(self, classname, loadingSite=False):
27
        """Searches for a template along the Python path.
28
29
        Template files must end in ".pt" and be in legitimate packages.
30
        U can set "zpt.cache_templates" option to cache a loaded template
31
	class and only check for updates. Templates are automatically
32
	checked for changes and reloaded as neccessary.
33
        """
34
        ct = self.compiledTemplates
35
36
        divider = classname.rfind(".")
37
        if divider > -1:
38
            package = classname[0:divider]
39
            basename = classname[divider+1:]
40
        else:
41
            raise ValueError, "All templates must be in a package"
42
43
        cache_templates = self.options.get("zpt.cache_templates", True)
44
        tfile = pkg_resources.resource_filename(package, 
45
                                                "%s.%s" % 
46
                                                (basename,
47
                                                self.extension))
48
						
49
        if cache_templates:
50
            if ct.has_key(classname):
51
                mtime = os.stat(tfile).st_mtime
52
		mod = ct[classname]
53
                if mod.__mtime__ != mtime:
54
		    # Recompile template
55
		    mod = _recompile_template(package, basename, tfile, classname)
56
                    ct[classname] = mod
57
                #else:
58
		    # use template from cache    
59
		    # pass 
60
            else:
61
		# First time compile template
62
		mod = PageTemplate(tfile)
63
                mod.__mtime__ = os.stat(tfile).st_mtime
64
		ct[classname] = mod
65
        else:
66
	    mod = PageTemplate(tfile)
67
68
        return mod
69
70
    def render(self, info, format="html", fragment=False, template=None):
71
	"""Renders data in the desired format.
72
	
73
	@param info: the data / context itself
74
	@type info: dict
75
	@para format: "html"
76
	@type format: "string"
77
	@para template: name of the template to use
78
	@type template: string
79
	"""
80
	#if isinstance(template, type):
81
	#    tclass = template
82
	#else:
83
	
84
	tinstance = self.load_template(template)
85
	log.debug("Applying template %s" % (tinstance.filename))
86
	data = dict()
87
	if self.get_extra_vars:
88
	    data.update(self.get_extra_vars())
89
	data.update(info)
90
        
128.6.2 by Michael Hudson
add a zpt version of annotate.kid -- about twice as fast as kid, not bad, but
91
        return tinstance(**data)
128.6.1 by Michael Hudson
add a lightly hacked copy of turbozpt (it's not much code)
92
93
    def transform(self, info, template):
94
	"Render the output to Elements"
95
	pass