From c5f8eea2c5834b560360b8bf5ba88378d8c16b88 Mon Sep 17 00:00:00 2001 From: atagen Date: Tue, 3 Dec 2024 14:28:08 +1100 Subject: [PATCH] fix ansi parsing encapsulation --- lib/ansi.ml | 11 +++++++---- lib/parse.ml | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/ansi.ml b/lib/ansi.ml index 9f766a0..5038cf3 100644 --- a/lib/ansi.ml +++ b/lib/ansi.ml @@ -37,8 +37,6 @@ let ansi_sgr = let capture_ansi = both ansi_values ansi_sgr -let ansi_parse = - ansi_escape *> capture_ansi type parser_state_colour = ParsingFg | ParsingBg @@ -94,8 +92,13 @@ let parse_ansi_intermediate (codes, terminator) : chunk = in Ansi final +let raw_ansi_parse = + ansi_escape *> capture_ansi + +let ansi_parse = raw_ansi_parse >>| parse_ansi_intermediate + let%test "ansi_parse" = - parse_string ~consume:Angstrom.Consume.Prefix ansi_parse "\x1b[35;23;12m" + parse_string ~consume:Angstrom.Consume.Prefix raw_ansi_parse "\x1b[35;23;12m" |> function | Ok (d, t) -> d = [ 35; 23; 12 ] && t = Some 'm' | _ -> false @@ -108,7 +111,7 @@ let%test "ansi_intermediate_parse" = let%test "ansi_full" = let final = - parse_string ~consume:Angstrom.Consume.Prefix ansi_parse + parse_string ~consume:Angstrom.Consume.Prefix raw_ansi_parse "\x1b[38;5;25;24;23;1;0m" |> function | Ok (raw, term) -> parse_ansi_intermediate (raw, term) diff --git a/lib/parse.ml b/lib/parse.ml index 6ee26c5..1e25f93 100644 --- a/lib/parse.ml +++ b/lib/parse.ml @@ -8,7 +8,7 @@ let is_text c = not (is_sep c || is_delim c || c = '\x1b') let sep = take_while is_sep >>| fun s -> Separator s let delim = take_while is_delim >>| fun s -> Delimiter s let text = take_while is_text >>| fun s -> Text s -let ansi = Ansi.ansi_parse >>| Ansi.parse_ansi_intermediate +let ansi = Ansi.ansi_parse let culr_parse = peek_char_fail >>= function