annotate piecrust/templating/pystacheengine.py @ 429:ca5a3c970263

templating: Workaround for a bug with Pystache.
author Ludovic Chabant <ludovic@chabant.com>
date Sat, 27 Jun 2015 00:03:56 -0700
parents f4b7c8f183a4
children 32c7c2d219d2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
185
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1 import logging
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2 import pystache
428
f4b7c8f183a4 templating: Fix Pystache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents: 185
diff changeset
3 import pystache.common
185
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
4 from piecrust.templating.base import (
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
5 TemplateEngine, TemplateNotFoundError, TemplatingError)
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
6
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
7
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
8 logger = logging.getLogger(__name__)
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
9
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
10
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
11 class PystacheTemplateEngine(TemplateEngine):
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
12 ENGINE_NAMES = ['mustache']
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
13 EXTENSIONS = ['mustache']
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
14
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
15 def __init__(self):
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
16 self.renderer = None
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
17
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
18 def renderString(self, txt, data, filename=None):
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
19 self._ensureLoaded()
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
20 try:
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
21 return self.renderer.render(txt, data)
428
f4b7c8f183a4 templating: Fix Pystache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents: 185
diff changeset
22 except pystache.common.TemplateNotFoundError as ex:
185
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
23 raise TemplateNotFoundError() from ex
428
f4b7c8f183a4 templating: Fix Pystache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents: 185
diff changeset
24 except pystache.common.PystacheError as ex:
185
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
25 raise TemplatingError(str(ex), filename) from ex
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
26
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
27 def renderFile(self, paths, data):
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
28 self._ensureLoaded()
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
29 tpl = None
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
30 logger.debug("Looking for template: %s" % paths)
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
31 for p in paths:
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
32 if not p.endswith('.mustache'):
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
33 raise TemplatingError(
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
34 "The Mustache template engine only accepts template "
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
35 "filenames with a `.mustache` extension. Got: %s" %
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
36 p)
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
37 name = p[:-9] # strip `.mustache`
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
38 try:
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
39 tpl = self.renderer.load_template(name)
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
40 except Exception as ex:
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
41 print(p, ex)
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
42 pass
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
43
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
44 if tpl is None:
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
45 raise TemplateNotFoundError()
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
46
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
47 try:
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
48 return self.renderer.render(tpl, data)
428
f4b7c8f183a4 templating: Fix Pystache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents: 185
diff changeset
49 except pystache.common.PystacheError as ex:
185
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
50 raise TemplatingError(str(ex)) from ex
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
51
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
52 def _ensureLoaded(self):
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
53 if self.renderer:
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
54 return
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
55
429
ca5a3c970263 templating: Workaround for a bug with Pystache.
Ludovic Chabant <ludovic@chabant.com>
parents: 428
diff changeset
56 self.renderer = _WorkaroundRenderer(
185
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
57 search_dirs=self.app.templates_dirs)
139179dc7abd render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
58
429
ca5a3c970263 templating: Workaround for a bug with Pystache.
Ludovic Chabant <ludovic@chabant.com>
parents: 428
diff changeset
59
ca5a3c970263 templating: Workaround for a bug with Pystache.
Ludovic Chabant <ludovic@chabant.com>
parents: 428
diff changeset
60 _knowns = ['PieCrustData', 'LazyPageConfigData', 'Paginator', 'Assetor',
ca5a3c970263 templating: Workaround for a bug with Pystache.
Ludovic Chabant <ludovic@chabant.com>
parents: 428
diff changeset
61 'PageLinkerData']
ca5a3c970263 templating: Workaround for a bug with Pystache.
Ludovic Chabant <ludovic@chabant.com>
parents: 428
diff changeset
62
ca5a3c970263 templating: Workaround for a bug with Pystache.
Ludovic Chabant <ludovic@chabant.com>
parents: 428
diff changeset
63
ca5a3c970263 templating: Workaround for a bug with Pystache.
Ludovic Chabant <ludovic@chabant.com>
parents: 428
diff changeset
64 class _WorkaroundRenderer(pystache.Renderer):
ca5a3c970263 templating: Workaround for a bug with Pystache.
Ludovic Chabant <ludovic@chabant.com>
parents: 428
diff changeset
65 def _make_resolve_context(self):
ca5a3c970263 templating: Workaround for a bug with Pystache.
Ludovic Chabant <ludovic@chabant.com>
parents: 428
diff changeset
66 mrc = super(_WorkaroundRenderer, self)._make_resolve_context()
ca5a3c970263 templating: Workaround for a bug with Pystache.
Ludovic Chabant <ludovic@chabant.com>
parents: 428
diff changeset
67
ca5a3c970263 templating: Workaround for a bug with Pystache.
Ludovic Chabant <ludovic@chabant.com>
parents: 428
diff changeset
68 def _workaround(stack, name):
ca5a3c970263 templating: Workaround for a bug with Pystache.
Ludovic Chabant <ludovic@chabant.com>
parents: 428
diff changeset
69 # Pystache will treat anything that's not a string or a dict as
ca5a3c970263 templating: Workaround for a bug with Pystache.
Ludovic Chabant <ludovic@chabant.com>
parents: 428
diff changeset
70 # a list. This is just plain wrong, but it will take a while before
ca5a3c970263 templating: Workaround for a bug with Pystache.
Ludovic Chabant <ludovic@chabant.com>
parents: 428
diff changeset
71 # the project can get patches on Pypi.
ca5a3c970263 templating: Workaround for a bug with Pystache.
Ludovic Chabant <ludovic@chabant.com>
parents: 428
diff changeset
72 res = mrc(stack, name)
ca5a3c970263 templating: Workaround for a bug with Pystache.
Ludovic Chabant <ludovic@chabant.com>
parents: 428
diff changeset
73 if res is not None and res.__class__.__name__ in _knowns:
ca5a3c970263 templating: Workaround for a bug with Pystache.
Ludovic Chabant <ludovic@chabant.com>
parents: 428
diff changeset
74 res = [res]
ca5a3c970263 templating: Workaround for a bug with Pystache.
Ludovic Chabant <ludovic@chabant.com>
parents: 428
diff changeset
75 return res
ca5a3c970263 templating: Workaround for a bug with Pystache.
Ludovic Chabant <ludovic@chabant.com>
parents: 428
diff changeset
76
ca5a3c970263 templating: Workaround for a bug with Pystache.
Ludovic Chabant <ludovic@chabant.com>
parents: 428
diff changeset
77 return _workaround
ca5a3c970263 templating: Workaround for a bug with Pystache.
Ludovic Chabant <ludovic@chabant.com>
parents: 428
diff changeset
78