Mercurial > piecrust2
annotate piecrust/templating/_inukshukext.py @ 1188:a7c43131d871
bake: Fix file write flushing problem with Python 3.8+
Writing the cache files fails in Python 3.8 because it looks like flushing
behaviour has changed. We need to explicitly flush. And even then, in very
rare occurrences, it looks like it can still run into racing conditions,
so we do a very hacky and ugly "retry" loop when fetching cached data :(
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Tue, 15 Jun 2021 22:36:23 -0700 |
parents | 10fd55b9ccfb |
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 re |
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 from inukshuk.ext import Extension, StatementNode |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
5 from inukshuk.ext.core import filter_make_xml_date, filter_safe |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
6 from inukshuk.lexer import ( |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
7 TOKEN_ID_STRING_SINGLE_QUOTES, TOKEN_ID_STRING_DOUBLE_QUOTES) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
8 from pygments import highlight |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
9 from pygments.formatters import HtmlFormatter |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
10 from pygments.lexers import get_lexer_by_name, guess_lexer |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
11 from piecrust.data.paginator import Paginator |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
12 from piecrust.rendering import format_text |
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 PieCrustExtension(Extension): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
16 def __init__(self, app): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
17 self.app = app |
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 setupEngine(self, engine): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
20 engine.piecrust_app = self.app |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
21 engine.piecrust_cache = {} |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
22 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
23 def getGlobals(self): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
24 return { |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
25 'highlight_css': get_highlight_css} |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
26 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
27 def getFilters(self): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
28 return { |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
29 'paginate': self._paginate, |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
30 'formatwith': self._formatWith, |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
31 'markdown': lambda v: self._formatWith(v, 'markdown'), |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
32 'textile': lambda v: self._formatWith(v, 'textile'), |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
33 'nocache': add_no_cache_parameter, |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
34 'stripoutertag': strip_outer_tag, |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
35 'stripslash': strip_slash, |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
36 'atomdate': filter_make_xml_date, |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
37 'raw': filter_safe |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
38 } |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
39 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
40 def getTests(self): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
41 return {} |
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 getStatementNodes(self): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
44 return [ |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
45 PieCrustHighlightStatementNode, |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
46 PieCrustGeshiStatementNode, |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
47 PieCrustCacheStatementNode, |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
48 PieCrustFormatStatementNode] |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
49 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
50 def _paginate(self, value, items_per_page=5): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
51 ctx = self.app.env.render_ctx_stack.current_ctx |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
52 if ctx is None or ctx.page is None: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
53 raise Exception("Can't paginate when no page has been pushed " |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
54 "on the execution stack.") |
1137
10fd55b9ccfb
templating: Fix Inukshuk `paginate` function.
Ludovic Chabant <ludovic@chabant.com>
parents:
1012
diff
changeset
|
55 return Paginator(value, ctx.page, |
1012
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
56 sub_num=ctx.sub_num, |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
57 items_per_page=items_per_page) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
58 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
59 def _formatWith(self, value, format_name): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
60 return format_text(self.app, format_name, value) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
61 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
62 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
63 def add_no_cache_parameter(value, param_name='t', param_value=None): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
64 if not param_value: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
65 param_value = time.time() |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
66 if '?' in value: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
67 value += '&' |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
68 else: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
69 value += '?' |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
70 value += '%s=%s' % (param_name, param_value) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
71 return value |
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 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
74 def strip_outer_tag(value, tag=None): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
75 tag_pattern = '[a-z]+[a-z0-9]*' |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
76 if tag is not None: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
77 tag_pattern = re.escape(tag) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
78 pat = r'^\<' + tag_pattern + r'\>(.*)\</' + tag_pattern + '>$' |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
79 m = re.match(pat, value) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
80 if m: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
81 return m.group(1) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
82 return value |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
83 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
84 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
85 def strip_slash(value): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
86 return value.rstrip('/') |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
87 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
88 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
89 class PieCrustFormatStatementNode(StatementNode): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
90 name = 'pcformat' |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
91 compiler_imports = ['import io', |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
92 'from piecrust.rendering import format_text'] |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
93 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
94 def __init__(self): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
95 super().__init__() |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
96 self.format = None |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
97 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
98 def parse(self, parser): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
99 self.format = parser.expectIdentifier() |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
100 parser.skipWhitespace() |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
101 parser.expectStatementEnd() |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
102 parser.parseUntilStatement(self, ['endpcformat']) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
103 parser.expectIdentifier('endpcformat') |
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 render(self, ctx, data, out): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
106 with io.StringIO() as tmp: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
107 inner_out = tmp.write |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
108 for c in self.children: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
109 c.render(ctx, data, inner_out) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
110 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
111 text = format_text(ctx.engine.piecrust_app, self.format, |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
112 tmp.getvalue(), exact_format=True) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
113 out(text) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
114 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
115 def compile(self, ctx, out): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
116 out.indent().write('with io.StringIO() as tmp:\n') |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
117 out.push(False) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
118 out.indent().write('prev_out_write = out_write\n') |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
119 out.indent().write('out_write = tmp.write\n') |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
120 for c in self.children: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
121 c.compile(ctx, out) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
122 out.indent().write('out_write = prev_out_write\n') |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
123 out.indent().write( |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
124 'text = format_text(ctx_engine.piecrust_app, %s, tmp.getvalue(), ' |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
125 'exact_format=True)\n' % repr(self.format)) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
126 out.indent().write('out_write(text)\n') |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
127 out.pull() |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
128 |
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 class PieCrustHighlightStatementNode(StatementNode): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
131 name = 'highlight' |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
132 endname = 'endhighlight' |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
133 compiler_imports = [ |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
134 'from pygments import highlight', |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
135 'from pygments.formatters import HtmlFormatter', |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
136 'from pygments.lexers import get_lexer_by_name, guess_lexer'] |
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 def __init__(self): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
139 super().__init__() |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
140 self.lang = None |
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 parse(self, parser): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
143 self.lang = parser.expectAny([TOKEN_ID_STRING_SINGLE_QUOTES, |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
144 TOKEN_ID_STRING_DOUBLE_QUOTES]) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
145 parser.skipWhitespace() |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
146 parser.expectStatementEnd() |
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 parser.parseUntilStatement(self, self.endname) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
149 parser.expectIdentifier(self.endname) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
150 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
151 def render(self, ctx, data, out): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
152 with io.StringIO() as tmp: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
153 inner_out = tmp.write |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
154 for c in self.children: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
155 c.render(ctx, data, inner_out) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
156 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
157 raw_text = tmp.getvalue() |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
158 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
159 if self.lang is None: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
160 lexer = guess_lexer(raw_text) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
161 else: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
162 lexer = get_lexer_by_name(self.lang, stripall=False) |
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 formatter = HtmlFormatter() |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
165 code = highlight(raw_text, lexer, formatter) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
166 out(code) |
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 compile(self, ctx, out): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
169 out.indent().write('with io.StringIO() as tmp:\n') |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
170 out.push(False) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
171 out.indent().write('prev_out_write = out_write\n') |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
172 out.indent().write('out_write = tmp.write\n') |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
173 for c in self.children: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
174 c.compile(ctx, out) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
175 out.indent().write('out_write = prev_out_write\n') |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
176 out.indent().write('raw_text = tmp.getvalue()\n') |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
177 out.pull() |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
178 if self.lang is None: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
179 out.indent().write('lexer = guess_lexer(raw_text)\n') |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
180 else: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
181 out.indent().write( |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
182 'lexer = get_lexer_by_name(%s, stripall=False)\n' % |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
183 repr(self.lang)) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
184 out.indent().write('formatter = HtmlFormatter()\n') |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
185 out.indent().write('code = highlight(raw_text, lexer, formatter)\n') |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
186 out.indent().write('out_write(code)\n') |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
187 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
188 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
189 class PieCrustGeshiStatementNode(PieCrustHighlightStatementNode): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
190 name = 'geshi' |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
191 endname = 'endgeshi' |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
192 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
193 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
194 def get_highlight_css(style_name='default', class_name='.highlight'): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
195 return HtmlFormatter(style=style_name).get_style_defs(class_name) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
196 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
197 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
198 class PieCrustCacheStatementNode(StatementNode): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
199 name = 'pccache' |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
200 compiler_imports = ['import io'] |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
201 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
202 def __init__(self): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
203 super().__init__() |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
204 self.cache_key = None |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
205 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
206 def parse(self, parser): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
207 self.cache_key = parser.expectString() |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
208 parser.skipWhitespace() |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
209 parser.expectStatementEnd() |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
210 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
211 parser.parseUntilStatement(self, 'endpccache') |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
212 parser.expectIdentifier('endpccache') |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
213 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
214 def render(self, ctx, data, out): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
215 raise Exception("No implemented") |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
216 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
217 # exc_stack = ctx.engine.piecrust_app.env.exec_info_stack |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
218 # render_ctx = exc_stack.current_page_info.render_ctx |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
219 # rdr_pass = render_ctx.current_pass_info |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
220 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
221 # pair = ctx.engine.piecrust_cache.get(self.cache_key) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
222 # if pair is not None: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
223 # rdr_pass.used_source_names.update(pair[1]) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
224 # return pair[0] |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
225 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
226 # prev_used = rdr_pass.used_source_names.copy() |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
227 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
228 # with io.StringIO() as tmp: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
229 # inner_out = tmp.write |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
230 # for c in self.children: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
231 # c.render(ctx, data, inner_out) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
232 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
233 # raw_text = tmp.getvalue() |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
234 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
235 # after_used = rdr_pass.used_source_names.copy() |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
236 # used_delta = after_used.difference(prev_used) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
237 # ctx.engine.piecrust_cache[self.cache_key] = (raw_text, used_delta) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
238 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
239 # return raw_text |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
240 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
241 def compile(self, ctx, out): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
242 out.indent().write( |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
243 'ctx_stack = ctx.engine.piecrust_app.env.render_ctx_stack\n') |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
244 out.indent().write( |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
245 'render_ctx = ctx_stack.current_ctx\n') |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
246 out.indent().write( |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
247 'rdr_pass = render_ctx.current_pass_info\n') |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
248 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
249 pair_var = ctx.varname('pair') |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
250 out.indent().write( |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
251 '%s = ctx.engine.piecrust_cache.get(%s)\n' % |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
252 (pair_var, repr(self.cache_key))) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
253 out.indent().write( |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
254 'if %s is not None:\n' % pair_var) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
255 out.push().write( |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
256 'rdr_pass.used_source_names.update(%s[1])\n' % pair_var) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
257 out.indent().write('out_write(%s[0])\n' % pair_var) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
258 out.pull() |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
259 out.indent().write('else:\n') |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
260 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
261 tmp_var = ctx.varname('tmp') |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
262 prev_used_var = ctx.varname('prev_used') |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
263 prev_out_write_var = ctx.varname('prev_out_write') |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
264 prev_out_write_escaped_var = ctx.varname('prev_out_write_escaped') |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
265 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
266 out.push().write( |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
267 '%s = rdr_pass.used_source_names.copy()\n' % prev_used_var) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
268 out.indent().write( |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
269 'with io.StringIO() as %s:\n' % tmp_var) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
270 out.push().write( |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
271 '%s = out_write\n' % prev_out_write_var) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
272 out.indent().write( |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
273 '%s = out_write_escaped\n' % prev_out_write_escaped_var) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
274 out.indent().write( |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
275 'out_write = %s.write\n' % tmp_var) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
276 out.indent().write( |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
277 'out_write_escaped = ctx.engine._getWriteEscapeFunc(out_write)\n') |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
278 for c in self.children: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
279 c.compile(ctx, out) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
280 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
281 out.indent().write( |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
282 'out_write_escaped = %s\n' % prev_out_write_escaped_var) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
283 out.indent().write( |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
284 'out_write = %s\n' % prev_out_write_var) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
285 out.indent().write( |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
286 'raw_text = %s.getvalue()\n' % tmp_var) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
287 out.pull() |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
288 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
289 out.indent().write( |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
290 'after_used = rdr_pass.used_source_names.copy()\n') |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
291 out.indent().write( |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
292 'used_delta = after_used.difference(%s)\n' % prev_used_var) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
293 out.indent().write( |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
294 'ctx.engine.piecrust_cache[%s] = (raw_text, used_delta)\n' % |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
295 repr(self.cache_key)) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
296 out.indent().write('out_write(raw_text)\n') |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
297 out.pull() |