diff --git a/.gitignore b/.gitignore index de30f33a..2cdbd84c 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ .DS_Store result **/generated-* +**/.idea diff --git a/ascii/README.md b/ascii/README.md index 896fe9d9..6ffec13b 100644 --- a/ascii/README.md +++ b/ascii/README.md @@ -1,5 +1,8 @@ # ascii +[![crates.io](https://img.shields.io/crates/v/onefetch-ascii)](https://crates.io/crates/onefetch-ascii) +[![docs.rs](https://img.shields.io/docsrs/onefetch-ascii)](https://docs.rs/onefetch-ascii) + Provides the primary interface to display ascii art to the terminal. More info [here](https://github.com/o2sh/onefetch/wiki/ascii-art). diff --git a/ascii/src/lib.rs b/ascii/src/lib.rs index a247329a..0e880277 100644 --- a/ascii/src/lib.rs +++ b/ascii/src/lib.rs @@ -1,6 +1,52 @@ +//! # onefetch-ascii +//! +//! Provides the ascii template interface for [onefetch](https://github.com/o2sh/onefetch). +//! +//! ```rust,no_run +//! use onefetch_ascii::AsciiArt; +//! use owo_colors::{DynColors, AnsiColors}; +//! +//! const ASCII: &str = r#" +//! {2} .:--::////::--.` +//! {1} `/yNMMNho{2}////////////:. +//! {1} `+NMMMMMMMMmy{2}/////////////:` +//! {0} `-:::{1}ohNMMMMMMMNy{2}/////////////:` +//! {0} .::::::::{1}odMMMMMMMNy{2}/////////////- +//! {0} -:::::::::::{1}/hMMMMMMMmo{2}////////////- +//! {0} .::::::::::::::{1}oMMMMMMMMh{2}////////////- +//! {0}`:::::::::::::{1}/dMMMMMMMMMMNo{2}///////////` +//! {0}-::::::::::::{1}sMMMMMMmMMMMMMMy{2}//////////- +//! {0}-::::::::::{1}/dMMMMMMs{0}:{1}+NMMMMMMd{2}/////////: +//! {0}-:::::::::{1}+NMMMMMm/{0}:::{1}/dMMMMMMm+{2}///////: +//! {0}-::::::::{1}sMMMMMMh{0}:::::::{1}dMMMMMMm+{2}//////- +//! {0}`:::::::{1}sMMMMMMy{0}:::::::::{1}dMMMMMMm+{2}/////` +//! {0} .:::::{1}sMMMMMMs{0}:::::::::::{1}mMMMMMMd{2}////- +//! {0} -:::{1}sMMMMMMy{0}::::::::::::{1}/NMMMMMMh{2}//- +//! {0} .:{1}+MMMMMMd{0}::::::::::::::{1}oMMMMMMMo{2}- +//! {1} `yMMMMMN/{0}:::::::::::::::{1}hMMMMMh. +//! {1} -yMMMo{0}::::::::::::::::{1}/MMMy- +//! {1} `/s{0}::::::::::::::::::{1}o/` +//! {0} ``.---::::---..` +//! "#; +//! +//! let colors = vec![ +//! DynColors::Ansi(AnsiColors::Blue), +//! DynColors::Ansi(AnsiColors::Default), +//! DynColors::Ansi(AnsiColors::BrightBlue) +//! ]; +//! +//! let art = AsciiArt::new(ASCII, colors.as_slice(), true); +//! +//! for line in art { +//! println!("{line}") +//! } +//! ``` +//! + use owo_colors::{AnsiColors, DynColors, OwoColorize, Style}; use std::fmt::Write; +/// Renders an ascii template with the given colors truncated to the correct width. pub struct AsciiArt<'a> { content: Box>, colors: &'a [DynColors], @@ -211,9 +257,10 @@ fn add_styled_segment(base: &mut String, segment: &str, color: DynColors, bold: type ParseResult<'a, R> = Option<(&'a str, R)>; fn token(s: &str, predicate: impl FnOnce(char) -> Option) -> ParseResult { - let token = s.chars().next()?; + let mut chars = s.chars(); + let token = chars.next()?; let result = predicate(token)?; - Some((s.get(1..).unwrap(), result)) + Some((chars.as_str(), result)) } // Parsers @@ -313,6 +360,12 @@ mod test { "\u{1b}[39;1m \u{1b}[0m" ); + // https://github.com/o2sh/onefetch/issues/935 + assert_eq!( + Tokens("███").render(Vec::new().as_slice(), 0, 3, true), + "\u{1b}[39;1m███\u{1b}[0m" + ); + assert_eq!( Tokens(" {1} {5} {9} a").render(&colors_shim, 4, 10, true), "\u{1b}[39;1m\u{1b}[0m\u{1b}[39;1m\u{1b}[0m\u{1b}[39;1m \u{1b}[0m\u{1b}[39;1m a\u{1b}[0m "