1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
pub mod str {
use std::io::{Result, Write};
#[derive(Debug)]
pub struct StringWriter {
buf: Vec<u8>,
}
impl Default for StringWriter {
fn default() -> Self {
Self::new()
}
}
impl StringWriter {
pub fn new() -> StringWriter {
StringWriter {
buf: Vec::with_capacity(8 * 1024),
}
}
pub fn into_string(self) -> String {
if let Ok(s) = String::from_utf8(self.buf) {
s
} else {
String::new()
}
}
}
impl Write for StringWriter {
fn write(&mut self, buf: &[u8]) -> Result<usize> {
self.buf.extend_from_slice(buf);
Ok(buf.len())
}
fn flush(&mut self) -> Result<()> {
Ok(())
}
}
/// See https://github.com/handlebars-lang/handlebars.js/blob/37411901da42200ced8e1a7fc2f67bf83526b497/lib/handlebars/utils.js#L1
pub fn escape_html(s: &str) -> String {
let mut output = String::new();
for c in s.chars() {
match c {
'<' => output.push_str("<"),
'>' => output.push_str(">"),
'"' => output.push_str("""),
'&' => output.push_str("&"),
'\'' => output.push_str("'"),
'`' => output.push_str("`"),
'=' => output.push_str("="),
_ => output.push(c),
}
}
output
}
#[cfg(test)]
mod test {
use crate::support::str::StringWriter;
use std::io::Write;
#[test]
fn test_string_writer() {
let mut sw = StringWriter::new();
let _ = sw.write("hello".to_owned().into_bytes().as_ref());
let _ = sw.write("world".to_owned().into_bytes().as_ref());
let s = sw.into_string();
assert_eq!(s, "helloworld".to_string());
}
}
}
|