MCPcopy
hub / github.com/pallets/jinja / subparse

Method subparse

src/jinja2/parser.py:996–1043  ·  view source on GitHub ↗
(
        self, end_tokens: t.Optional[t.Tuple[str, ...]] = None
    )

Source from the content-addressed store, hash-verified

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."""

Callers 2

parse_statementsMethod · 0.95
parseMethod · 0.95

Calls 5

parse_tupleMethod · 0.95
parse_statementMethod · 0.95
expectMethod · 0.80
test_anyMethod · 0.80
extendMethod · 0.80

Tested by

no test coverage detected