diff options
author | Aarni Koskela <akx@iki.fi> | 2023-12-15 16:24:32 +0200 |
---|---|---|
committer | David Lord <davidism@gmail.com> | 2024-01-10 14:27:09 -0800 |
commit | 19a55db3b411343309f2faaffaedbb089e841895 (patch) | |
tree | fdb7c8ac96783d7fc07f0223300e07847bae580f | |
parent | 716795349a41d4983a9a4771f7d883c96ea17be7 (diff) | |
download | jinja-19a55db3b411343309f2faaffaedbb089e841895.tar.gz |
Make nested-trans-block exceptions nicer
-rw-r--r-- | CHANGES.rst | 2 | ||||
-rw-r--r-- | src/jinja2/ext.py | 16 | ||||
-rw-r--r-- | tests/test_ext.py | 13 |
3 files changed, 28 insertions, 3 deletions
diff --git a/CHANGES.rst b/CHANGES.rst index d6688e76..bced976e 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -8,6 +8,8 @@ Unreleased - Fix compiler error when checking if required blocks in parent templates are empty. :pr:`1858` - ``xmlattr`` filter does not allow keys with spaces. GHSA-h5c8-rqwp-cp95 +- Make error messages stemming from invalid nesting of ``{% trans %}`` blocks + more helpful. :pr:`1916` Version 3.1.2 diff --git a/src/jinja2/ext.py b/src/jinja2/ext.py index 354b4063..fade1fa3 100644 --- a/src/jinja2/ext.py +++ b/src/jinja2/ext.py @@ -495,16 +495,26 @@ class InternationalizationExtension(Extension): parser.stream.expect("variable_end") elif parser.stream.current.type == "block_begin": next(parser.stream) - if parser.stream.current.test("name:endtrans"): + block_name = ( + parser.stream.current.value + if parser.stream.current.type == "name" + else None + ) + if block_name == "endtrans": break - elif parser.stream.current.test("name:pluralize"): + elif block_name == "pluralize": if allow_pluralize: break parser.fail( "a translatable section can have only one pluralize section" ) + elif block_name == "trans": + parser.fail( + "trans blocks can't be nested; did you mean `endtrans`?" + ) parser.fail( - "control structures in translatable sections are not allowed" + f"control structures in translatable sections are not allowed; " + f"saw `{block_name}`" ) elif parser.stream.eos: parser.fail("unclosed translation block") diff --git a/tests/test_ext.py b/tests/test_ext.py index 2e842e0a..0b48ca25 100644 --- a/tests/test_ext.py +++ b/tests/test_ext.py @@ -7,6 +7,7 @@ from jinja2 import DictLoader from jinja2 import Environment from jinja2 import nodes from jinja2 import pass_context +from jinja2 import TemplateSyntaxError from jinja2.exceptions import TemplateAssertionError from jinja2.ext import Extension from jinja2.lexer import count_newlines @@ -468,6 +469,18 @@ class TestInternationalization: (3, "npgettext", ("babel", "%(users)s user", "%(users)s users", None), []), ] + def test_nested_trans_error(self): + s = "{% trans %}foo{% trans %}{% endtrans %}" + with pytest.raises(TemplateSyntaxError) as excinfo: + i18n_env.from_string(s) + assert "trans blocks can't be nested" in str(excinfo.value) + + def test_trans_block_error(self): + s = "{% trans %}foo{% wibble bar %}{% endwibble %}{% endtrans %}" + with pytest.raises(TemplateSyntaxError) as excinfo: + i18n_env.from_string(s) + assert "saw `wibble`" in str(excinfo.value) + class TestScope: def test_basic_scope_behavior(self): |