aboutsummaryrefslogtreecommitdiffstats
path: root/askama_shared/src/escaping.rs
diff options
context:
space:
mode:
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'&'
}