diff --git a/CHANGES.rst b/CHANGES.rst index 338dc9966..9565c8d28 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -13,6 +13,8 @@ Unreleased - Use modern packaging metadata with ``pyproject.toml`` instead of ``setup.cfg``. :pr:`1793` - Use ``flit_core`` instead of ``setuptools`` as build backend. +- Fix ``indent`` filter not respecting ``blank=False`` for the first line + when ``first=True`` is set. :issue:`2176` Version 3.1.6 diff --git a/src/jinja2/filters.py b/src/jinja2/filters.py index c46e20c10..897cfb331 100644 --- a/src/jinja2/filters.py +++ b/src/jinja2/filters.py @@ -860,7 +860,7 @@ def do_indent( indention + line if line else line for line in lines ) - if first: + if first and (blank or rv.split("\n", 1)[0]): rv = indention + rv return rv diff --git a/tests/test_filters.py b/tests/test_filters.py index 4601469a6..58d85a811 100644 --- a/tests/test_filters.py +++ b/tests/test_filters.py @@ -166,7 +166,7 @@ def _test_indent_multiline_template(env, markup=False): t = env.from_string("{{ foo|indent(2, false, true) }}") assert t.render(foo=text) == '\n foo bar\n "baz"\n ' t = env.from_string("{{ foo|indent(2, true, false) }}") - assert t.render(foo=text) == ' \n foo bar\n "baz"\n' + assert t.render(foo=text) == '\n foo bar\n "baz"\n' t = env.from_string("{{ foo|indent(2, true, true) }}") assert t.render(foo=text) == ' \n foo bar\n "baz"\n ' @@ -179,6 +179,21 @@ def test_indent(self, env): t = env.from_string('{{ "jinja"|indent(blank=true) }}') assert t.render() == "jinja" + def test_indent_first_blank(self, env): + # ``blank=False`` (the default) must suppress indentation of the first + # line when it is empty, even when ``first=True``. Regression for + # https://github.com/pallets/jinja/issues/2176 + t = env.from_string("{% filter indent(4, first=true) %}{% endfilter %}") + assert t.render() == "" + # A leading blank line is not indented when blank=False. + t = env.from_string('{{ "\nhello"|indent(4, first=true) }}') + assert t.render() == "\n hello" + # blank=True still indents the first line even when it is empty. + t = env.from_string( + "{% filter indent(4, first=true, blank=true) %}{% endfilter %}" + ) + assert t.render() == " " + def test_indent_markup_input(self, env): """ Tests cases where the filter input is a Markup type