Mercurial > piecrust2
annotate piecrust/templating/pystacheengine.py @ 550:6f216c1ab6b1
bake: Add a flag to know which record entries got collapsed from last run.
This makes it possible to find entries for things that were actually baked
during the current run, as opposed to skipped because they were "clean".
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Tue, 04 Aug 2015 21:22:30 -0700 |
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 |