annotate piecrust/templating/inukshukengine.py @ 1158:5762a0b821ac

core: Remove yaml deprecation warning.
author Ludovic Chabant <ludovic@chabant.com>
date Tue, 11 Jun 2019 16:40:11 -0700
parents 6370ab74b2d5
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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