Merge pull request #1014 from markroth8/mroth/fix/748

Allow '{%+' to be valid syntax (but NOP) when lstrip_blocks == False. Fixes #748
This commit is contained in:
David Lord 2019-07-20 14:23:53 -07:00 committed by GitHub
commit f76c3edf2b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 39 additions and 17 deletions

View File

@ -16,8 +16,11 @@ unreleased
- The ``map`` filter in async mode now automatically awaits
- Added a new ``ChainableUndefined`` class to support getitem
and getattr on an undefined object. (`#977`_)
- Allow `'{%+'` syntax (with NOP behavior) when
`lstrip_blocks == False` (`#748`_)
.. _#765: https://github.com/pallets/jinja/issues/765
.. _#748: https://github.com/pallets/jinja/issues/748
.. _#977: https://github.com/pallets/jinja/issues/977
@ -28,6 +31,7 @@ _Unreleased_
- Fix Python 3.7 deprecation warnings.
Version 2.10.1
--------------

View File

@ -445,22 +445,21 @@ class Lexer(object):
# strip leading spaces if lstrip_blocks is enabled
prefix_re = {}
no_lstrip_re = e('+')
# detect overlap between block and variable or comment strings
block_diff = c(r'^%s(.*)' % e(environment.block_start_string))
# make sure we don't mistake a block for a variable or a comment
m = block_diff.match(environment.comment_start_string)
no_lstrip_re += m and r'|%s' % e(m.group(1)) or ''
m = block_diff.match(environment.variable_start_string)
no_lstrip_re += m and r'|%s' % e(m.group(1)) or ''
# detect overlap between comment and variable strings
comment_diff = c(r'^%s(.*)' % e(environment.comment_start_string))
m = comment_diff.match(environment.variable_start_string)
no_variable_re = m and r'(?!%s)' % e(m.group(1)) or ''
if environment.lstrip_blocks:
# use '{%+' to manually disable lstrip_blocks behavior
no_lstrip_re = e('+')
# detect overlap between block and variable or comment strings
block_diff = c(r'^%s(.*)' % e(environment.block_start_string))
# make sure we don't mistake a block for a variable or a comment
m = block_diff.match(environment.comment_start_string)
no_lstrip_re += m and r'|%s' % e(m.group(1)) or ''
m = block_diff.match(environment.variable_start_string)
no_lstrip_re += m and r'|%s' % e(m.group(1)) or ''
# detect overlap between comment and variable strings
comment_diff = c(r'^%s(.*)' % e(environment.comment_start_string))
m = comment_diff.match(environment.variable_start_string)
no_variable_re = m and r'(?!%s)' % e(m.group(1)) or ''
lstrip_re = r'^[ \t]*'
block_prefix_re = r'%s%s(?!%s)|%s\+?' % (
lstrip_re,
@ -474,10 +473,21 @@ class Lexer(object):
no_variable_re,
e(environment.comment_start_string),
)
prefix_re['block'] = block_prefix_re
prefix_re['comment'] = comment_prefix_re
else:
block_prefix_re = '%s' % e(environment.block_start_string)
# If lstrip_blocks is False, then '{%+' is allowed but a NOP
block_prefix_re = r'%s(?!%s)|%s\+?' % (
e(environment.block_start_string),
no_lstrip_re,
e(environment.block_start_string),
)
comment_prefix_re = r'%s%s|%s\+?' % (
e(environment.comment_start_string),
no_variable_re,
e(environment.comment_start_string),
)
prefix_re['block'] = block_prefix_re
prefix_re['comment'] = comment_prefix_re
self.newline_sequence = environment.newline_sequence
self.keep_trailing_newline = environment.keep_trailing_newline

View File

@ -503,6 +503,14 @@ class TestLstripBlocks(object):
tmpl = env.from_string(''' {%+ if True %}\n {%+ endif %}''')
assert tmpl.render() == " \n "
def test_lstrip_blocks_false_with_no_lstrip(self, env):
# Test that + is a NOP (but does not cause an error) if lstrip_blocks=False
env = Environment(lstrip_blocks=False, trim_blocks=False)
tmpl = env.from_string(''' {% if True %}\n {% endif %}''')
assert tmpl.render() == " \n "
tmpl = env.from_string(''' {%+ if True %}\n {%+ endif %}''')
assert tmpl.render() == " \n "
def test_lstrip_endline(self, env):
env = Environment(lstrip_blocks=True, trim_blocks=False)
tmpl = env.from_string(