Call a block and register it for the template.
(self, node: nodes.Block, frame: Frame)
| 949 | self.writeline(f"debug_info = {debug_kv_str!r}") |
| 950 | |
| 951 | def visit_Block(self, node: nodes.Block, frame: Frame) -> None: |
| 952 | """Call a block and register it for the template.""" |
| 953 | level = 0 |
| 954 | if frame.toplevel: |
| 955 | # if we know that we are a child template, there is no need to |
| 956 | # check if we are one |
| 957 | if self.has_known_extends: |
| 958 | return |
| 959 | if self.extends_so_far > 0: |
| 960 | self.writeline("if parent_template is None:") |
| 961 | self.indent() |
| 962 | level += 1 |
| 963 | |
| 964 | if node.scoped: |
| 965 | context = self.derive_context(frame) |
| 966 | else: |
| 967 | context = self.get_context_ref() |
| 968 | |
| 969 | if node.required: |
| 970 | self.writeline(f"if len(context.blocks[{node.name!r}]) <= 1:", node) |
| 971 | self.indent() |
| 972 | self.writeline( |
| 973 | f'raise TemplateRuntimeError("Required block {node.name!r} not found")', |
| 974 | node, |
| 975 | ) |
| 976 | self.outdent() |
| 977 | |
| 978 | if not self.environment.is_async and frame.buffer is None: |
| 979 | self.writeline( |
| 980 | f"yield from context.blocks[{node.name!r}][0]({context})", node |
| 981 | ) |
| 982 | else: |
| 983 | self.writeline(f"gen = context.blocks[{node.name!r}][0]({context})") |
| 984 | self.writeline("try:") |
| 985 | self.indent() |
| 986 | self.writeline( |
| 987 | f"{self.choose_async()}for event in gen:", |
| 988 | node, |
| 989 | ) |
| 990 | self.indent() |
| 991 | self.simple_write("event", frame) |
| 992 | self.outdent() |
| 993 | self.outdent() |
| 994 | self.writeline( |
| 995 | f"finally: {self.choose_async('await gen.aclose()', 'gen.close()')}" |
| 996 | ) |
| 997 | |
| 998 | self.outdent(level) |
| 999 | |
| 1000 | def visit_Extends(self, node: nodes.Extends, frame: Frame) -> None: |
| 1001 | """Calls the extender.""" |
nothing calls this directly
no test coverage detected