diff --git a/src/djlint/rules.yaml b/src/djlint/rules.yaml index bd9c779..d5df52e 100644 --- a/src/djlint/rules.yaml +++ b/src/djlint/rules.yaml @@ -26,7 +26,7 @@ message: Double quotes should be used in tags. flags: re.DOTALL patterns: - - "{%[ \t]*?(?:trans(?:late)?|with|extends|include|now)?[ \t]+?(?:[^']+?=)?'[^']*'" + - "{%[ \t]*?(?:trans(?:late)?|with|extends|include|now)?[ \t]+?(?:[^']+?=)?'[^']*?'(?:(?!%}).)*?%}" - rule: name: T003 message: 'Endblock should have name. Ex: {% endblock body %}.' @@ -203,12 +203,12 @@ # for single quotes - "{%((?:(?!'|%}).)*?(')(?:(?!\\2|%}).)*?\\2(?:(?!\\2|%}).)*?)*\\2(?:(?!\\2|%}).)*?%}" # for double quotes - - "{%((?:(?!\"|%}).)*?(\")(?:(?!\\2|%}).)*?\\2(?:(?!\\2|%}).)*?)*\\2(?:(?!\\2|%}).)*?%}" + - '{%((?:(?!"|%}).)*?(")(?:(?!\2|%}).)*?\2(?:(?!\2|%}).)*?)*\2(?:(?!\2|%}).)*?%}' # for single quotes - "{{((?:(?!'|}}).)*?(')(?:(?!\\2|}}).)*?\\2(?:(?!\\2|}}).)*?)*\\2(?:(?!\\2|}}).)*?}}" # for double quotes - - "{{((?:(?!\"|}}).)*?(\")(?:(?!\\2|}}).)*?\\2(?:(?!\\2|}}).)*?)*\\2(?:(?!\\2|}}).)*?}}" + - '{{((?:(?!"|}}).)*?(")(?:(?!\2|}}).)*?\2(?:(?!\2|}}).)*?)*\2(?:(?!\2|}}).)*?}}' # for tags with a single quote - "{%((?:(?!'|\"|%}).)*?('|\")(?:(?!\\2|%}).)*?)%}" diff --git a/tests/test_linter/test_linter.py b/tests/test_linter/test_linter.py index ff48a1c..83a7175 100644 --- a/tests/test_linter/test_linter.py +++ b/tests/test_linter/test_linter.py @@ -104,6 +104,15 @@ def test_T002(runner: CliRunner, tmp_file: TextIO) -> None: assert result.exit_code == 1 assert "T002" in result.output + # verify regex doesn't over grab + write_to_file( + tmp_file.name, + b"""{% extends "layout.h" %} +
""", + ) + result = runner.invoke(djlint, [tmp_file.name, "--profile", "django"]) + assert "T002" not in result.output + def test_T003(runner: CliRunner, tmp_file: TextIO) -> None: write_to_file(tmp_file.name, b"{% endblock %}")