Mercurial > piecrust2
annotate piecrust/templating/pystacheengine.py @ 661:2f780b191541
internal: Fix a bug with registering taxonomy terms that are not strings.
Some objects, like the blog data provider's taxnonomy entries, can render as
strings, but are objects themselves. When registering them as "used terms", we
need to use their string representation.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Tue, 01 Mar 2016 22:26:09 -0800 |
parents | 9d1a89cd8146 |
children | 370e74941d32 |
rev | line source |
---|---|
185
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
1 import logging |
440
32c7c2d219d2
performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
429
diff
changeset
|
2 import collections.abc |
185
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
3 import pystache |
428
f4b7c8f183a4
templating: Fix Pystache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
4 import pystache.common |
185
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
5 from piecrust.templating.base import ( |
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
6 TemplateEngine, TemplateNotFoundError, TemplatingError) |
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 |
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
9 logger = logging.getLogger(__name__) |
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 |
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
12 class PystacheTemplateEngine(TemplateEngine): |
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
13 ENGINE_NAMES = ['mustache'] |
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
14 EXTENSIONS = ['mustache'] |
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
15 |
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
16 def __init__(self): |
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
17 self.renderer = None |
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
18 |
454
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
440
diff
changeset
|
19 def renderSegmentPart(self, path, seg_part, data): |
185
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
20 self._ensureLoaded() |
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
21 try: |
454
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
440
diff
changeset
|
22 return self.renderer.render(seg_part.content, data) |
428
f4b7c8f183a4
templating: Fix Pystache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
23 except pystache.common.TemplateNotFoundError as ex: |
185
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
24 raise TemplateNotFoundError() from ex |
428
f4b7c8f183a4
templating: Fix Pystache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
25 except pystache.common.PystacheError as ex: |
454
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
440
diff
changeset
|
26 raise TemplatingError(str(ex), path) from ex |
185
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
27 |
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
28 def renderFile(self, paths, data): |
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
29 self._ensureLoaded() |
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
30 tpl = None |
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
31 logger.debug("Looking for template: %s" % paths) |
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
32 for p in paths: |
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
33 if not p.endswith('.mustache'): |
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
34 raise TemplatingError( |
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
35 "The Mustache template engine only accepts template " |
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
36 "filenames with a `.mustache` extension. Got: %s" % |
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
37 p) |
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
38 name = p[:-9] # strip `.mustache` |
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
39 try: |
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
40 tpl = self.renderer.load_template(name) |
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
41 except Exception as ex: |
519
9d1a89cd8146
cosmetic: Remove debug print here too.
Ludovic Chabant <ludovic@chabant.com>
parents:
454
diff
changeset
|
42 logger.debug("Mustache error: %s" % ex) |
185
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
43 pass |
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
44 |
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
45 if tpl is None: |
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
46 raise TemplateNotFoundError() |
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
47 |
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
48 try: |
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
49 return self.renderer.render(tpl, data) |
428
f4b7c8f183a4
templating: Fix Pystache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
50 except pystache.common.PystacheError as ex: |
185
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
51 raise TemplatingError(str(ex)) from ex |
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
52 |
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
53 def _ensureLoaded(self): |
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
54 if self.renderer: |
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
55 return |
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
56 |
429
ca5a3c970263
templating: Workaround for a bug with Pystache.
Ludovic Chabant <ludovic@chabant.com>
parents:
428
diff
changeset
|
57 self.renderer = _WorkaroundRenderer( |
185
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
58 search_dirs=self.app.templates_dirs) |
139179dc7abd
render: Add support for a Mustache template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
59 |
429
ca5a3c970263
templating: Workaround for a bug with Pystache.
Ludovic Chabant <ludovic@chabant.com>
parents:
428
diff
changeset
|
60 |
ca5a3c970263
templating: Workaround for a bug with Pystache.
Ludovic Chabant <ludovic@chabant.com>
parents:
428
diff
changeset
|
61 _knowns = ['PieCrustData', 'LazyPageConfigData', 'Paginator', 'Assetor', |
ca5a3c970263
templating: Workaround for a bug with Pystache.
Ludovic Chabant <ludovic@chabant.com>
parents:
428
diff
changeset
|
62 'PageLinkerData'] |
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 |
ca5a3c970263
templating: Workaround for a bug with Pystache.
Ludovic Chabant <ludovic@chabant.com>
parents:
428
diff
changeset
|
65 class _WorkaroundRenderer(pystache.Renderer): |
ca5a3c970263
templating: Workaround for a bug with Pystache.
Ludovic Chabant <ludovic@chabant.com>
parents:
428
diff
changeset
|
66 def _make_resolve_context(self): |
ca5a3c970263
templating: Workaround for a bug with Pystache.
Ludovic Chabant <ludovic@chabant.com>
parents:
428
diff
changeset
|
67 mrc = super(_WorkaroundRenderer, self)._make_resolve_context() |
ca5a3c970263
templating: Workaround for a bug with Pystache.
Ludovic Chabant <ludovic@chabant.com>
parents:
428
diff
changeset
|
68 |
ca5a3c970263
templating: Workaround for a bug with Pystache.
Ludovic Chabant <ludovic@chabant.com>
parents:
428
diff
changeset
|
69 def _workaround(stack, name): |
ca5a3c970263
templating: Workaround for a bug with Pystache.
Ludovic Chabant <ludovic@chabant.com>
parents:
428
diff
changeset
|
70 # 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
|
71 # 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
|
72 # the project can get patches on Pypi. |
ca5a3c970263
templating: Workaround for a bug with Pystache.
Ludovic Chabant <ludovic@chabant.com>
parents:
428
diff
changeset
|
73 res = mrc(stack, name) |
440
32c7c2d219d2
performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
429
diff
changeset
|
74 if res is not None and ( |
32c7c2d219d2
performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
429
diff
changeset
|
75 res.__class__.__name__ in _knowns or |
32c7c2d219d2
performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
429
diff
changeset
|
76 isinstance(res, collections.abc.Mapping)): |
429
ca5a3c970263
templating: Workaround for a bug with Pystache.
Ludovic Chabant <ludovic@chabant.com>
parents:
428
diff
changeset
|
77 res = [res] |
ca5a3c970263
templating: Workaround for a bug with Pystache.
Ludovic Chabant <ludovic@chabant.com>
parents:
428
diff
changeset
|
78 return res |
ca5a3c970263
templating: Workaround for a bug with Pystache.
Ludovic Chabant <ludovic@chabant.com>
parents:
428
diff
changeset
|
79 |
ca5a3c970263
templating: Workaround for a bug with Pystache.
Ludovic Chabant <ludovic@chabant.com>
parents:
428
diff
changeset
|
80 return _workaround |
ca5a3c970263
templating: Workaround for a bug with Pystache.
Ludovic Chabant <ludovic@chabant.com>
parents:
428
diff
changeset
|
81 |