diff --git a/src/enums.rs b/src/enums.rs index ac641b5..bae47d0 100644 --- a/src/enums.rs +++ b/src/enums.rs @@ -4,6 +4,7 @@ mod tests; ///The following are the implemented ANSI escape sequences. More to be added. #[derive(Debug, PartialEq)] pub enum AnsiSequence { + Escape, CursorPos(u32, u32), CursorUp(u32), CursorDown(u32), @@ -61,6 +62,7 @@ impl Display for AnsiSequence { use AnsiSequence::*; match self { + Escape => write!(formatter, "\u{1b}"), CursorPos(line, col) => write!(formatter, "[{};{}H", line, col), CursorUp(amt) diff --git a/src/parsers.rs b/src/parsers.rs index 09ab59d..8073ce3 100644 --- a/src/parsers.rs +++ b/src/parsers.rs @@ -51,6 +51,14 @@ named!( ) ); +named!( + escape<&str, AnsiSequence>, + do_parse!( + tag!("\u{1b}") >> + (AnsiSequence::Escape) + ) +); + named!( cursor_up<&str, AnsiSequence>, do_parse!( @@ -244,7 +252,8 @@ tag_parser!(set_single_shift3, "O", AnsiSequence::SetSingleShift3); named!( combined<&str, AnsiSequence>, alt!( - cursor_pos + escape + | cursor_pos | cursor_up | cursor_down | cursor_forward diff --git a/src/parsers/tests.rs b/src/parsers/tests.rs index 9adc546..399ab4a 100644 --- a/src/parsers/tests.rs +++ b/src/parsers/tests.rs @@ -133,3 +133,15 @@ fn test_default_value() { assert_eq!(strings[3], Output::TextBlock("\x1b[7asd;1234H")); assert_eq!(strings[4], Output::TextBlock("\x1b[a;sd7H")); } + +#[test] +fn test_escape() { + let parts: Vec<_> = "\x1b\x1b[33mFoobar".ansi_parse().collect(); + assert_eq!( + parts, + vec![ + Output::Escape(AnsiSequence::Escape), + Output::TextBlock("[33mFoobar") + ] + ); +}