Skip to content

Passing multiline string to a function like gettext() fails on single quote #845

@lelit

Description

@lelit

Expected Behavior

I would expect that the behavior wrt to multiline strings mimics what Python allows, even when such string is actually passed as an argument to an extension function.

Actual Behavior

Executing gettext("""This is a "test"!""") raises an exception.

Template Code

from jinja2 import Environment, Template

env = Environment(extensions=['jinja2.ext.i18n'])
env.install_null_translations(True)

template = env.from_string('''{{ _("""This is a 'test'!""") }}''')
print(template.render())

template = env.from_string('''{{ _("""This is another "test"!""") }}''')
print(template.render())

Full Traceback

This is a 'test'!
Traceback (most recent call last):
  File "p.py", line 9, in <module>
    template = env.from_string('''{{ _("""This is another "test"!""") }}''')
  File "/tmp/e/lib/python3.6/site-packages/jinja2/environment.py", line 880, in from_string
    return cls.from_code(self, self.compile(source), globals, None)
  File "/tmp/e/lib/python3.6/site-packages/jinja2/environment.py", line 591, in compile
    self.handle_exception(exc_info, source_hint=source_hint)
  File "/tmp/e/lib/python3.6/site-packages/jinja2/environment.py", line 780, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/tmp/e/lib/python3.6/site-packages/jinja2/_compat.py", line 37, in reraise
    raise value.with_traceback(tb)
  File "<unknown>", line 1, in template
  File "/tmp/e/lib/python3.6/site-packages/jinja2/environment.py", line 497, in _parse
    return Parser(self, source, name, encode_filename(filename)).parse()
  File "/tmp/e/lib/python3.6/site-packages/jinja2/parser.py", line 901, in parse
    result = nodes.Template(self.subparse(), lineno=1)
  File "/tmp/e/lib/python3.6/site-packages/jinja2/parser.py", line 875, in subparse
    add_data(self.parse_tuple(with_condexpr=True))
  File "/tmp/e/lib/python3.6/site-packages/jinja2/parser.py", line 620, in parse_tuple
    args.append(parse())
  File "/tmp/e/lib/python3.6/site-packages/jinja2/parser.py", line 432, in parse_expression
    return self.parse_condexpr()
  File "/tmp/e/lib/python3.6/site-packages/jinja2/parser.py", line 437, in parse_condexpr
    expr1 = self.parse_or()
  File "/tmp/e/lib/python3.6/site-packages/jinja2/parser.py", line 450, in parse_or
    left = self.parse_and()
  File "/tmp/e/lib/python3.6/site-packages/jinja2/parser.py", line 459, in parse_and
    left = self.parse_not()
  File "/tmp/e/lib/python3.6/site-packages/jinja2/parser.py", line 470, in parse_not
    return self.parse_compare()
  File "/tmp/e/lib/python3.6/site-packages/jinja2/parser.py", line 474, in parse_compare
    expr = self.parse_math1()
  File "/tmp/e/lib/python3.6/site-packages/jinja2/parser.py", line 496, in parse_math1
    left = self.parse_concat()
  File "/tmp/e/lib/python3.6/site-packages/jinja2/parser.py", line 507, in parse_concat
    args = [self.parse_math2()]
  File "/tmp/e/lib/python3.6/site-packages/jinja2/parser.py", line 517, in parse_math2
    left = self.parse_pow()
  File "/tmp/e/lib/python3.6/site-packages/jinja2/parser.py", line 528, in parse_pow
    left = self.parse_unary()
  File "/tmp/e/lib/python3.6/site-packages/jinja2/parser.py", line 547, in parse_unary
    node = self.parse_postfix(node)
  File "/tmp/e/lib/python3.6/site-packages/jinja2/parser.py", line 676, in parse_postfix
    node = self.parse_call(node)
  File "/tmp/e/lib/python3.6/site-packages/jinja2/parser.py", line 767, in parse_call
    self.stream.expect('comma')
  File "/tmp/e/lib/python3.6/site-packages/jinja2/lexer.py", line 384, in expect
    self.name, self.filename)
jinja2.exceptions.TemplateSyntaxError: expected token ',', got 'test'

Your Environment

  • Python version: 3.6.5
  • Jinja version: 2.10

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions