Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Fix "str|format" string formatting to match spec (%s formatting, not {} formatting), also support "str.format" syntax #267

Open
tjsmith-meta opened this issue Sep 26, 2024 · 0 comments

Comments

@tjsmith-meta
Copy link

tjsmith-meta commented Sep 26, 2024

The jinja2 spec alludes to two flavors of format -- str.format and str|format -- that seemingly have / support different string formatting syntaxes.
https://jinja.palletsprojects.com/en/2.10.x/templates/

The str.format syntax appears to support standard {} string formatting (like fmt::format), whereas str|format appears to support % string formatting (like printf). Here's a quick mapping / handy guide as I understand it.

  • jinja2 "hello %"|format("world") -> Python `"hello %" % "world"
  • jinja2 "hello {}".format("world") -> Python "hello {}".format("world")

Here's a template with corresponding Python jinja2 output.

# template; note that the "2 {}" case fails to compile if arg is passed
{{ "1 %s"|format(0) }}
{{ "2 {}"|format() }}
{{ "3 %s".format(0) }}
{{ "4 {}".format(0) }}

# Python jinja2 output
1 0
2 {}
3 %s
4 0

And a similar template with its corresponding jinja2cpp output.

# template; note that 3/4 are missing because `.format` syntax not currently supported in jinja2cpp
{{ "3 %s"|format(0) }}
{{ "4 {}"|format(0) }}

# jinja2cpp output
3 %s
4 0

From these examples, we can see a couple key differences between jinja2cpp and Python jinja2.

  1. str|format syntax in jinja2cpp behaves like str.format syntax in Python jinja2. That is to say that jinja2cpp uses {} string formatting for str|format when it should instead use %s string formatting (per spec / Python parity).
  2. str.format syntax is not supported in jinja2cpp. This should have the {} string formatting behavior, so existing str|format implementation in jinja2cpp could perhaps largely be reused / repurposed to support this.
@tjsmith-meta tjsmith-meta changed the title Fix "str|format" string formatting to match spec (%s formatting, not {} formatting) Fix "str|format" string formatting to match spec (%s formatting, not {} formatting), also support "str.format' syntax Sep 26, 2024
@tjsmith-meta tjsmith-meta changed the title Fix "str|format" string formatting to match spec (%s formatting, not {} formatting), also support "str.format' syntax Fix "str|format" string formatting to match spec (%s formatting, not {} formatting), also support "str.format" syntax Sep 26, 2024
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant