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