aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--askama_shared/src/escaping.rs37
1 files changed, 18 insertions, 19 deletions
diff --git a/askama_shared/src/escaping.rs b/askama_shared/src/escaping.rs
index 6390f0c..b967f1f 100644
--- a/askama_shared/src/escaping.rs
+++ b/askama_shared/src/escaping.rs
@@ -43,50 +43,49 @@ where
}
}
-const FLAG: u8 = b'>' - b'"';
-
pub fn escape(s: &str) -> Escaped {
Escaped {
bytes: s.as_bytes(),
}
}
-pub struct Escaped<'a> {
- bytes: &'a [u8],
-}
-
macro_rules! escaping_body {
- ($state:ident, $i:ident, $fmt:ident, $_self:ident, $quote:expr) => {{
- if $state < $i {
- $fmt.write_str(unsafe { str::from_utf8_unchecked(&$_self.bytes[$state..$i]) })?;
+ ($start:ident, $i:ident, $fmt:ident, $_self:ident, $quote:expr) => {{
+ if $start < $i {
+ $fmt.write_str(unsafe { str::from_utf8_unchecked(&$_self.bytes[$start..$i]) })?;
}
$fmt.write_str($quote)?;
- $state = $i + 1;
+ $start = $i + 1;
}};
}
+pub struct Escaped<'a> {
+ bytes: &'a [u8],
+}
+
impl<'a> ::std::fmt::Display for Escaped<'a> {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
- let mut state = 0;
+ let mut start = 0;
for (i, b) in self.bytes.iter().enumerate() {
if b.wrapping_sub(b'"') <= FLAG {
match *b {
- b'<' => escaping_body!(state, i, fmt, self, "&lt;"),
- b'>' => escaping_body!(state, i, fmt, self, "&gt;"),
- b'&' => escaping_body!(state, i, fmt, self, "&amp;"),
- b'"' => escaping_body!(state, i, fmt, self, "&quot;"),
- b'\'' => escaping_body!(state, i, fmt, self, "&#x27;"),
- b'/' => escaping_body!(state, i, fmt, self, "&#x2f;"),
+ b'<' => escaping_body!(start, i, fmt, self, "&lt;"),
+ b'>' => escaping_body!(start, i, fmt, self, "&gt;"),
+ b'&' => escaping_body!(start, i, fmt, self, "&amp;"),
+ b'"' => escaping_body!(start, i, fmt, self, "&quot;"),
+ b'\'' => escaping_body!(start, i, fmt, self, "&#x27;"),
+ b'/' => escaping_body!(start, i, fmt, self, "&#x2f;"),
_ => (),
}
}
}
-
- fmt.write_str(unsafe { str::from_utf8_unchecked(&self.bytes[state..]) })?;
+ fmt.write_str(unsafe { str::from_utf8_unchecked(&self.bytes[start..]) })?;
Ok(())
}
}
+const FLAG: u8 = b'>' - b'"';
+
#[cfg(test)]
mod tests {
use super::*;