diff options
-rw-r--r-- | askama/src/generator.rs | 8 | ||||
-rw-r--r-- | askama/src/parser.rs | 25 |
2 files changed, 32 insertions, 1 deletions
diff --git a/askama/src/generator.rs b/askama/src/generator.rs index 22931c7..0f5ec85 100644 --- a/askama/src/generator.rs +++ b/askama/src/generator.rs @@ -159,6 +159,10 @@ impl Generator { } } + fn write_block(&mut self, name: &str) { + self.writeln(&format!("self.render_block_{}_into(writer);", name)); + } + fn handle(&mut self, nodes: &Vec<Node>) { for n in nodes { match n { @@ -168,6 +172,10 @@ impl Generator { &Node::Loop(ref var, ref iter, ref body) => { self.write_loop(&var, &iter, &body); }, + &Node::Block(ref name) => { self.write_block(name) }, + &Node::Extends(_) | &Node::BlockDef(_, _) => { + panic!("no extends or block definition allowed in content"); + }, } } } diff --git a/askama/src/parser.rs b/askama/src/parser.rs index 3448330..b642b00 100644 --- a/askama/src/parser.rs +++ b/askama/src/parser.rs @@ -17,6 +17,9 @@ pub enum Node<'a> { Expr(Expr<'a>), Cond(Vec<(Option<Expr<'a>>, Vec<Node<'a>>)>), Loop(Target<'a>, Expr<'a>, Vec<Node<'a>>), + Extends(Expr<'a>), + BlockDef(&'a str, Vec<Node<'a>>), + Block(&'a str), } pub type Nodes<'a> = Vec<Node<'a>>; @@ -133,11 +136,31 @@ named!(block_for<Node>, do_parse!( tag_s!("%}") >> (Node::Loop(var, iter, block)))); +named!(block_extends<Node>, do_parse!( + tag_s!("{%") >> + ws!(tag_s!("extends")) >> + name: ws!(expr_str_lit) >> + tag_s!("%}") >> + (Node::Extends(name)))); + +named!(block_block<Node>, do_parse!( + tag_s!("{%") >> + ws!(tag_s!("block")) >> + name: ws!(nom::alphanumeric) >> + tag_s!("%}") >> + contents: parse_template >> + tag_s!("{%") >> + ws!(tag_s!("endblock")) >> + tag_s!("%}") >> + (Node::BlockDef(str::from_utf8(name).unwrap(), contents)))); + named!(parse_template<Nodes>, many0!(alt!( take_content | expr_node | block_if | - block_for))); + block_for | + block_extends | + block_block))); pub fn parse<'a>(src: &'a str) -> Nodes { match parse_template(src.as_bytes()) { |