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
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 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()