diff options
author | Dirkjan Ochtman <dirkjan@ochtman.nl> | 2019-01-10 17:20:18 +0100 |
---|---|---|
committer | Juan Aguilar <mhpoin@gmail.com> | 2019-01-12 09:16:20 +0100 |
commit | 2dfc3a39eb4943eb5e320c631e7ae9e50ec6357d (patch) | |
tree | 696155c1b50f67e4e19e39eb3298baf6171c9b57 /askama_derive/src | |
parent | 467f4ade19fa34983de7e6f6d81c6b4d5ff140fe (diff) | |
download | askama-2dfc3a39eb4943eb5e320c631e7ae9e50ec6357d.tar.gz askama-2dfc3a39eb4943eb5e320c631e7ae9e50ec6357d.tar.bz2 askama-2dfc3a39eb4943eb5e320c631e7ae9e50ec6357d.zip |
Allow configuration of escape modes
Diffstat (limited to 'askama_derive/src')
-rw-r--r-- | askama_derive/src/generator.rs | 4 | ||||
-rw-r--r-- | askama_derive/src/input.rs | 27 |
2 files changed, 20 insertions, 11 deletions
diff --git a/askama_derive/src/generator.rs b/askama_derive/src/generator.rs index f6c83ec..955d588 100644 --- a/askama_derive/src/generator.rs +++ b/askama_derive/src/generator.rs @@ -738,7 +738,7 @@ impl<'a> Generator<'a> { Wrapped => expr_buf.buf, Unwrapped => format!( "::askama::MarkupDisplay::new_unsafe(&{}, {})", - expr_buf.buf, self.input.escaping + expr_buf.buf, self.input.escaper ), }; @@ -879,7 +879,7 @@ impl<'a> Generator<'a> { if name == "escape" || name == "safe" || name == "e" || name == "json" { buf.write(&format!( "::askama::filters::{}({}, &", - name, self.input.escaping + name, self.input.escaper )); } else if filters::BUILT_IN_FILTERS.contains(&name) { buf.write(&format!("::askama::filters::{}(&", name)); diff --git a/askama_derive/src/input.rs b/askama_derive/src/input.rs index b584298..0cc852c 100644 --- a/askama_derive/src/input.rs +++ b/askama_derive/src/input.rs @@ -15,7 +15,7 @@ pub struct TemplateInput<'a> { pub syntax: &'a Syntax<'a>, pub source: Source, pub print: Print, - pub escaping: &'a str, + pub escaper: &'a str, pub ext: Option<String>, pub parent: Option<&'a syn::Type>, pub path: PathBuf, @@ -165,24 +165,33 @@ impl<'a> TemplateInput<'a> { }, ); - let escaping = escaping.unwrap_or_else(|| { + // Match extension against defined output formats + + let extension = escaping.unwrap_or_else(|| { path.extension() .map(|s| s.to_str().unwrap()) - .unwrap_or("none") + .unwrap_or("") .to_string() }); - let escaping = match escaping.as_str() { - "html" | "htm" | "xml" => "::askama::Html", - "txt" | "none" => "::askama::Text", - val => panic!("unknown value '{}' for escape mode", val), - }; + + let mut escaper = None; + for (extensions, path) in &config.escapers { + if extensions.contains(&extension) { + escaper = Some(path); + break; + } + } + + let escaper = escaper.unwrap_or_else(|| { + panic!("no escaper defined for extension '{}'", extension); + }); TemplateInput { ast, config, source, print, - escaping, + escaper, ext, parent, path, |