diff options
| author | 2018-06-23 18:17:33 +0200 | |
|---|---|---|
| committer | 2018-06-23 18:18:37 +0200 | |
| commit | a46966b4ad0f9223d7e5e12d675b337a048afd3e (patch) | |
| tree | 26d72c688ca58290966395a1b4822539f326720c /askama_derive/src | |
| parent | 6eb8e4f65c159204413b294a6b47007847ad1577 (diff) | |
| download | askama-a46966b4ad0f9223d7e5e12d675b337a048afd3e.tar.gz askama-a46966b4ad0f9223d7e5e12d675b337a048afd3e.tar.bz2 askama-a46966b4ad0f9223d7e5e12d675b337a048afd3e.zip | |
Add support for range operators (see #95)
Diffstat (limited to '')
| -rw-r--r-- | askama_derive/src/generator.rs | 18 | ||||
| -rw-r--r-- | askama_derive/src/parser.rs | 22 | 
2 files changed, 39 insertions, 1 deletions
| diff --git a/askama_derive/src/generator.rs b/askama_derive/src/generator.rs index 0e86a27..5ec2238 100644 --- a/askama_derive/src/generator.rs +++ b/askama_derive/src/generator.rs @@ -598,6 +598,7 @@ impl<'a> Generator<'a> {              Expr::Filter(name, ref args) => self.visit_filter(name, args, code),              Expr::Unary(op, ref inner) => self.visit_unary(op, inner, code),              Expr::BinOp(op, ref left, ref right) => self.visit_binop(op, left, right, code), +            Expr::Range(op, ref left, ref right) => self.visit_range(op, left, right, code),              Expr::Group(ref inner) => self.visit_group(inner, code),              Expr::MethodCall(ref obj, method, ref args) => {                  self.visit_method_call(obj, method, args, code) @@ -762,6 +763,23 @@ impl<'a> Generator<'a> {          DisplayWrap::Unwrapped      } +    fn visit_range( +        &mut self, +        op: &str, +        left: &Option<Box<Expr>>, +        right: &Option<Box<Expr>>, +        code: &mut String, +    ) -> DisplayWrap { +        if let Some(left) = left { +            self.visit_expr(left, code); +        } +        code.push_str(op); +        if let Some(right) = right { +            self.visit_expr(right, code); +        } +        DisplayWrap::Unwrapped +    } +      fn visit_binop(          &mut self,          op: &str, diff --git a/askama_derive/src/parser.rs b/askama_derive/src/parser.rs index c8bbb96..5694d4e 100644 --- a/askama_derive/src/parser.rs +++ b/askama_derive/src/parser.rs @@ -16,6 +16,7 @@ pub enum Expr<'a> {      Filter(&'a str, Vec<Expr<'a>>),      Unary(&'a str, Box<Expr<'a>>),      BinOp(&'a str, Box<Expr<'a>>, Box<Expr<'a>>), +    Range(&'a str, Option<Box<Expr<'a>>>, Option<Box<Expr<'a>>>),      Group(Box<Expr<'a>>),      MethodCall(Box<Expr<'a>>, &'a str, Vec<Expr<'a>>),  } @@ -422,7 +423,26 @@ expr_prec_layer!(expr_compare, expr_bor,      "==", "!=", ">=", ">", "<=", "<"  );  expr_prec_layer!(expr_and, expr_compare, "&&"); -expr_prec_layer!(expr_any, expr_and, "||"); +expr_prec_layer!(expr_or, expr_and, "||"); + +named!(range_right<Input, Expr>, do_parse!( +    ws!(tag_s!("..")) >> +    incl: opt!(ws!(tag_s!("="))) >> +    right: opt!(expr_or) >> +    (Expr::Range(if incl.is_some() { "..=" } else { ".." }, None, right.map(|v| Box::new(v)))) +)); + +named!(expr_any<Input, Expr>, alt!( +    range_right | +    do_parse!( +        left: expr_or >> +        rest: range_right >> (match rest { +            Expr::Range(op, _, right) => Expr::Range(op, Some(Box::new(left)), right), +            _ => unreachable!(), +        }) +    ) | +    expr_or +));  named!(expr_node<Input, Node>, do_parse!(      tag_s!("{{") >> | 
