aboutsummaryrefslogtreecommitdiffstats
path: root/askama_shared/src/escaping.rs
diff options
context:
space:
mode:
authorLibravatar Dirkjan Ochtman <dirkjan@ochtman.nl>2017-09-04 20:32:48 +0200
committerLibravatar Dirkjan Ochtman <dirkjan@ochtman.nl>2017-09-04 20:37:12 +0200
commitadda8de2cdd164011eb576397212e86110694574 (patch)
tree525301225d5e52985ad8e0059c46a6229df61051 /askama_shared/src/escaping.rs
parentfdbe45ec60d628a014a1414b1ea8588ba4f9573c (diff)
downloadaskama-adda8de2cdd164011eb576397212e86110694574.tar.gz
askama-adda8de2cdd164011eb576397212e86110694574.tar.bz2
askama-adda8de2cdd164011eb576397212e86110694574.zip
Escape all strings with character entities by default (fixes #23)
Diffstat (limited to 'askama_shared/src/escaping.rs')
-rw-r--r--askama_shared/src/escaping.rs43
1 files changed, 43 insertions, 0 deletions
diff --git a/askama_shared/src/escaping.rs b/askama_shared/src/escaping.rs
index 54f58e4..ed4b3d7 100644
--- a/askama_shared/src/escaping.rs
+++ b/askama_shared/src/escaping.rs
@@ -1,3 +1,46 @@
+use std::fmt::{self, Display, Formatter};
+
+
+#[derive(Debug, PartialEq)]
+pub enum MarkupDisplay<T> where T: Display {
+ Safe(T),
+ Unsafe(T),
+}
+
+impl<T> MarkupDisplay<T> where T: Display {
+ pub fn mark_safe(self) -> MarkupDisplay<T> {
+ match self {
+ MarkupDisplay::Unsafe(t) => MarkupDisplay::Safe(t),
+ _ => { self },
+ }
+ }
+ pub fn unsafe_string(&self) -> String {
+ match *self {
+ MarkupDisplay::Safe(ref t) | MarkupDisplay::Unsafe(ref t) => format!("{}", t)
+ }
+ }
+}
+
+impl<T> From<T> for MarkupDisplay<T> where T: Display {
+ fn from(t: T) -> MarkupDisplay<T> {
+ MarkupDisplay::Unsafe(t)
+ }
+}
+
+impl<T> Display for MarkupDisplay<T> where T: Display {
+ fn fmt(&self, f: &mut Formatter) -> fmt::Result {
+ match *self {
+ MarkupDisplay::Unsafe(_) => {
+ write!(f, "{}", escape(self.unsafe_string()))
+ },
+ MarkupDisplay::Safe(ref t) => {
+ t.fmt(f)
+ },
+ }
+ }
+}
+
+
fn escapable(b: &u8) -> bool {
*b == b'<' || *b == b'>' || *b == b'&'
}