Crate stylish_stringlike[][src]

Expand description

This is a libary for creating styled spans of text. The style can be something like an ANSI terminal color/format, or it could be some markup like enclosing text in html tags.

Structure

This crate is subdivided into two modules: text and widget.

text provides string-like functionality for styled pieces of text. Methods such as replacing, slicing, and splitting are supported while respecting existing style delimiters.

widget provides functionality for displaying text objects in useful ways, such as truncation with a symbol, or repeating a sequence.

Usage

use std::borrow::Cow;
use stylish_stringlike::text::{Joinable, Paintable, Pushable, Replaceable, Sliceable, Span,
    Spans, Tag};
use stylish_stringlike::widget::{Fitable, HBox, TextWidget, TruncationStyle};

let italic = Tag::new("<i>", "</i>");
let bold = Tag::new("<b>", "</b>");
let underline = Tag::new("<u>", "</u>");

let foo: Span<Tag> = Span::new(Cow::Borrowed(&italic), Cow::Borrowed("foo"));
let bar: Span<Tag> = Span::new(Cow::Borrowed(&bold), Cow::Borrowed("bar"));

// Spans of different styles can be joined together.
let foobar = foo.join(&bar);
assert_eq!(format!("{}", foobar), "<i>foo</i><b>bar</b>");

// Perform literal string replacement with the `replace` method.
let foobaz = foobar.replace("bar", "baz");
assert_eq!(format!("{}", foobaz), "<i>foo</i><b>baz</b>");

let mut buz: Spans<Tag> = Default::default();
buz.push(&Span::new(Cow::Borrowed(&underline), Cow::Borrowed("buz")));

// Replace text with styled text objects instead of string literals.
let foobuz = foobar.replace("bar", &buz);
assert_eq!(format!("{}", foobuz), "<i>foo</i><u>buz</u>");

// Use the `slice` method to slice on bytes.
let foob = foobar.slice(..4).unwrap();
assert_eq!(format!("{}", foob), "<i>foo</i><b>b</b>");

// Use the `HBox` widget to truncate multiple spans of text to fit in a desired width.
fn make_spans(style: &Tag, text: &str) -> Spans<Tag> {
    let mut spans: Spans<Tag> = Default::default();
    let span: Span<Tag> = Span::new(Cow::Borrowed(style), Cow::Borrowed(text));
    spans = spans.join(&span);
    spans
}
let truncation = TruncationStyle::Inner(Some(Span::new(
    Cow::Borrowed(&underline),
    Cow::Borrowed("…"),
)));
let spans = vec![make_spans(&italic, "abcdefg"), make_spans(&bold, "12345678")];
let hbox = spans
    .iter()
    .map(|s| {
        let b: Box<dyn Fitable<_>> =
            Box::new(TextWidget::<Spans<_>, TruncationStyle<_>>::new(
                Cow::Borrowed(s),
                Cow::Borrowed(&truncation),
            ));
        b
    })
    .collect::<HBox<_>>();
assert_eq!(
    format!("{}", hbox.truncate(10)),
    "<i>ab</i><u>…</u><i>fg</i><b>12</b><u>…</u><b>78</b>"
);

Modules

text

Provides the primary text object, Spans, which is a sequence of styled spans, as well as traits providing support for string-like methods on structs.

widget

Provides some widgets for displaying text objects in the crate::text module.