aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--askama/src/generator.rs5
-rw-r--r--askama/src/parser.rs10
2 files changed, 14 insertions, 1 deletions
diff --git a/askama/src/generator.rs b/askama/src/generator.rs
index a5686e6..57d1205 100644
--- a/askama/src/generator.rs
+++ b/askama/src/generator.rs
@@ -75,6 +75,10 @@ impl Generator {
self.start = true;
}
+ fn visit_str_lit(&mut self, s: &str) {
+ self.write(&format!("\"{}\"", s));
+ }
+
fn visit_var(&mut self, s: &[u8]) {
let s = str::from_utf8(s).unwrap();
if self.locals.contains(s) {
@@ -98,6 +102,7 @@ impl Generator {
fn visit_expr(&mut self, expr: &Expr) {
match expr {
+ &Expr::StrLit(s) => self.visit_str_lit(s),
&Expr::Var(s) => self.visit_var(s),
&Expr::Filter(name, ref val) => self.visit_filter(name, &val),
&Expr::Compare(op, ref left, ref right) =>
diff --git a/askama/src/parser.rs b/askama/src/parser.rs
index f395cb6..e29b460 100644
--- a/askama/src/parser.rs
+++ b/askama/src/parser.rs
@@ -2,6 +2,7 @@ use nom::{self, IResult};
use std::str;
pub enum Expr<'a> {
+ StrLit(&'a str),
Var(&'a [u8]),
Filter(&'a str, Box<Expr<'a>>),
Compare(&'a str, Box<Expr<'a>>, Box<Expr<'a>>),
@@ -39,6 +40,10 @@ fn take_content(i: &[u8]) -> IResult<&[u8], Node> {
IResult::Done(&i[..0], Node::Lit(&i[..]))
}
+named!(expr_str_lit<Expr>, map!(
+ delimited!(char!('"'), is_not!("\""), char!('"')),
+ |s| Expr::StrLit(str::from_utf8(s).unwrap())));
+
named!(expr_var<Expr>, map!(nom::alphanumeric, Expr::Var));
named!(target_single<Target>, map!(nom::alphanumeric, Target::Name));
@@ -77,7 +82,10 @@ named!(expr_compare<Expr>, do_parse!(
(Expr::Compare(str::from_utf8(op).unwrap(),
Box::new(left), Box::new(right)))));
-named!(expr_any<Expr>, alt!(expr_compare | expr_filtered));
+named!(expr_any<Expr>, alt!(
+ expr_compare |
+ expr_filtered |
+ expr_str_lit));
named!(expr_node<Node>, map!(
delimited!(tag_s!("{{"), ws!(expr_any), tag_s!("}}")),