@@ -152,62 +152,22 @@ def do_include(parser, token):
152
152
)
153
153
154
154
def visit_extends (self , node , frame ):
155
- """This method serves as overriding the jinja extends tag
156
- Dupe of the jinja2.compiler.CodeGenerator visit_Extends
157
- except for
158
- self.writeline(
159
- "parent_template.new_context(context.get_all(), True,"
160
- f" {self.dump_local_context(frame)})"
161
- )
162
- which executes at runtime to pull in the dpl context
155
+ """This method overrides the jinja extends tag
156
+ Is called as part of the compiler CodeGenerator
157
+ and adds a line to use the template_new_context as
158
+ part of the runtime render to pull in the dpl context
163
159
Handles visiting extends
164
160
"""
165
- from jinja2 .compiler import CompilerExit
166
-
167
- if not frame .toplevel :
168
- self .fail ("cannot use extend from a non top-level scope" , node .lineno )
169
- # if the number of extends statements in general is zero so
170
- # far, we don't have to add a check if something extended
171
- # the template before this one.
172
- if self .extends_so_far > 0 :
173
- # if we have a known extends we just add a template runtime
174
- # error into the generated code. We could catch that at compile
175
- # time too, but i welcome it not to confuse users by throwing the
176
- # same error at different times just "because we can".
177
- if not self .has_known_extends :
178
- self .writeline ("if parent_template is not None:" )
179
- self .indent ()
180
- self .writeline ('raise TemplateRuntimeError("extended multiple times")' )
181
-
182
- # if we have a known extends already we don't need that code here
183
- # as we know that the template execution will end here.
184
- if self .has_known_extends :
185
- raise CompilerExit ()
186
- else :
187
- self .outdent ()
188
- self .writeline ("parent_template = environment.get_template(" , node )
189
- self .visit (node .template , frame )
190
- self .write (f", { self .name !r} )" )
161
+ from .monkey_utils import jinja_visit_Extends
162
+
163
+ jinja_visit_Extends (self , node , frame )
191
164
# addition to update the context with dpl context
192
165
# calls the template_new_context method below when
193
166
# invoked at runtime
194
167
self .writeline (
195
168
"parent_template.new_context(context.get_all(), True,"
196
169
f" { self .dump_local_context (frame )} )"
197
170
)
198
- self .writeline ("for name, parent_block in parent_template.blocks.items():" )
199
- self .indent ()
200
- self .writeline ("context.blocks.setdefault(name, []).append(parent_block)" )
201
- self .outdent ()
202
-
203
- # if this extends statement was in the root level we can take
204
- # advantage of that information and simplify the generated code
205
- # in the top level from this point onwards
206
- if frame .rootlevel :
207
- self .has_known_extends = True
208
-
209
- # and now we have one more
210
- self .extends_so_far += 1
211
171
212
172
213
173
def template_new_context (
@@ -216,7 +176,7 @@ def template_new_context(
216
176
shared = False ,
217
177
locals = None ,
218
178
):
219
- """This method serves as overriding the jinja include tag
179
+ """This method overrides the jinja include tag
220
180
Is called as part of Template.render by jinja2 and is updated
221
181
to pull in the dpl context
222
182
Create a new :class:`Context` for this template. The vars
0 commit comments