summaryrefslogtreecommitdiffstats
path: root/src/preprocessor.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/preprocessor.rs')
-rw-r--r--src/preprocessor.rs32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/preprocessor.rs b/src/preprocessor.rs
index 02d1b289..dc2aa66e 100644
--- a/src/preprocessor.rs
+++ b/src/preprocessor.rs
@@ -136,6 +136,27 @@ pub fn replace_nonprintable(
output
}
+/// Strips ANSI escape sequences from the input.
+pub fn strip_ansi(line: &str) -> String {
+ let mut buffer = String::with_capacity(line.len());
+
+ for seq in EscapeSequenceOffsetsIterator::new(line) {
+ if let EscapeSequenceOffsets::Text { .. } = seq {
+ buffer.push_str(&line[seq.index_of_start()..seq.index_past_end()]);
+ }
+ }
+
+ buffer
+}
+
+#[derive(Debug, PartialEq, Clone, Copy, Default)]
+pub enum StripAnsiMode {
+ #[default]
+ Never,
+ Always,
+ Auto,
+}
+
#[test]
fn test_try_parse_utf8_char() {
assert_eq!(try_parse_utf8_char(&[0x20]), Some((' ', 1)));
@@ -179,3 +200,14 @@ fn test_try_parse_utf8_char() {
assert_eq!(try_parse_utf8_char(&[0xef, 0x20]), None);
assert_eq!(try_parse_utf8_char(&[0xf0, 0xf0]), None);
}
+
+#[test]
+fn test_strip_ansi() {
+ // The sequence detection is covered by the tests in the vscreen module.
+ assert_eq!(strip_ansi("no ansi"), "no ansi");
+ assert_eq!(strip_ansi("\x1B[33mone"), "one");
+ assert_eq!(
+ strip_ansi("\x1B]1\x07multiple\x1B[J sequences"),
+ "multiple sequences"
+ );
+}