pub fn detect_whitespace(orig: &str, pos: usize) -> usize {
let len = orig.len();
if pos >= len || !orig.is_char_boundary(pos) { return pos }
let mut i = pos;
while i < len {
let c = get_aot(orig, i);
if c == " " || c == "\n" || c == "\t" || c == "\r" || c == "\u{000B}" || c == "\u{000C}" { i += 1; continue }
if c != "~" { return i }
if i >= len - 1 { return i }
let mut j = i + 1;
while !orig.is_char_boundary(j) { j += 1 }
let c = &orig[i..j];
if c == "~" { return i }
if c == "\u{0085}" || c == "\u{200E}" || c == "\u{200F}" || c == "\u{2028}" || c == "\u{2029}" { i = j; continue }
return i;
}
len
}
fn get_aot(orig: &str, p: usize) -> &str { orig.get(p..p+1).unwrap_or("~") }
#[cfg(test)]
mod tests {
use super::detect_whitespace as detect;
#[test]
fn detect_whitespace_correct() {
let orig = "~abc \t\nxyz~";
assert_eq!(detect(orig, 3), 3); assert_eq!(detect(orig, 4), 7); assert_eq!(detect(orig, 5), 7); assert_eq!(detect(orig, 6), 7); assert_eq!(detect(orig, 7), 7);
assert_eq!(detect("\u{0000}", 0), 0); assert_eq!(detect("\u{0009}", 0), 1); assert_eq!(detect("\u{000A}", 0), 1); assert_eq!(detect("\u{000B}", 0), 1); assert_eq!(detect("\u{000C}", 0), 1); assert_eq!(detect("\u{000D}", 0), 1); assert_eq!(detect("\u{0020}", 0), 1); assert_eq!(detect("\u{0085}", 0), 2); assert_eq!(detect("\u{00A0}", 0), 0); assert_eq!(detect("\u{200E}", 0), 3); assert_eq!(detect("\u{200F}", 0), 3); assert_eq!(detect("\u{2028}", 0), 3); assert_eq!(detect("\u{2029}", 0), 3); let orig = "\u{0000}\u{0009}\u{000A}\u{000B}\u{000C}\u{000D}\u{0020}\u{0085}";
assert_eq!(detect(orig, 0), 0); assert_eq!(detect(orig, 1), 9); let orig = "\u{00A0}\u{200E}\u{200F}\u{2028}\u{2029}";
assert_eq!(detect(orig, 0), 0); assert_eq!(detect(orig, 2), 14);
let orig = "xyz~ \n";
assert_eq!(detect(orig, 2), 2); assert_eq!(detect(orig, 3), 3); assert_eq!(detect(orig, 4), 6); assert_eq!(detect(orig, 5), 6); }
#[test]
fn detect_whitespace_will_not_panic() {
assert_eq!(detect("", 0), 0); assert_eq!(detect("~", 0), 0); assert_eq!(detect("\n", 0), 1); assert_eq!(detect("abc", 2), 2); assert_eq!(detect("abc", 3), 3); assert_eq!(detect("abc", 4), 4); assert_eq!(detect("abc", 100), 100); let orig = "\u{00A0}\u{200E}\u{200F}\u{2028}\u{2029}";
assert_eq!(detect(orig, 1), 1); assert_eq!(detect("€", 1), 1); assert_eq!(detect(" €", 0), 1); assert_eq!(detect("\u{2029}€", 0), 3); }
}