diff --git a/djhtml/modes.py b/djhtml/modes.py index 9b9e655..d017da3 100644 --- a/djhtml/modes.py +++ b/djhtml/modes.py @@ -241,7 +241,7 @@ def create_token(self, raw_token, src, line): return token, mode def _has_closing_token(self, name, raw_token, src): - if not re.search(f"{{%[-+]? *(end|/){name}(?: .*?|)%}}", src): + if not re.search(f"{{%[-+]? *(end_?|/){name}(?: .*?|)%}}", src): return False if regex := self.AMBIGUOUS_BLOCK_TAGS.get(name): if regex[0]: diff --git a/tests/suite/django.html b/tests/suite/django.html index 6f6cab7..bea3af6 100644 --- a/tests/suite/django.html +++ b/tests/suite/django.html @@ -184,3 +184,14 @@

Welcome, {{ request.user }}

This component is intentionally repeated. {% /quote_text %} {% /quote %} + + + +{% custom_tag %} +
+{% end_custom_tag %} + + +{% customtag %} +
+{% endcustomtag %} diff --git a/tests/suite/django.tokens b/tests/suite/django.tokens index 94af570..21112ac 100644 --- a/tests/suite/django.tokens +++ b/tests/suite/django.tokens @@ -184,4 +184,15 @@ Line([Text(' ', mode=DjHTML), Open('{% #quote_text %}', mode=DjTXT, level=1)] Line([Text(' This component is intentionally repeated.', mode=DjHTML)], level=2) Line([Text(' ', mode=DjHTML), Close('{% /quote_text %}', mode=DjTXT)], level=1) Line([Close('{% /quote %}', mode=DjTXT)]) +Line([]) +Line([]) +Line([Open('', mode=DjHTML, ignore=True)], ignore=True) +Line([Open('{% custom_tag %}', mode=DjTXT)]) +Line([Text(' ', mode=DjHTML), Text('<', mode=DjHTML), Text('div', mode=InsideHTMLTag, absolute=5), Open('>', mode=DjHTML, level=1), Close('', mode=DjHTML)], level=1) +Line([Close('{% end_custom_tag %}', mode=DjTXT)]) +Line([]) +Line([Open('', mode=DjHTML, ignore=True)], ignore=True) +Line([Open('{% customtag %}', mode=DjTXT)]) +Line([Text(' ', mode=DjHTML), Text('<', mode=DjHTML), Text('div', mode=InsideHTMLTag, absolute=5), Open('>', mode=DjHTML, level=1), Close('', mode=DjHTML)], level=1) +Line([Close('{% endcustomtag %}', mode=DjTXT)]) Line([]) \ No newline at end of file