check-templates: Check Django/Handlebars templates differently.

This is a bit hacky, but avoids incorrectly checking Handlebars
templates for Django style templates, which in particular interacts
poorly with ICU Message plural syntax.
This commit is contained in:
Tim Abbott
2023-10-11 16:56:46 -07:00
parent b2ea3125b2
commit 533ff863a7
4 changed files with 81 additions and 44 deletions

View File

@@ -48,7 +48,7 @@ class Token:
self.parent_token: Optional[Token] = None
def tokenize(text: str) -> List[Token]:
def tokenize(text: str, template_format: Optional[str] = None) -> List[Token]:
in_code_block = False
def advance(n: int) -> None:
@@ -70,13 +70,13 @@ def tokenize(text: str) -> List[Token]:
return looking_at("{{!")
def looking_at_djangocomment() -> bool:
return looking_at("{#")
return template_format == "django" and looking_at("{#")
def looking_at_handlebars_partial() -> bool:
return looking_at("{{>")
return template_format == "handlebars" and looking_at("{{>")
def looking_at_handlebars_partial_block() -> bool:
return looking_at("{{#>")
return template_format == "handlebars" and looking_at("{{#>")
def looking_at_html_start() -> bool:
return looking_at("<") and not looking_at("</")
@@ -88,29 +88,29 @@ def tokenize(text: str) -> List[Token]:
return looking_at("{{#") or looking_at("{{^") or looking_at("{{~#")
def looking_at_handlebars_else() -> bool:
return looking_at("{{else")
return template_format == "handlebars" and looking_at("{{else")
def looking_at_template_var() -> bool:
return looking_at("{")
def looking_at_handlebars_end() -> bool:
return looking_at("{{/") or looking_at("{{~/")
return template_format == "handlebars" and (looking_at("{{/") or looking_at("{{~/"))
def looking_at_django_start() -> bool:
return looking_at("{% ")
return template_format == "django" and looking_at("{% ")
def looking_at_django_else() -> bool:
return looking_at("{% else") or looking_at("{% elif")
return template_format == "django" and (looking_at("{% else") or looking_at("{% elif"))
def looking_at_django_end() -> bool:
return looking_at("{% end")
return template_format == "django" and looking_at("{% end")
def looking_at_jinja2_end_whitespace_stripped() -> bool:
return looking_at("{%- end")
return template_format == "django" and looking_at("{%- end")
def looking_at_jinja2_start_whitespace_stripped_type2() -> bool:
# This function detects tag like {%- if foo -%}...{% endif %}
return looking_at("{%-") and not looking_at("{%- end")
return template_format == "django" and looking_at("{%-") and not looking_at("{%- end")
def looking_at_whitespace() -> bool:
return looking_at("\n") or looking_at(" ")
@@ -343,7 +343,11 @@ def tag_flavor(token: Token) -> Optional[str]:
raise AssertionError(f"tools programmer neglected to handle {kind} tokens")
def validate(fn: Optional[str] = None, text: Optional[str] = None) -> List[Token]:
def validate(
fn: Optional[str] = None,
text: Optional[str] = None,
template_format: Optional[str] = None,
) -> List[Token]:
assert fn or text
if fn is None:
@@ -356,7 +360,7 @@ def validate(fn: Optional[str] = None, text: Optional[str] = None) -> List[Token
lines = text.split("\n")
try:
tokens = tokenize(text)
tokens = tokenize(text, template_format=template_format)
except FormattedError as e:
raise TemplateParserError(
f"""