#terminal-text #escaping #ansi #bright #output #codes #command-line

terminal-text-styler

用于创建ANSI转义码以生成终端输出的样式化文本的库

1 个不稳定版本

0.1.0 2020年11月1日

#718 in 命令行界面


用于taskerctl

GPL-2.0-or-later

40KB
652 代码行,不包括注释

Terminal Text Styler

如果您正在使用Rust构建命令行工具,您可能会发现使用一种样式突出显示输出很有用。这样做,简单来说就是将您的文本包裹在必要的ANSI转义码中。

ANSI颜色 正常 粗体 带背景
黑色 0;30 1;30 0;40
红色 0;31 1;31 0;41
绿色 0;32 1;31 0;42
黄色 0;33 1;31 0;43
蓝色 0;34 1;31 0;44
品红色 0;35 1;31 0;45
青色 0;36 1;31 0;46
白色 0;37 1;31 0;47
亮黑色 0;90 1;31 0;100
亮红色 0;91 1;31 0;101
亮绿色 0;92 1;31 0;102
亮黄色 0;93 1;31 0;103
亮蓝色 0;94 1;31 0;104
亮紫色 0;95 1;95 0;105
亮青色 0;96 1;96 0;106
亮白色 0;97 1;97 0;107

例如

RED='\033[0;31m'
NC='\033[0m' # No Color
printf "I ${RED}love${NC} Stack Overflow\n"

来源: StackOverflow

在Rust中,我们可以用unicode "\u{001B}"替换'\033'(来源: StackOverflow)。

因此,我们可以通过在我们的文本中放置开始该颜色的转义码,并使用无颜色转义码来结束它,来切换到所需颜色。就是这样!所以,为了将我们的文本突出显示为黄色,我们只需这样做

let greeting = r"\u{001B}[0;31mHello, World!\u{001B}[0m";
println!("{}", greeting);

但是,这有点麻烦且难以阅读。这就是这个包的作用。

TerminalStyle

使用TerminalStyle结构体,我们可以通过提供ANSI转义码或使用提供的枚举构建样式来构建颜色。

use terminal_text_styler::{TerminalStyle, SGREffect, ANSIForegroundColor};

// Manual with codes
let yellow_manual = TerminalStyle::from(vec![0, 93]);

// Using enums
let yellow = TerminalStyle::new(vec![SGREffect::Normal], Some(ANSIForegroundColor::BrightYellow), None);
let no_color = TerminalStyle::new_empty(); // Initialize without input parameters for no color
assert_eq!(yellow.command(), "\u{001B}[0;93m");
assert_eq!(no_color.command(), "\u{001B}[0m");
assert_eq!(yellow.wrap("Hello, World!"), "\u{001B}[0;93mHello, World!\u{001B}[0m");

现在,当放置在字符串中(或通过访问command方法)时,TerminalStyle实例将生成ANSI转义码字符串

println!("{}Hello, World!{}", yellow, no_color));

这要好得多,但我们还可以让它更简单。我们可以调用wrap方法来将给定文本包裹在该颜色中。

println!("{} Blah blah blah...", yellow.wrap("Hello, World!"));

预设

为了方便起见,TerminalStyle提供了一些静态预设

let yellow = TerminalStyle::bright_yellow();
let red = TerminalStyle::red();
// Etc...

StyledTerminalText

StyledTerminalText》结构体基于wrap命令,将重点重新放在您的文本上,而不是颜色上。《StyledTerminalText》实例可以直接放入String(或通过访问output属性将其转换为String

use terminal_text_styler::{StyledTerminalText, TerminalStyle};

let greeting = StyledTerminalText::new("Hello, World!", TerminalStyle::bright_yellow());
assert_eq!(greeting.output(), "\u{001B}[1;93mHello, World!\u{001B}[0m");

突出显示功能

通过使用highlight便利函数生成StyledTerminalText,这是使您的代码干净易读的最后一个步骤

use terminal_text_styler::{highlight, TerminalStyle};

println!("{} Blah blah blah...", highlight("Hello, World!", TerminalStyle::bright_yellow()));

上表中的每种样式都有一个独特的突出显示函数

use terminal_text_styler::{highlight_bright_yellow, highlight_red};
println!("This is {} and this is {}.", highlight_bright_yellow("highlighted in bright yellow"), highlight_red("highlighted in red"));

无运行时依赖