[![Build Status](https://travis-ci.com/kurtlawrence/cansi.svg?branch=master)](https://travis-ci.com/kurtlawrence/cansi)
[![Latest Version](https://img.shields.io/crates/v/cansi.svg)](https://crates.io/crates/cansi)
[![Rust Documentation](https://img.shields.io/badge/api-rustdoc-blue.svg)](https://docs.rs/cansi)
[![codecov](https://codecov.io/gh/kurtlawrence/cansi/branch/master/graph/badge.svg)](https://codecov.io/gh/kurtlawrence/cansi)
# **C**atergorise **ANSI** - ANSI escape code parser and categoriser
See the [rs docs.](https://docs.rs/cansi/)
Look at progress and contribute on [github.](https://github.com/kurtlawrence/cansi)
`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`](https://crates.io/crates/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](https://en.wikipedia.org/wiki/ANSI_escape_code)).
```rust
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, ",
start: 0,
end: 7,
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",
start: 15,
end: 16,
fg_colour: Color::White,
bg_colour: Color::Red,
intensity: Intensity::Normal,
italic: false,
underline: false,
blink: false,
reversed: false,
hidden: false,
strikethrough: false
}
);
```
## Targeting no_std
This crate can use `alloc` in place of the standard library for no_std targets.
The standard library is enabled by default, so disabling default features and enabling the
`alloc` feature is required to use the crate this way.
```toml
[dependencies]
cansi = { version = "2.1.0", default-features = false, features = ["alloc"] }
```