use std::fmt::Write;
pub struct StringEscaper<'a, W: Write> {
w: &'a mut W,
}
impl<'a, W: Write> StringEscaper<'a, W> {
pub fn new(w: &'a mut W) -> Self {
Self { w }
}
}
impl<'a, W: Write> Write for StringEscaper<'a, W> {
fn write_str(&mut self, s: &str) -> std::fmt::Result {
for c in s.chars() {
match c {
'"' => write!(self.w, "\\\"")?,
'\'' => write!(self.w, "\\\'")?,
'\\' => write!(self.w, "\\\\")?,
'\r' => write!(self.w, "\\r")?,
'\n' => write!(self.w, "\\n")?,
'\t' => write!(self.w, "\\t")?,
_ => write!(self.w, "{}", c)?,
};
}
Ok(())
}
}
pub struct HtmlEscaper<'a, W: Write> {
w: &'a mut W,
}
impl<'a, W: Write> HtmlEscaper<'a, W> {
pub fn new(w: &'a mut W) -> Self {
Self { w }
}
}
impl<'a, W: Write> Write for HtmlEscaper<'a, W> {
fn write_str(&mut self, s: &str) -> std::fmt::Result {
for c in s.chars() {
match c {
'<' => write!(self.w, "<")?,
'>' => write!(self.w, ">")?,
'&' => write!(self.w, "&")?,
'\n' => write!(self.w, "<br>")?,
_ => write!(self.w, "{}", c)?,
};
}
Ok(())
}
}