diff options
-rw-r--r-- | askama_shared/src/parser.rs | 18 | ||||
-rw-r--r-- | testing/templates/precedence.html | 7 | ||||
-rw-r--r-- | testing/tests/precedence.rs | 15 |
3 files changed, 34 insertions, 6 deletions
diff --git a/askama_shared/src/parser.rs b/askama_shared/src/parser.rs index 8732f0e..8ff2063 100644 --- a/askama_shared/src/parser.rs +++ b/askama_shared/src/parser.rs @@ -229,15 +229,21 @@ named!(expr_filtered<Expr>, do_parse!( macro_rules! expr_prec_layer { ( $name:ident, $inner:ident, $( $op:expr ),* ) => { - named!($name<Expr>, alt!( + named!($name<Expr>, do_parse!( left: $inner >> - op: ws!(alt!($( tag_s!($op) )|*)) >> - right: $inner >> - (Expr::BinOp(str::from_utf8(op).unwrap(), + op_and_right: opt!(pair!(ws!(alt!($( tag_s!($op) )|*)), expr_any)) >> + ( + if op_and_right.is_some() { + let (op, right) = op_and_right.unwrap(); + (Expr::BinOp(str::from_utf8(op).unwrap(), Box::new(left), Box::new(right))) - ) | $inner - )); + } else { + left + } + ) + ) + ); } } diff --git a/testing/templates/precedence.html b/testing/templates/precedence.html new file mode 100644 index 0000000..e5d12dd --- /dev/null +++ b/testing/templates/precedence.html @@ -0,0 +1,7 @@ +{{ 3 * 4 / 2 -}} +{{ 26 / 2 % 7 -}} +{{ 3 % 2 * 6 -}} +{{ 1 * 2 + 4 -}} +{{ 11 - 15 / 3 -}} +{{ 4 + 5 % 3 -}} +{{ 4 | 2 + 5 & 2 -}} diff --git a/testing/tests/precedence.rs b/testing/tests/precedence.rs new file mode 100644 index 0000000..f02189d --- /dev/null +++ b/testing/tests/precedence.rs @@ -0,0 +1,15 @@ +#[macro_use] +extern crate askama; + +use askama::Template; + +#[derive(Template)] +#[template(path = "precedence.html")] +struct PrecedenceTemplate { +} + +#[test] +fn test_precedence() { + let t = PrecedenceTemplate { }; + assert_eq!(t.render().unwrap(), "6".repeat(7)); +} |