(
self, end_tokens: t.Optional[t.Tuple[str, ...]] = None
)
| 994 | return node |
| 995 | |
| 996 | def subparse( |
| 997 | self, end_tokens: t.Optional[t.Tuple[str, ...]] = None |
| 998 | ) -> t.List[nodes.Node]: |
| 999 | body: t.List[nodes.Node] = [] |
| 1000 | data_buffer: t.List[nodes.Node] = [] |
| 1001 | add_data = data_buffer.append |
| 1002 | |
| 1003 | if end_tokens is not None: |
| 1004 | self._end_token_stack.append(end_tokens) |
| 1005 | |
| 1006 | def flush_data() -> None: |
| 1007 | if data_buffer: |
| 1008 | lineno = data_buffer[0].lineno |
| 1009 | body.append(nodes.Output(data_buffer[:], lineno=lineno)) |
| 1010 | del data_buffer[:] |
| 1011 | |
| 1012 | try: |
| 1013 | while self.stream: |
| 1014 | token = self.stream.current |
| 1015 | if token.type == "data": |
| 1016 | if token.value: |
| 1017 | add_data(nodes.TemplateData(token.value, lineno=token.lineno)) |
| 1018 | next(self.stream) |
| 1019 | elif token.type == "variable_begin": |
| 1020 | next(self.stream) |
| 1021 | add_data(self.parse_tuple(with_condexpr=True)) |
| 1022 | self.stream.expect("variable_end") |
| 1023 | elif token.type == "block_begin": |
| 1024 | flush_data() |
| 1025 | next(self.stream) |
| 1026 | if end_tokens is not None and self.stream.current.test_any( |
| 1027 | *end_tokens |
| 1028 | ): |
| 1029 | return body |
| 1030 | rv = self.parse_statement() |
| 1031 | if isinstance(rv, list): |
| 1032 | body.extend(rv) |
| 1033 | else: |
| 1034 | body.append(rv) |
| 1035 | self.stream.expect("block_end") |
| 1036 | else: |
| 1037 | raise AssertionError("internal parsing error") |
| 1038 | |
| 1039 | flush_data() |
| 1040 | finally: |
| 1041 | if end_tokens is not None: |
| 1042 | self._end_token_stack.pop() |
| 1043 | return body |
| 1044 | |
| 1045 | def parse(self) -> nodes.Template: |
| 1046 | """Parse the whole template into a `Template` node.""" |
no test coverage detected