aboutsummaryrefslogtreecommitdiffstats
path: root/askama_shared
diff options
context:
space:
mode:
authorLibravatar Dirkjan Ochtman <dirkjan@ochtman.nl>2019-01-10 17:20:18 +0100
committerLibravatar Juan Aguilar <mhpoin@gmail.com>2019-01-12 09:16:20 +0100
commit2dfc3a39eb4943eb5e320c631e7ae9e50ec6357d (patch)
tree696155c1b50f67e4e19e39eb3298baf6171c9b57 /askama_shared
parent467f4ade19fa34983de7e6f6d81c6b4d5ff140fe (diff)
downloadaskama-2dfc3a39eb4943eb5e320c631e7ae9e50ec6357d.tar.gz
askama-2dfc3a39eb4943eb5e320c631e7ae9e50ec6357d.tar.bz2
askama-2dfc3a39eb4943eb5e320c631e7ae9e50ec6357d.zip
Allow configuration of escape modes
Diffstat (limited to 'askama_shared')
-rw-r--r--askama_shared/src/lib.rs57
1 files changed, 57 insertions, 0 deletions
diff --git a/askama_shared/src/lib.rs b/askama_shared/src/lib.rs
index a0c9321..0daad1b 100644
--- a/askama_shared/src/lib.rs
+++ b/askama_shared/src/lib.rs
@@ -4,6 +4,7 @@ extern crate serde_derive;
use toml;
+use std::collections::HashSet;
use std::env;
use std::fs;
use std::path::{Path, PathBuf};
@@ -23,6 +24,7 @@ pub struct Config<'a> {
pub dirs: Vec<PathBuf>,
pub syntaxes: BTreeMap<String, Syntax<'a>>,
pub default_syntax: &'a str,
+ pub escapers: Vec<(HashSet<String>, String)>,
}
impl<'a> Config<'a> {
@@ -63,10 +65,28 @@ impl<'a> Config<'a> {
panic!("default syntax \"{}\" not found", default_syntax)
}
+ let mut escapers = Vec::new();
+ if let Some(configured) = raw.escaper {
+ for escaper in configured {
+ escapers.push((
+ escaper
+ .extensions
+ .iter()
+ .map(|ext| ext.to_string())
+ .collect(),
+ escaper.path.to_string(),
+ ));
+ }
+ }
+ for (extensions, path) in DEFAULT_ESCAPERS {
+ escapers.push((str_set(extensions), path.to_string()));
+ }
+
Config {
dirs,
syntaxes,
default_syntax,
+ escapers,
}
}
@@ -156,6 +176,7 @@ struct RawConfig<'d> {
#[serde(borrow)]
general: Option<General<'d>>,
syntax: Option<Vec<RawSyntax<'d>>>,
+ escaper: Option<Vec<RawEscaper<'d>>>,
}
#[derive(Deserialize)]
@@ -176,6 +197,12 @@ struct RawSyntax<'a> {
comment_end: Option<&'a str>,
}
+#[derive(Deserialize)]
+struct RawEscaper<'a> {
+ path: &'a str,
+ extensions: Vec<&'a str>,
+}
+
pub fn read_config_file() -> String {
let root = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());
let filename = root.join(CONFIG_FILE_NAME);
@@ -187,8 +214,19 @@ pub fn read_config_file() -> String {
}
}
+fn str_set<T>(vals: &[T]) -> HashSet<String>
+where
+ T: ToString,
+{
+ vals.iter().map(|s| s.to_string()).collect()
+}
+
static CONFIG_FILE_NAME: &str = "askama.toml";
static DEFAULT_SYNTAX_NAME: &str = "default";
+static DEFAULT_ESCAPERS: &[(&[&str], &str)] = &[
+ (&["html", "htm", "xml"], "::askama::Html"),
+ (&["none", "txt", ""], "::askama::Text"),
+];
#[cfg(test)]
mod tests {
@@ -350,4 +388,23 @@ mod tests {
let _config = Config::new(raw_config);
}
+
+ #[test]
+ fn escape_modes() {
+ let config = Config::new(
+ r#"
+ [[escaper]]
+ path = "::askama::Js"
+ extensions = ["js"]
+ "#,
+ );
+ assert_eq!(
+ config.escapers,
+ vec![
+ (str_set(&["js"]), "::askama::Js".into()),
+ (str_set(&["html", "htm", "xml"]), "::askama::Html".into()),
+ (str_set(&["none", "txt", ""]), "::askama::Text".into()),
+ ]
+ );
+ }
}