pub struct EscapeSequenceCleaner {
partial_line: String
}
impl Default for EscapeSequenceCleaner {
fn default() -> Self { Self::new() }
}
impl EscapeSequenceCleaner {
pub fn new() -> Self {
Self {
partial_line: String::new()
}
}
pub fn process_line(&mut self, mut line: String) -> Option<String> {
if line.starts_with("\u{1b}[J\u{1b}[H") {
line = line.replace("\u{1b}[J\u{1b}[H", "");
if line.is_empty() {
return None;
}
}
if line.starts_with("\u{1b}[H") {
line = line.replace("\u{1b}[H", "");
if line.is_empty() {
return None;
}
}
if line.ends_with("\u{1b}[K") {
line = line.replace("\u{1b}[K", "").trim().to_string();
}
if line.trim().is_empty() {
return None;
}
if !line.starts_with('{') && !self.partial_line.is_empty() {
self.partial_line.push_str(&line);
line = self.partial_line.clone();
self.partial_line.clear();
} else if line.starts_with('{') && !line.ends_with('}') {
self.partial_line = line;
return None;
} else if !self.partial_line.is_empty() {
self.partial_line.push_str(&line);
line = self.partial_line.clone();
self.partial_line.clear();
}
if !line.starts_with('{') || !line.ends_with('}') {
return None;
}
Some(line)
}
pub fn is_screen_clear_event(line: &str) -> bool { line.starts_with("\u{1b}[J\u{1b}[H") }
}