template_parser: Handle handlebar partial blocks.

This commit is contained in:
evykassirer
2022-08-27 22:38:33 -07:00
committed by Tim Abbott
parent 8848359887
commit 606258e75b
2 changed files with 30 additions and 1 deletions

View File

@@ -75,6 +75,9 @@ def tokenize(text: str) -> List[Token]:
def looking_at_handlebars_partial() -> bool: def looking_at_handlebars_partial() -> bool:
return looking_at("{{>") return looking_at("{{>")
def looking_at_handlebars_partial_block() -> bool:
return looking_at("{{#>")
def looking_at_html_start() -> bool: def looking_at_html_start() -> bool:
return looking_at("<") and not looking_at("</") return looking_at("<") and not looking_at("</")
@@ -140,6 +143,10 @@ def tokenize(text: str) -> List[Token]:
s = get_handlebars_partial(text, state.i) s = get_handlebars_partial(text, state.i)
tag = s[9:-2] tag = s[9:-2]
kind = "handlebars_partial" kind = "handlebars_partial"
elif looking_at_handlebars_partial_block():
s = get_handlebars_partial(text, state.i)
tag = s[5:-2]
kind = "handlebars_partial_block"
elif looking_at_html_start(): elif looking_at_html_start():
s = get_html_tag(text, state.i) s = get_html_tag(text, state.i)
if s.endswith("/>"): if s.endswith("/>"):
@@ -311,7 +318,7 @@ def tag_flavor(token: Token) -> Optional[str]:
): ):
return None return None
if kind in ("handlebars_start", "html_start"): if kind in ("handlebars_start", "handlebars_partial_block", "html_start"):
return "start" return "start"
elif kind in ( elif kind in (
"django_else", "django_else",
@@ -726,6 +733,7 @@ def get_django_comment(text: str, i: int) -> str:
def get_handlebars_partial(text: str, i: int) -> str: def get_handlebars_partial(text: str, i: int) -> str:
"""Works for both partials and partial blocks."""
end = i + 10 end = i + 10
unclosed_end = 0 unclosed_end = 0
while end <= len(text): while end <= len(text):

View File

@@ -49,6 +49,22 @@ class ParserTest(unittest.TestCase):
""" """
validate(text=my_html) validate(text=my_html)
def test_validate_handlebars_partial_block(self) -> None:
my_html = """
{{#> generic_thing }}
<p>hello!</p>
{{/generic_thing}}
"""
validate(text=my_html)
def test_validate_bad_handlebars_partial_block(self) -> None:
my_html = """
{{#> generic_thing }}
<p>hello!</p>
{{# generic_thing}}
"""
self._assert_validate_error("Missing end tag for the token at row 4 13!", text=my_html)
def test_validate_comment(self) -> None: def test_validate_comment(self) -> None:
my_html = """ my_html = """
<!--- <!---
@@ -298,6 +314,11 @@ class ParserTest(unittest.TestCase):
self.assertEqual(token.kind, "handlebars_end") self.assertEqual(token.kind, "handlebars_end")
self.assertEqual(token.tag, "with") self.assertEqual(token.tag, "with")
tag = "{{#> compose_banner }}bla"
token = tokenize(tag)[0]
self.assertEqual(token.kind, "handlebars_partial_block")
self.assertEqual(token.tag, "compose_banner")
tag = "{% if foo %}bla" tag = "{% if foo %}bla"
token = tokenize(tag)[0] token = tokenize(tag)[0]
self.assertEqual(token.kind, "django_start") self.assertEqual(token.kind, "django_start")