aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar mataha <mataha@users.noreply.github.com>2023-06-10 04:57:56 +0200
committerLibravatar Dirkjan Ochtman <dirkjan@ochtman.nl>2023-06-12 10:35:40 +0200
commitcba1fb8e508eae87d213e7bc4c7b2eb8b4b92732 (patch)
tree36fd43629c3686e2e630db884f5c5379d9c55246
parentfe5d350f50ebc73300456c618dd265cc43a8f05a (diff)
downloadaskama-cba1fb8e508eae87d213e7bc4c7b2eb8b4b92732.tar.gz
askama-cba1fb8e508eae87d213e7bc4c7b2eb8b4b92732.tar.bz2
askama-cba1fb8e508eae87d213e7bc4c7b2eb8b4b92732.zip
Allow macros to be defined and called without arguments
This commit introduces a shorthand for defining and calling macros when using them as a reusable substitute for variables assigned complex values (e.g. string literals with or without newline escapes). The use-case is formatting - from my experience it's easier to visually parse a `macro` `endmacro` block than a multiline variable assignment. Signed-off-by: mataha <mataha@users.noreply.github.com>
-rw-r--r--askama_derive/src/parser/node.rs7
-rw-r--r--testing/templates/macro-no-args.html21
-rw-r--r--testing/tests/macro.rs10
3 files changed, 36 insertions, 2 deletions
diff --git a/askama_derive/src/parser/node.rs b/askama_derive/src/parser/node.rs
index fc6860e..8c122af 100644
--- a/askama_derive/src/parser/node.rs
+++ b/askama_derive/src/parser/node.rs
@@ -133,12 +133,13 @@ fn block_call(i: &str) -> IResult<&str, Node<'_>> {
cut(tuple((
opt(tuple((ws(identifier), ws(tag("::"))))),
ws(identifier),
- ws(Expr::parse_arguments),
+ opt(ws(Expr::parse_arguments)),
opt(expr_handle_ws),
))),
));
let (i, (pws, _, (scope, name, args, nws))) = p(i)?;
let scope = scope.map(|(scope, _)| scope);
+ let args = args.unwrap_or_default();
Ok((i, Node::Call(Ws(pws, nws), scope, name, args)))
}
@@ -415,7 +416,7 @@ fn block_macro<'a>(i: &'a str, s: &State<'_>) -> IResult<&'a str, Node<'a>> {
ws(keyword("macro")),
cut(tuple((
ws(identifier),
- ws(parameters),
+ opt(ws(parameters)),
opt(expr_handle_ws),
|i| tag_block_end(i, s),
))),
@@ -435,6 +436,8 @@ fn block_macro<'a>(i: &'a str, s: &State<'_>) -> IResult<&'a str, Node<'a>> {
assert_ne!(name, "super", "invalid macro name 'super'");
+ let params = params.unwrap_or_default();
+
Ok((
i,
Node::Macro(
diff --git a/testing/templates/macro-no-args.html b/testing/templates/macro-no-args.html
new file mode 100644
index 0000000..b70ee8c
--- /dev/null
+++ b/testing/templates/macro-no-args.html
@@ -0,0 +1,21 @@
+1
+
+{%- macro empty -%}
+the best thing
+{%- endmacro -%}
+
+1
+
+{%- call empty() -%}
+
+1
+
+{%- macro whole() -%}
+we've ever done
+{%- endmacro -%}
+
+11
+
+{%- call whole -%}
+
+11
diff --git a/testing/tests/macro.rs b/testing/tests/macro.rs
index 6b0eca5..7e910a9 100644
--- a/testing/tests/macro.rs
+++ b/testing/tests/macro.rs
@@ -13,6 +13,16 @@ fn test_macro() {
}
#[derive(Template)]
+#[template(path = "macro-no-args.html")]
+struct MacroNoArgsTemplate;
+
+#[test]
+fn test_macro_no_args() {
+ let t = MacroNoArgsTemplate;
+ assert_eq!(t.render().unwrap(), "11the best thing111we've ever done11");
+}
+
+#[derive(Template)]
#[template(path = "import.html")]
struct ImportTemplate<'a> {
s: &'a str,