minify_html_common/
whitespace.rs

1use crate::gen::codepoints::WHITESPACE;
2
3pub fn trimmed(val: &[u8]) -> &[u8] {
4  let mut start = 0;
5  while val.get(start).filter(|&&c| WHITESPACE[c]).is_some() {
6    start += 1;
7  }
8
9  let mut end = val.len();
10  while end > start && val.get(end - 1).filter(|&&c| WHITESPACE[c]).is_some() {
11    end -= 1;
12  }
13
14  &val[start..end]
15}
16
17pub fn left_trim(val: &mut Vec<u8>) {
18  let mut len = 0;
19  while val.get(len).filter(|&&c| WHITESPACE[c]).is_some() {
20    len += 1;
21  }
22  val.drain(0..len);
23}
24
25pub fn right_trim(val: &mut Vec<u8>) {
26  let mut retain = val.len();
27  while retain > 0 && val.get(retain - 1).filter(|&&c| WHITESPACE[c]).is_some() {
28    retain -= 1;
29  }
30  val.truncate(retain);
31}
32
33pub fn collapse_whitespace(val: &mut Vec<u8>) {
34  let mut write = 0;
35  let mut in_whitespace = false;
36  for i in 0..val.len() {
37    let mut c = val[i];
38    if WHITESPACE[c] {
39      if in_whitespace {
40        // Skip this character.
41        continue;
42      };
43      in_whitespace = true;
44      c = b' ';
45    } else {
46      in_whitespace = false;
47    };
48    val[write] = c;
49    write += 1;
50  }
51  val.truncate(write);
52}
53
54pub fn remove_all_whitespace(val: &mut Vec<u8>) {
55  let mut write = 0;
56  for i in 0..val.len() {
57    let c = val[i];
58    if WHITESPACE[c] {
59      // Skip this character.
60      continue;
61    };
62    val[write] = c;
63    write += 1;
64  }
65  val.truncate(write);
66}
67
68pub fn is_all_whitespace(val: &[u8]) -> bool {
69  for &c in val {
70    if !WHITESPACE[c] {
71      return false;
72    };
73  }
74  true
75}