diff options
Diffstat (limited to 'askama_shared')
-rw-r--r-- | askama_shared/src/input.rs | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/askama_shared/src/input.rs b/askama_shared/src/input.rs index 95233d3..f71f8d0 100644 --- a/askama_shared/src/input.rs +++ b/askama_shared/src/input.rs @@ -1,7 +1,7 @@ use path; use std::borrow::Cow; -use std::path::PathBuf; +use std::path::{Path, PathBuf}; use syn; @@ -54,7 +54,7 @@ impl<'a> TemplateMeta<'a> { let attr = attr.unwrap(); let mut source = None; let mut print = Print::None; - let mut escaping = EscapeMode::Html; + let mut escaping = None; let mut ext = None; if let syn::MetaItem::List(_, ref inner) = attr.value { for nm_item in inner { @@ -83,7 +83,7 @@ impl<'a> TemplateMeta<'a> { panic!("print value must be string literal"); }, "escape" => if let syn::Lit::Str(ref s, _) = *val { - escaping = (s.as_ref() as &str).into(); + escaping = Some((s.as_ref() as &str).into()); } else { panic!("escape value must be string literal"); }, @@ -109,6 +109,22 @@ impl<'a> TemplateMeta<'a> { }, _ => {}, } + let escaping = match escaping { + Some(m) => m, + None => { + let ext = match source { + Source::Path(p) => { + Path::new(p).extension().map(|s| s.to_str().unwrap()).unwrap_or("") + }, + Source::Source(_) => ext.unwrap(), // Already panicked if None + }; + if HTML_EXTENSIONS.contains(&ext) { + EscapeMode::Html + } else { + EscapeMode::None + } + } + }; TemplateMeta { source, print, escaping, ext } } } @@ -155,3 +171,5 @@ impl<'a> From<&'a str> for Print { } } } + +const HTML_EXTENSIONS: [&str; 3] = ["html", "htm", "xml"]; |