diff options
| author | 2018-11-11 20:22:53 +0100 | |
|---|---|---|
| committer | 2018-11-11 21:06:51 +0100 | |
| commit | e7ed953b88c7f6383085c88dd5f761bb2875c02b (patch) | |
| tree | 31c59762670fff493fe5e52247d58d677a4f72ca | |
| parent | 6a2cff0ab6f2d4a14978f8efa75fa20740b95448 (diff) | |
| download | askama-e7ed953b88c7f6383085c88dd5f761bb2875c02b.tar.gz askama-e7ed953b88c7f6383085c88dd5f761bb2875c02b.tar.bz2 askama-e7ed953b88c7f6383085c88dd5f761bb2875c02b.zip | |
Add write! named arguments
| -rw-r--r-- | askama_derive/src/generator.rs | 31 | 
1 files changed, 24 insertions, 7 deletions
| diff --git a/askama_derive/src/generator.rs b/askama_derive/src/generator.rs index f40b094..947d88f 100644 --- a/askama_derive/src/generator.rs +++ b/askama_derive/src/generator.rs @@ -43,6 +43,8 @@ struct Generator<'a> {      super_block: Option<(&'a str, usize)>,      // buffer for writable      buf_writable: Vec<Writable<'a>>, +    // Counter for write! hash named arguments +    named: usize,  }  impl<'a> Generator<'a> { @@ -61,6 +63,7 @@ impl<'a> Generator<'a> {              skip_ws: false,              super_block: None,              buf_writable: vec![], +            named: 0,          }      } @@ -628,6 +631,7 @@ impl<'a> Generator<'a> {              } else {                  let mut buf_format = Buffer::new(0);                  let mut buf_expr = Buffer::new(buf.indent + 1); +                let mut expr_cache = HashMap::with_capacity(self.buf_writable.len());                  for s in mem::replace(&mut self.buf_writable, vec![]) {                      match s {                          Writable::Lit(s) => { @@ -638,18 +642,31 @@ impl<'a> Generator<'a> {                              use super::input::EscapeMode::*;                              let mut expr_buf = Buffer::new(0);                              let wrapped = self.visit_expr(&mut expr_buf, s); - -                            buf_format.write("{}"); -                            buf_expr.write("&"); -                            buf_expr.write(&match (wrapped, &self.input.escaping) { +                            let expression = match (wrapped, &self.input.escaping) {                                  (Wrapped, &Html) | (Wrapped, &None) | (Unwrapped, &None) => { -                                    expr_buf.buf +                                    expr_buf.buf.clone()                                  }                                  (Unwrapped, &Html) => { -                                    format!("::askama::MarkupDisplay::from(&{})", expr_buf.buf) +                                    format!( +                                        "::askama::MarkupDisplay::from(&{})", +                                        expr_buf.buf.clone() +                                    )                                  } +                            }; + +                            let id = expr_cache.entry(expression).or_insert_with(|| { +                                let id = self.named; +                                self.named += 1; + +                                buf_expr.write(&format!("a{}=", id)); +                                buf_expr.write("&"); +                                buf_expr.write(&expr_buf.buf); +                                buf_expr.writeln(","); + +                                id                              }); -                            buf_expr.writeln(","); + +                            buf_format.write(&format!("{{a{}}}", id));                          }                      }                  } | 
