#nom #parser #ansi

no-std ansi-parser

A library using nom for parsing ANSI Escape Codes

18 releases

0.9.1 May 19, 2024
0.8.0 Apr 25, 2021
0.7.0 Oct 5, 2020
0.6.5 May 10, 2019

#243 in Parser implementations

Download history 914/week @ 2024-07-13 1290/week @ 2024-07-20 1511/week @ 2024-07-27 1186/week @ 2024-08-03 1215/week @ 2024-08-10 1338/week @ 2024-08-17 1219/week @ 2024-08-24 1413/week @ 2024-08-31 1143/week @ 2024-09-07 995/week @ 2024-09-14 953/week @ 2024-09-21 1280/week @ 2024-09-28 948/week @ 2024-10-05 999/week @ 2024-10-12 981/week @ 2024-10-19 761/week @ 2024-10-26

3,881 downloads per month
Used in 22 crates (16 directly)

MPL-2.0 license

26KB
588 lines

pipeline status docs deps license downloads

Ansi Escape Sequence Parser

For a complete list of implemented sequences, see the documentation.

This is done through a pulldown type parser, where an iterator is exposed. This essentially turns all of the ANSI sequences into enums and splits the string at every location that there was an ANSI Sequence.

Example:

use ansi_parser::{Output, AnsiParser};
use ansi_parser::AnsiSequence;

fn main() {
    //Parse the first two blocks in the list
    //By parsing it this way, it allows you to iterate over the
    //elements returned.
    //
    //The parser only every holds a reference to the data,
    //so there is no allocation.
    let parsed: Vec<Output> = "This is \u{1b}[3Asome text!"
        .ansi_parse()
        .take(2)
        .collect();

    assert_eq!(
        vec![
            Output::TextBlock("This is "),
            Output::Escape(AnsiSequence::CursorUp(3))
        ],
        parsed
    );

    for block in parsed.into_iter() {
        match block {
            Output::TextBlock(text) => println!("{}", text),
            Output::Escape(seq)     => println!("{}", seq)
        }
    }
}

no_std support

no_std is supported via disabling the std feature in your Cargo.toml.

Dependencies

~1.5MB
~28K SLoC