Merge branch 'master' into jython
[wrw.git] / wrw / wmako.py
1 from __future__ import with_statement
2 import os, threading
3 from mako import template, lookup, filters
4 import util, form, session, env, resp
5
6 # It seems Mako isn't thread-safe.
7 makolock = threading.Lock()
8
9 class liblookup(lookup.TemplateLookup):
10     def __init__(self, *args, **kwargs):
11         lookup.TemplateLookup.__init__(self, *args, **kwargs)
12
13     def adjust_uri(self, uri, relativeto):
14         return uri
15
16 libdirs = []
17 homedir = os.getenv("HOME")
18 if homedir is not None:
19     usrdir = os.path.join(homedir, "wmako")
20     if os.path.exists(usrdir):
21         libdirs.append(usrdir)
22 libdirs.append(os.path.join(os.path.dirname(__file__), "makolib"))
23 cachedir = os.path.join("/tmp/", "mako-" + str(os.getuid()))
24 defargs = {"output_encoding": "utf-8",
25            "input_encoding": "utf-8",
26            "default_filters": ["decode.utf8"],
27            "module_directory": cachedir,
28     }
29
30 def makelib(init=liblookup, directories=[], **kwargs):
31     ad = dict(defargs)
32     ad.update(kwargs)
33     return init(directories = libdirs + directories, **ad)
34
35 lib = env.var(makelib())
36
37 if not os.path.exists(cachedir):
38     os.mkdir(cachedir)
39 def handle(req, filename, **kw):
40     with makolock:
41         tt = template.Template(filename = filename, lookup = lib.val, **defargs)
42     req.ohead["Content-Type"] = "text/html; charset=utf-8"
43     return [tt.render(request = req, **kw)]
44
45 @util.wsgiwrap
46 def application(req):
47     if req.method not in ["GET", "HEAD"]:
48         raise resp.httperror(405)
49     return handle(req, req.filename,
50                   form = form.formdata(req),
51                   session = session.get(req))