Mercurial > piecrust2
comparison piecrust/templating/pystacheengine.py @ 185:139179dc7abd
render: Add support for a Mustache template engine.
Add unit tests for the new class.
| author | Ludovic Chabant <ludovic@chabant.com> |
|---|---|
| date | Sun, 04 Jan 2015 14:59:12 -0800 |
| parents | |
| children | f4b7c8f183a4 |
comparison
equal
deleted
inserted
replaced
| 184:27d623a241c6 | 185:139179dc7abd |
|---|---|
| 1 import logging | |
| 2 import pystache | |
| 3 from piecrust.templating.base import ( | |
| 4 TemplateEngine, TemplateNotFoundError, TemplatingError) | |
| 5 | |
| 6 | |
| 7 logger = logging.getLogger(__name__) | |
| 8 | |
| 9 | |
| 10 class PystacheTemplateEngine(TemplateEngine): | |
| 11 ENGINE_NAMES = ['mustache'] | |
| 12 EXTENSIONS = ['mustache'] | |
| 13 | |
| 14 def __init__(self): | |
| 15 self.renderer = None | |
| 16 | |
| 17 def renderString(self, txt, data, filename=None): | |
| 18 self._ensureLoaded() | |
| 19 try: | |
| 20 return self.renderer.render(txt, data) | |
| 21 except pystache.TemplateNotFoundError as ex: | |
| 22 raise TemplateNotFoundError() from ex | |
| 23 except pystache.PystacheError as ex: | |
| 24 raise TemplatingError(str(ex), filename) from ex | |
| 25 | |
| 26 def renderFile(self, paths, data): | |
| 27 self._ensureLoaded() | |
| 28 tpl = None | |
| 29 logger.debug("Looking for template: %s" % paths) | |
| 30 for p in paths: | |
| 31 if not p.endswith('.mustache'): | |
| 32 raise TemplatingError( | |
| 33 "The Mustache template engine only accepts template " | |
| 34 "filenames with a `.mustache` extension. Got: %s" % | |
| 35 p) | |
| 36 name = p[:-9] # strip `.mustache` | |
| 37 try: | |
| 38 tpl = self.renderer.load_template(name) | |
| 39 except Exception as ex: | |
| 40 print(p, ex) | |
| 41 pass | |
| 42 | |
| 43 if tpl is None: | |
| 44 raise TemplateNotFoundError() | |
| 45 | |
| 46 try: | |
| 47 return self.renderer.render(tpl, data) | |
| 48 except pystache.PystacheError as ex: | |
| 49 raise TemplatingError(str(ex)) from ex | |
| 50 | |
| 51 def _ensureLoaded(self): | |
| 52 if self.renderer: | |
| 53 return | |
| 54 | |
| 55 self.renderer = pystache.Renderer( | |
| 56 search_dirs=self.app.templates_dirs) | |
| 57 |
