From 3fb7590c460f65eef8773bf015ac79633dde867a Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Sat, 24 Sep 2022 00:24:34 +0200 Subject: [PATCH] Added macro support (#123) --- CHANGELOG.md | 6 + COMPATIBILITY.md | 17 +- Makefile | 2 +- doc-header.html | 2 +- examples/README.md | 1 + examples/macros/Cargo.toml | 9 + examples/macros/README.md | 7 + examples/macros/src/macros.html | 4 + examples/macros/src/main.rs | 16 ++ examples/macros/src/template.html | 15 ++ minijinja/src/compiler/ast.rs | 59 ++++- minijinja/src/compiler/codegen.rs | 110 ++++++++- minijinja/src/compiler/instructions.rs | 16 ++ minijinja/src/compiler/meta.rs | 216 ++++++++++++++++++ minijinja/src/compiler/mod.rs | 1 + minijinja/src/compiler/parser.rs | 121 ++++++++-- minijinja/src/filters.rs | 8 +- minijinja/src/functions.rs | 16 ++ minijinja/src/key/mod.rs | 2 +- minijinja/src/macros.rs | 4 +- minijinja/src/syntax.rs | 55 +++++ minijinja/src/template.rs | 20 +- minijinja/src/value/argtypes.rs | 9 +- minijinja/src/value/deserialize.rs | 4 +- minijinja/src/value/mod.rs | 60 +++-- minijinja/src/value/ops.rs | 2 +- minijinja/src/value/serialize.rs | 13 +- minijinja/src/vm/context.rs | 13 +- .../src/vm/{forloop.rs => loop_object.rs} | 0 minijinja/src/vm/macro_object.rs | 126 ++++++++++ minijinja/src/vm/mod.rs | 104 ++++++++- minijinja/src/vm/state.rs | 3 + minijinja/tests/inputs/err_block_in_macro.txt | 5 + .../tests/inputs/err_duplicate_macro_arg.txt | 6 + .../tests/inputs/err_too_many_macro_args.txt | 6 + .../inputs/err_too_many_macro_kwargs.txt | 6 + .../inputs/err_too_many_macro_kwargs2.txt | 6 + minijinja/tests/inputs/macro_basic.txt | 10 + .../tests/inputs/macro_calling_macro.txt | 5 + minijinja/tests/inputs/macro_import.txt | 6 + minijinja/tests/inputs/macro_import2.txt | 7 + minijinja/tests/inputs/macro_include.txt | 6 + minijinja/tests/inputs/macro_kwargs.txt | 7 + minijinja/tests/inputs/refs/call_macro.txt | 1 + minijinja/tests/inputs/refs/example_macro.txt | 2 + .../refs/include_with_var_and_macro.txt | 3 + minijinja/tests/parser-inputs/imports.txt | 9 + minijinja/tests/parser-inputs/macros.txt | 5 + .../test_parser__parser@call.txt.snap | 48 ++-- .../test_parser__parser@filter.txt.snap | 36 ++- .../test_parser__parser@imports.txt.snap | 195 ++++++++++++++++ .../test_parser__parser@macros.txt.snap | 109 +++++++++ .../test_templates__vm@debug.txt.snap | 3 + ..._templates__vm@err_block_in_macro.txt.snap | 23 ++ ...lates__vm@err_duplicate_macro_arg.txt.snap | 30 +++ ...lates__vm@err_too_many_macro_args.txt.snap | 29 +++ ...tes__vm@err_too_many_macro_kwargs.txt.snap | 30 +++ ...es__vm@err_too_many_macro_kwargs2.txt.snap | 30 +++ .../test_templates__vm@macro_basic.txt.snap | 14 ++ ...templates__vm@macro_calling_macro.txt.snap | 8 + .../test_templates__vm@macro_import.txt.snap | 11 + .../test_templates__vm@macro_import2.txt.snap | 12 + .../test_templates__vm@macro_include.txt.snap | 10 + .../test_templates__vm@macro_kwargs.txt.snap | 11 + minijinja/tests/test_templates.rs | 43 ++-- 65 files changed, 1613 insertions(+), 160 deletions(-) create mode 100644 examples/macros/Cargo.toml create mode 100644 examples/macros/README.md create mode 100644 examples/macros/src/macros.html create mode 100644 examples/macros/src/main.rs create mode 100644 examples/macros/src/template.html create mode 100644 minijinja/src/compiler/meta.rs rename minijinja/src/vm/{forloop.rs => loop_object.rs} (100%) create mode 100644 minijinja/src/vm/macro_object.rs create mode 100644 minijinja/tests/inputs/err_block_in_macro.txt create mode 100644 minijinja/tests/inputs/err_duplicate_macro_arg.txt create mode 100644 minijinja/tests/inputs/err_too_many_macro_args.txt create mode 100644 minijinja/tests/inputs/err_too_many_macro_kwargs.txt create mode 100644 minijinja/tests/inputs/err_too_many_macro_kwargs2.txt create mode 100644 minijinja/tests/inputs/macro_basic.txt create mode 100644 minijinja/tests/inputs/macro_calling_macro.txt create mode 100644 minijinja/tests/inputs/macro_import.txt create mode 100644 minijinja/tests/inputs/macro_import2.txt create mode 100644 minijinja/tests/inputs/macro_include.txt create mode 100644 minijinja/tests/inputs/macro_kwargs.txt create mode 100644 minijinja/tests/inputs/refs/call_macro.txt create mode 100644 minijinja/tests/inputs/refs/example_macro.txt create mode 100644 minijinja/tests/inputs/refs/include_with_var_and_macro.txt create mode 100644 minijinja/tests/parser-inputs/imports.txt create mode 100644 minijinja/tests/parser-inputs/macros.txt create mode 100644 minijinja/tests/snapshots/test_parser__parser@imports.txt.snap create mode 100644 minijinja/tests/snapshots/test_parser__parser@macros.txt.snap create mode 100644 minijinja/tests/snapshots/test_templates__vm@err_block_in_macro.txt.snap create mode 100644 minijinja/tests/snapshots/test_templates__vm@err_duplicate_macro_arg.txt.snap create mode 100644 minijinja/tests/snapshots/test_templates__vm@err_too_many_macro_args.txt.snap create mode 100644 minijinja/tests/snapshots/test_templates__vm@err_too_many_macro_kwargs.txt.snap create mode 100644 minijinja/tests/snapshots/test_templates__vm@err_too_many_macro_kwargs2.txt.snap create mode 100644 minijinja/tests/snapshots/test_templates__vm@macro_basic.txt.snap create mode 100644 minijinja/tests/snapshots/test_templates__vm@macro_calling_macro.txt.snap create mode 100644 minijinja/tests/snapshots/test_templates__vm@macro_import.txt.snap create mode 100644 minijinja/tests/snapshots/test_templates__vm@macro_import2.txt.snap create mode 100644 minijinja/tests/snapshots/test_templates__vm@macro_include.txt.snap create mode 100644 minijinja/tests/snapshots/test_templates__vm@macro_kwargs.txt.snap diff --git a/CHANGELOG.md b/CHANGELOG.md index b2202fab..ec61a46a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,12 @@ All notable changes to MiniJinja are documented here. - Improve error reporting for failures in blocks and trying to `super()` when there is no parent block. - Performance improvements. +- Added support for `{% import %}` / `{% from .. import .. %}` + and `{% macro %}`. (#123) +- Added `Value::is_kwargs` which disambiugates if an object passed + to a function or filter is a normal object or if it represents + keyword arguments. +- Added the ability to call functions stored on objects. # 0.22.1 diff --git a/COMPATIBILITY.md b/COMPATIBILITY.md index d6ec57f4..7f1e05b5 100644 --- a/COMPATIBILITY.md +++ b/COMPATIBILITY.md @@ -38,6 +38,10 @@ mapping them to filter functions is tricky. This also means that some filters i MiniJinja do not accept the parameters with keyword arguments whereas in Jinja2 they do. +### Variadic Calls + +MiniJinja does not support the `*args` and `**kwargs` syntax for calls. + ### Undefined The Jinja2 undefined type tracks the origin of creation, in MiniJinja the undefined @@ -87,14 +91,19 @@ MiniJinja is different as mentioned above. ### `{% import %}` -This tag is currently not supported. If support for macros is added -this would make sense to add. +This tag is supported but the returned item is a map of the exported local +variables. This means that the rendered content of the template is lost. ### `{% macro %}` -This tag is currently not supported. +The macro tag works very similar to Jinja2 but with some differences. Most +importantly the special `caller`, `varargs` and `kwargs` arguments are not +supported. The external introspectable attributes `catch_kwargs`, `catch_varargs` +and `caller` are not supported. + +### `{% call %}` -**Tracking issue:** [#44](https://github.com/mitsuhiko/minijinja/issues/44) +This tag is not supported. ### `{% with %}` diff --git a/Makefile b/Makefile index dc2b6f75..0ef6fcdc 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,7 @@ build: @cargo build --all doc: - @cd minijinja; RUSTC_BOOTSTRAP=1 RUSTDOCFLAGS="--cfg=docsrs --html-in-header doc-header.html" cargo doc --all --no-deps --features=$(DOC_FEATURES) + @cd minijinja; RUSTC_BOOTSTRAP=1 RUSTDOCFLAGS="--cfg=docsrs --html-in-header doc-header.html" cargo doc -p minijinja -p minijinja-autoreload --no-deps --features=$(DOC_FEATURES) test: @$(MAKE) run-tests FEATURES=$(TEST_FEATURES) diff --git a/doc-header.html b/doc-header.html index aaa01395..49c60eb8 100644 --- a/doc-header.html +++ b/doc-header.html @@ -4,7 +4,7 @@