annotate piecrust/templating/pystacheengine.py @ 519:9d1a89cd8146

cosmetic: Remove debug print here too.
author Ludovic Chabant <ludovic@chabant.com>
date Tue, 28 Jul 2015 18:29:41 -0700
parents 96d363e2da4b
children 370e74941d32
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
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