(self, end_tokens=None)
| 849 | return node |
| 850 | |
| 851 | def subparse(self, end_tokens=None): |
| 852 | body = [] |
| 853 | data_buffer = [] |
| 854 | add_data = data_buffer.append |
| 855 | |
| 856 | if end_tokens is not None: |
| 857 | self._end_token_stack.append(end_tokens) |
| 858 | |
| 859 | def flush_data(): |
| 860 | if data_buffer: |
| 861 | lineno = data_buffer[0].lineno |
| 862 | body.append(nodes.Output(data_buffer[:], lineno=lineno)) |
| 863 | del data_buffer[:] |
| 864 | |
| 865 | try: |
| 866 | while self.stream: |
| 867 | token = self.stream.current |
| 868 | if token.type == 'data': |
| 869 | if token.value: |
| 870 | add_data(nodes.TemplateData(token.value, |
| 871 | lineno=token.lineno)) |
| 872 | next(self.stream) |
| 873 | elif token.type == 'variable_begin': |
| 874 | next(self.stream) |
| 875 | add_data(self.parse_tuple(with_condexpr=True)) |
| 876 | self.stream.expect('variable_end') |
| 877 | elif token.type == 'block_begin': |
| 878 | flush_data() |
| 879 | next(self.stream) |
| 880 | if end_tokens is not None and \ |
| 881 | self.stream.current.test_any(*end_tokens): |
| 882 | return body |
| 883 | rv = self.parse_statement() |
| 884 | if isinstance(rv, list): |
| 885 | body.extend(rv) |
| 886 | else: |
| 887 | body.append(rv) |
| 888 | self.stream.expect('block_end') |
| 889 | else: |
| 890 | raise AssertionError('internal parsing error') |
| 891 | |
| 892 | flush_data() |
| 893 | finally: |
| 894 | if end_tokens is not None: |
| 895 | self._end_token_stack.pop() |
| 896 | |
| 897 | return body |
| 898 | |
| 899 | def parse(self): |
| 900 | """Parse the whole template into a `Template` node.""" |
no test coverage detected