From 51eee57b84adf7fe72b7aa9b23e3ef974baad5a4 Mon Sep 17 00:00:00 2001 From: Dirkjan Ochtman Date: Fri, 4 Aug 2017 13:19:30 +0200 Subject: Add support for include blocks (see #25) --- askama_derive/src/parser.rs | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'askama_derive/src/parser.rs') diff --git a/askama_derive/src/parser.rs b/askama_derive/src/parser.rs index 61ccb09..6a182d5 100644 --- a/askama_derive/src/parser.rs +++ b/askama_derive/src/parser.rs @@ -1,4 +1,5 @@ use nom::{self, IResult}; +use path; use std::str; #[derive(Debug)] @@ -31,6 +32,7 @@ pub enum Node<'a> { Extends(Expr<'a>), BlockDef(WS, &'a str, Vec>, WS), Block(WS, &'a str, WS), + Include(WS, String), } pub type Cond<'a> = (WS, Option>, Vec>); @@ -324,6 +326,25 @@ named!(block_block, do_parse!( WS(pws2.is_some(), pws2.is_some()))) )); +named!(block_include, do_parse!( + tag_s!("{%") >> + pws: opt!(tag_s!("-")) >> + ws!(tag_s!("include")) >> + name: ws!(expr_str_lit) >> + nws: opt!(tag_s!("-")) >> + tag_s!("%}") >> + ({ + let mut src = match name { + Expr::StrLit(s) => path::get_template_source(s), + _ => panic!("include path must be a string literal"), + }; + if src.ends_with('\n') { + let _ = src.pop(); + } + Node::Include(WS(pws.is_some(), nws.is_some()), src) + }) +)); + named!(block_comment, do_parse!( tag_s!("{#") >> take_until_s!("#}") >> @@ -338,6 +359,7 @@ named!(parse_template>>, many0!(alt!( block_if | block_for | block_extends | + block_include | block_block ))); -- cgit