@@ -152,62 +152,22 @@ def do_include(parser, token):
152152 )
153153
154154def 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
163159 Handles visiting extends
164160 """
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 )
191164 # addition to update the context with dpl context
192165 # calls the template_new_context method below when
193166 # invoked at runtime
194167 self .writeline (
195168 "parent_template.new_context(context.get_all(), True,"
196169 f" { self .dump_local_context (frame )} )"
197170 )
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
211171
212172
213173def template_new_context (
@@ -216,7 +176,7 @@ def template_new_context(
216176 shared = False ,
217177 locals = None ,
218178):
219- """This method serves as overriding the jinja include tag
179+ """This method overrides the jinja include tag
220180 Is called as part of Template.render by jinja2 and is updated
221181 to pull in the dpl context
222182 Create a new :class:`Context` for this template. The vars
0 commit comments