(
self, end_tokens: t.Optional[t.Tuple[str, ...]] = None
)
| 977 | return node |
| 978 | |
| 979 | def subparse( |
| 980 | self, end_tokens: t.Optional[t.Tuple[str, ...]] = None |
| 981 | ) -> t.List[nodes.Node]: |
| 982 | body: t.List[nodes.Node] = [] |
| 983 | data_buffer: t.List[nodes.Node] = [] |
| 984 | add_data = data_buffer.append |
| 985 | |
| 986 | if end_tokens is not None: |
| 987 | self._end_token_stack.append(end_tokens) |
| 988 | |
| 989 | def flush_data() -> None: |
| 990 | if data_buffer: |
| 991 | lineno = data_buffer[0].lineno |
| 992 | body.append(nodes.Output(data_buffer[:], lineno=lineno)) |
| 993 | del data_buffer[:] |
| 994 | |
| 995 | try: |
| 996 | while self.stream: |
| 997 | token = self.stream.current |
| 998 | if token.type == "data": |
| 999 | if token.value: |
| 1000 | add_data(nodes.TemplateData(token.value, lineno=token.lineno)) |
| 1001 | next(self.stream) |
| 1002 | elif token.type == "variable_begin": |
| 1003 | next(self.stream) |
| 1004 | add_data(self.parse_tuple(with_condexpr=True)) |
| 1005 | self.stream.expect("variable_end") |
| 1006 | elif token.type == "block_begin": |
| 1007 | flush_data() |
| 1008 | next(self.stream) |
| 1009 | if end_tokens is not None and self.stream.current.test_any( |
| 1010 | *end_tokens |
| 1011 | ): |
| 1012 | return body |
| 1013 | rv = self.parse_statement() |
| 1014 | if isinstance(rv, list): |
| 1015 | body.extend(rv) |
| 1016 | else: |
| 1017 | body.append(rv) |
| 1018 | self.stream.expect("block_end") |
| 1019 | else: |
| 1020 | raise AssertionError("internal parsing error") |
| 1021 | |
| 1022 | flush_data() |
| 1023 | finally: |
| 1024 | if end_tokens is not None: |
| 1025 | self._end_token_stack.pop() |
| 1026 | return body |
| 1027 | |
| 1028 | def parse(self) -> nodes.Template: |
| 1029 | """Parse the whole template into a `Template` node.""" |
no test coverage detected