Mercurial > piecrust2
annotate piecrust/templating/_inukshukext.py @ 1195:ae9387338db1 draft default tip
admin: add option to publish immediately
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Fri, 30 Dec 2022 16:48:04 -0800 |
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() |