Jinja2 模版引擎 代码生成
广泛用于生成各种模版代码
Jinja — Jinja Documentation (3.1.x) (palletsprojects.com)
https://jinja.palletsprojects.com/en/3.1.x/switching/
JinJa2 是一个 Python 实现的模板引擎
Jinja2 是一个现代的,设计者友好的,仿照 Django 模板的 Python 模板语言。 它速度快,被广泛使用,并且提供了可选的沙箱模板执行环境保证安全
Jinja is a fast, expressive, extensible templating engine. Special placeholders in the template allow writing code similar to Python syntax. Then the template is passed data to render the final document.
其他模板引擎 StringTemplate
https://docs.python.org/3/library/string.html#template-strings
https://github.com/jinja2cpp/Jinja2Cpp
Jinja2С++
C++ implementation of the Jinja2 Python template engine. This library brings support of powerful Jinja2 template features into the C++ world, reports dynamic HTML pages and source code generation.
Jinja2C++ is a modern C++ implementation of the Python’s Jinja2 template engine.
This project was inspired by Jinja2CppLight library.
pantor::inja
Inja is a template engine for modern C++, loosely inspired by jinja for python. It has an easy and yet powerful template syntax with all variables, loops, conditions, includes, callbacks, and comments you need, nested and combined as you like. Inja uses the wonderful json library by nlohmann for data input. Most importantly, inja needs only two header files, which is (nearly) as trivial as integration in C++ can get. Of course, everything is tested on all relevant compilers. Here is what it looks like:
Welcome to the C++ CTemplate system!
This library provides an easy to use and lightning fast text templating system to use with C++ programs.
It was originally called Google Templates, due to its origin as the template system used for Google search result pages. Now it has a more general name matching its community-owned nature.
https://github.com/OlafvdSpek/ctemplate
Comparison with other implementations
Feature | Jinja2C++ | Jinja2CppLight | pantor::inja | Python Jinja2 |
---|---|---|---|---|
More information | see [1] | see [2] | see [3] | |
{{ / }} | yes | yes | yes | yes |
{% / %} | yes | yes | yes | yes |
{# / #} | yes | yes | yes | yes |
Single-line statements | no | no | yes | yes |
raw/endraw | yes | no | no | yes |
Whitespace control | yes | no | yes | yes |
Statements | ||||
set | yes | no | no | yes |
block set | yes | no | no | yes |
if / endif | yes | yes | yes | yes |
else | yes | no | yes | yes |
elif | yes | no | no | yes |
for / endfor | yes | yes | yes | yes |
recursive for loop | yes | no | no | yes |
conditional for loop | yes | no | no | yes |
extends / block | yes | no | no | yes |
import | yes | no | no | yes |
include | yes | no | yes | yes |
macro / endmacro | yes | no | no | yes |
call | yes | no | no | yes |
filter | yes | no | no | yes |
do (extension) | yes | no | no | yes |
with (extension) | yes | no | no | yes |
i18n (extension) | no | no | no | yes |
continue/break (extension) | no | no | no | yes |
autoescape (extension) | no | no | no | yes |
Expressions | ||||
String literals | yes | yes | yes | yes |
Integer numbers | yes | yes | yes | yes |
Floating numbers | yes | yes | yes | yes |
Lists ([1, 3, 4] ) |
yes | no | no | yes |
Tuples ((1, "one", 3.14) ) |
yes | no | no | yes |
Dicts ({'dict': 'of', 'key': 'and', 'value': 'pairs'} ) |
yes | no | no | yes |
True / False |
yes | no | no | yes |
+ operator |
yes | no | no | yes |
- operator |
yes | no | no | yes |
/ operator |
yes | no | no | yes |
// operator |
yes | no | no | yes |
% operator |
yes | no | no | yes |
* operator |
yes | no | no | yes |
** operator |
yes | no | no | yes |
== operator |
yes | yes | yes | yes |
!= operator |
yes | yes | yes | yes |
> / < / >= / <= operators |
yes | yes | yes | yes |
and / or / not logical operators |
yes | no | yes | yes |
in operator |
yes | no | yes | yes |
is operator |
yes | no | no | yes |
| (filter application operator) |
yes | no | no | yes |
~ (string concatenation operator) |
yes | no | no | yes |
() (call operator) |
yes | no | yes | yes |
. (attribute access) |
yes | no | yes | yes |
[] (attribute access) |
yes | no | no | yes |
[] (arrays slicing) |
no | no | no | yes |
Filters | ||||
abs | yes | no | no | yes |
attr | yes | no | no | yes |
batch | yes | no | no | yes |
capitalize | yes | no | no | yes |
center | no | no | no | yes |
default | yes | no | yes (as function) | yes |
dictsort | yes | no | no | yes |
escape | yes | no | no | yes |
filesizeformat | no | no | no | yes |
first | yes | no | yes (as function) | yes |
float | yes | no | yes (as function) | yes |
forceescape | no | no | no | yes |
format | yes | no | no | yes |
groupby | yes | no | no | yes |
indent | no | no | no | yes |
int | yes | no | yes (as function) | yes |
join | yes | no | no | yes |
last | yes | no | yes (as function) | yes |
length | yes | no | yes (as function) | yes |
list | yes | no | no | yes |
lower | yes | no | yes (as function) | yes |
map | yes | no | no | yes |
max | yes | no | no | yes |
min | yes | no | no | yes |
pprint | yes | no | no | yes |
random | yes | no | no | yes |
reject | yes | no | no | yes |
rejectattr | yes | no | no | yes |
replace | yes | no | no | yes |
reverse | yes | no | no | yes |
round | yes | no | yes (as function) | yes |
safe | no | no | no | yes |
select | yes | no | no | yes |
selectattr | yes | no | no | yes |
slice | yes | no | no | yes |
sort | yes | no | yes (as function) | yes |
string | yes | no | yes (as function) | yes |
striptags | no | no | no | yes |
sum | yes | no | no | yes |
title | yes | no | no | yes |
tojson | no | no | no | yes |
trim | yes | no | no | yes |
truncate | yes | no | no | yes |
unique | yes | no | no | yes |
upper | yes | no | yes (as function) | yes |
urlencode | yes | no | no | yes |
urlize | yes | no | no | yes |
wordcount | yes | no | no | yes |
wordwrap | yes | no | no | yes |
Testers | ||||
callable | no | no | no | yes |
defined | yes | no | yes (as function) | yes |
devisibleby | no | no | yes (as function) | yes |
eq | yes | no | no | yes |
escaped | no | no | no | yes |
even | yes | no | yes (as function) | yes |
ge | yes | no | no | yes |
gt | yes | no | no | yes |
in | yes | no | no | yes |
iterable | yes | no | no | yes |
le | yes | no | no | yes |
lower | yes | no | no | yes |
lt | yes | no | no | yes |
mapping | yes | no | yes (as function) | yes |
ne | yes | no | no | yes |
none | no | no | no | yes |
number | yes | no | yes (as function) | yes |
odd | yes | no | no | yes |
sameas | no | no | no | yes |
sequence | yes | no | yes (as function) | yes |
string | yes | no | yes (as function) | yes |
undefined | yes | no | no | yes |
upper | yes | no | no | yes |
Global functions and classes | ||||
range | yes | no | yes (as function) | yes |
lipsum | no | no | no | yes |
dict | no | no | no | yes |
cycler | no | no | no | yes |
joiner | no | no | no | yes |
namespace | no | no | no | yes |
References
- [1] https://github.com/hughperkins/Jinja2CppLight
- [2] https://github.com/pantor/inja
- [3] https://jinja.palletsprojects.com/en/2.10.x/