#ansi #parsing #terminal

cansi

Catergorise ANSI - ANSI escape code parser and categoriser

4 stable releases

✓ Uses Rust 2018 edition

2.0.0 May 15, 2019
1.1.1 Mar 12, 2019
1.0.0 Dec 31, 2018

#110 in Parser tooling

49 downloads per month

MIT license

36KB
649 lines

cansi

Build Status Latest Version Rust Documentation codecov

Catergorise ANSI - ANSI escape code parser and categoriser

See the rs docs. Look at progress and contribute on github.

cansi will parse text with ANSI escape sequences in it and return a deconstructed text with metadata around the colouring and styling. cansi is only concerned with CSI sequences, particuarly the SGR parameters. cansi will not construct escaped text, there are crates such as colored that do a great job of colouring and styling text.

Example usage

This example was done using the colored crate to help with constructing the escaped text string. It will work with other tools that inject escape sequences into text strings (given they follow ANSI specification).

extern crate cansi;
extern crate colored;

use cansi::*;
use colored::Colorize;
use std::io::Write;

let v = &mut Vec::new();
write!(
  v,
  "Hello, {}{}{}{}{}{}",
  "w".white().on_red(),
  "o".cyan().on_green(),
  "r".magenta().on_yellow(),
  "l".blue().on_white(),
  "d".yellow().on_bright_cyan(),
  "!".bright_red().on_bright_yellow(),
)
.unwrap();

let text = String::from_utf8_lossy(&v);
let result = categorise_text(&text); // cansi function

assert_eq!(result.len(), 7); // there should be seven differently styled components

assert_eq!("Hello, world!", &construct_text_no_codes(&result));

// 'Hello, ' is just defaults
assert_eq!(
  result[0],
  CategorisedSlice {
    text: "Hello, ",
    fg_colour: Color::White,
    bg_colour: Color::Black,
    intensity: Intensity::Normal,
    italic: false,
    underline: false,
    blink: false,
    reversed: false,
    hidden: false,
    strikethrough: false
  }
);

// 'w' is coloured differently
assert_eq!(
  result[1],
  CategorisedSlice {
    text: "w",
    fg_colour: Color::White,
    bg_colour: Color::Red,
    intensity: Intensity::Normal,
    italic: false,
    underline: false,
    blink: false,
    reversed: false,
    hidden: false,
    strikethrough: false
  }
);

No runtime deps