aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--askama_shared/src/parser.rs24
-rw-r--r--testing/templates/macro.html12
-rw-r--r--testing/tests/macro.rs2
3 files changed, 26 insertions, 12 deletions
diff --git a/askama_shared/src/parser.rs b/askama_shared/src/parser.rs
index 624fbc6..19df795 100644
--- a/askama_shared/src/parser.rs
+++ b/askama_shared/src/parser.rs
@@ -996,7 +996,7 @@ fn block_import(i: &str) -> IResult<&str, Node<'_>> {
}
fn block_macro<'a>(i: &'a str, s: &State<'_>) -> IResult<&'a str, Node<'a>> {
- let mut p = tuple((
+ let mut start = tuple((
opt(expr_handle_ws),
ws(tag("macro")),
cut(tuple((
@@ -1004,19 +1004,21 @@ fn block_macro<'a>(i: &'a str, s: &State<'_>) -> IResult<&'a str, Node<'a>> {
ws(parameters),
opt(expr_handle_ws),
|i| tag_block_end(i, s),
- cut(tuple((
- |i| parse_template(i, s),
- cut(tuple((
- |i| tag_block_start(i, s),
- opt(expr_handle_ws),
- ws(tag("endmacro")),
- opt(expr_handle_ws),
- ))),
- ))),
))),
));
+ let (i, (pws1, _, (name, params, nws1, _))) = start(i)?;
+
+ let mut end = cut(tuple((
+ |i| parse_template(i, s),
+ cut(tuple((
+ |i| tag_block_start(i, s),
+ opt(expr_handle_ws),
+ ws(tag("endmacro")),
+ cut(tuple((opt(ws(tag(name))), opt(expr_handle_ws)))),
+ ))),
+ )));
+ let (i, (contents, (_, pws2, _, (_, nws2)))) = end(i)?;
- let (i, (pws1, _, (name, params, nws1, _, (contents, (_, pws2, _, nws2))))) = p(i)?;
assert_ne!(name, "super", "invalid macro name 'super'");
Ok((
diff --git a/testing/templates/macro.html b/testing/templates/macro.html
index 30ea742..f2f89e0 100644
--- a/testing/templates/macro.html
+++ b/testing/templates/macro.html
@@ -11,3 +11,15 @@
{%- call thrice(s) -%}
3
+
+{%- macro twice(param) -%}
+
+{{ param }} {{ param }}
+
+{%- endmacro twice -%}
+
+4
+
+{%- call twice(s) -%}
+
+5
diff --git a/testing/tests/macro.rs b/testing/tests/macro.rs
index e449dd5..6b0eca5 100644
--- a/testing/tests/macro.rs
+++ b/testing/tests/macro.rs
@@ -9,7 +9,7 @@ struct MacroTemplate<'a> {
#[test]
fn test_macro() {
let t = MacroTemplate { s: "foo" };
- assert_eq!(t.render().unwrap(), "12foo foo foo3");
+ assert_eq!(t.render().unwrap(), "12foo foo foo34foo foo5");
}
#[derive(Template)]