pub fn ansi_substr(source: &str, start: usize, end: usize) -> String {
let mut output = String::new();
let mut escaped = false;
let mut index = 0;
for character in source.chars() {
if character == '\u{1B}' {
escaped = true;
output.push(character);
}
if escaped {
output.push(character);
if character == 'm' { escaped = false; }
}
else {
if index < start {
index += 1;
continue;
}
output.push(character);
index += 1;
if index > end { break; }
}
}
output
}
pub fn ansi_len(source: &str) -> usize {
let mut output = 0;
let mut escaped = false;
for character in source.chars() {
if character == '\u{1B}' { escaped = true; }
if !escaped { output += 1; }
else if character == 'm' { escaped = false; }
}
output
}