Mercurial > piecrust2
annotate piecrust/templating/inukshukengine.py @ 1185:24413a2963b9
admin: Add hidden system information on publish page for troubleshooting.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Thu, 01 Oct 2020 10:58:33 -0700 |
parents | 6370ab74b2d5 |
children |
rev | line source |
---|---|
1012
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
1 import io |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
2 import os.path |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
3 import time |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
4 import logging |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
5 from inukshuk.parser import ParserError |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
6 from piecrust.templating.base import ( |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
7 TemplateEngine, TemplatingError, TemplateNotFoundError) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
8 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
9 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
10 logger = logging.getLogger(__name__) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
11 |
1013
6370ab74b2d5
internal: Don't profile the Inukshuk engine by default, duh.
Ludovic Chabant <ludovic@chabant.com>
parents:
1012
diff
changeset
|
12 _profile = False |
1012
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
13 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
14 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
15 class InukshukTemplateEngine(TemplateEngine): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
16 ENGINE_NAMES = ['inukshuk', 'inuk'] |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
17 EXTENSIONS = ['html', 'inuk'] |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
18 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
19 def __init__(self): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
20 self.engine = None |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
21 self.pc_cache = {} |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
22 self._seg_loader = None |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
23 self._buf = io.StringIO() |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
24 self._buf.truncate(2048) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
25 if _profile: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
26 self._renderTemplate = self._renderTemplateProf |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
27 else: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
28 self._renderTemplate = self._renderTemplateNoProf |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
29 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
30 def populateCache(self): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
31 self._ensureLoaded() |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
32 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
33 used_names = set() |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
34 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
35 def _filter_names(name): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
36 if name in used_names: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
37 return False |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
38 used_names.add(name) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
39 return True |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
40 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
41 self.engine.cacheAllTemplates(cache_condition=_filter_names) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
42 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
43 def renderSegment(self, path, segment, data): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
44 if not _string_needs_render(segment.content): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
45 return segment.content, False |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
46 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
47 self._ensureLoaded() |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
48 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
49 tpl_name = os.path.relpath(path, self.app.root_dir) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
50 try: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
51 self._seg_loader.templates[tpl_name] = segment.content |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
52 tpl = self.engine.getTemplate(tpl_name, memmodule=True) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
53 return self._renderTemplate(tpl, data), True |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
54 except ParserError as pe: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
55 raise TemplatingError(pe.message, path, pe.line_num) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
56 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
57 def renderFile(self, paths, data): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
58 self._ensureLoaded() |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
59 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
60 tpl = None |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
61 rendered_path = None |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
62 for p in paths: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
63 try: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
64 tpl = self.engine.getTemplate(p) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
65 rendered_path = p |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
66 break |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
67 except Exception: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
68 pass |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
69 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
70 if tpl is None: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
71 raise TemplateNotFoundError() |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
72 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
73 try: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
74 return self._renderTemplate(tpl, data) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
75 except ParserError as pe: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
76 raise TemplatingError(pe.message, rendered_path, pe.line_num) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
77 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
78 def _renderTemplateNoProf(self, tpl, data): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
79 return tpl.render(data) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
80 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
81 def _renderTemplateIntoNoProf(self, tpl, data): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
82 buf = self._buf |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
83 buf.seek(0) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
84 tpl.renderInto(data, buf) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
85 buf.flush() |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
86 size = buf.tell() |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
87 buf.seek(0) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
88 return buf.read(size) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
89 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
90 def _renderTemplateProf(self, tpl, data): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
91 stats = self.app.env.stats |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
92 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
93 # Code copied from Inukshuk, but with an `out_write` method that |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
94 # wraps a timer scope. |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
95 out = [] |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
96 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
97 def out_write(s): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
98 start = time.perf_counter() |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
99 out.append(s) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
100 stats.stepTimerSince('Inukshuk_outWrite', start) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
101 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
102 tpl._renderWithContext(None, data, out_write) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
103 return ''.join(out) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
104 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
105 def _ensureLoaded(self): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
106 if self.engine is not None: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
107 return |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
108 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
109 from inukshuk.engine import Engine |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
110 from inukshuk.loader import ( |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
111 StringsLoader, FileSystemLoader, CompositeLoader) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
112 from ._inukshukext import PieCrustExtension |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
113 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
114 self._seg_loader = StringsLoader() |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
115 loader = CompositeLoader([ |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
116 self._seg_loader, |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
117 FileSystemLoader(self.app.templates_dirs)]) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
118 self.engine = Engine(loader) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
119 self.engine.autoescape = True |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
120 self.engine.extensions.append(PieCrustExtension(self.app)) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
121 self.engine.compile_templates = True |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
122 self.engine.compile_cache_dir = os.path.join( |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
123 self.app.cache_dir, 'inuk') |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
124 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
125 if _profile: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
126 # If we're profiling, monkeypatch all the appropriate methods |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
127 # from the Inukshuk API. |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
128 stats = self.app.env.stats |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
129 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
130 import inukshuk.rendering |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
131 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
132 afe = inukshuk.rendering._attr_first_access |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
133 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
134 def wafe(ctx, data, prop_name): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
135 with stats.timerScope('Inukshuk_query'): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
136 return afe(ctx, data, prop_name) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
137 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
138 inukshuk.rendering._attr_first_access = wafe |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
139 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
140 afer = inukshuk.rendering._attr_first_access_root |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
141 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
142 def wafer(ctx, ctx_locals, data, ctx_globals, prop_name): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
143 with stats.timerScope('Inukshuk_query'): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
144 return afer(ctx, ctx_locals, data, ctx_globals, prop_name) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
145 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
146 inukshuk.rendering._attr_first_access_root = wafer |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
147 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
148 i = inukshuk.rendering.RenderContext.invoke |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
149 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
150 def wi(ctx, data, out, data_func, *args, **kwargs): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
151 with stats.timerScope('Inukshuk_invoke'): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
152 return i(ctx, data, out, data_func, *args, **kwargs) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
153 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
154 inukshuk.rendering.RenderContext.invoke = wi |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
155 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
156 import inukshuk.template |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
157 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
158 cc = inukshuk.template.Template._compileContent |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
159 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
160 def wcc(tpl, force_compiled=False): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
161 with stats.timerScope('Inukshuk_templateCompileContent'): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
162 return cc(tpl, force_compiled) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
163 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
164 inukshuk.template.Template._compileContent = wcc |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
165 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
166 dr = inukshuk.template.Template._doRender |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
167 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
168 def wdr(tpl, ctx, data, out): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
169 with stats.timerScope('Inukshuk_templateDoRender'): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
170 return dr(tpl, ctx, data, out) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
171 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
172 inukshuk.template.Template._doRender = wdr |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
173 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
174 stats.registerTimer('Inukshuk_query') |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
175 stats.registerTimer('Inukshuk_invoke') |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
176 stats.registerTimer('Inukshuk_templateDoRender') |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
177 stats.registerTimer('Inukshuk_templateCompileContent') |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
178 stats.registerTimer('Inukshuk_outWrite') |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
179 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
180 try: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
181 os.makedirs(self.engine.compile_cache_dir) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
182 except OSError: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
183 pass |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
184 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
185 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
186 def _string_needs_render(txt): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
187 index = txt.find('{') |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
188 while index >= 0: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
189 ch = txt[index + 1] |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
190 if ch == '{' or ch == '%': |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
191 return True |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
192 index = txt.find('{', index + 1) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
193 return False |