aboutsummaryrefslogtreecommitdiffstats
path: root/askama_shared
diff options
context:
space:
mode:
Diffstat (limited to 'askama_shared')
-rw-r--r--askama_shared/src/input.rs24
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"];