1 个不稳定版本
0.1.0 | 2020年11月1日 |
---|
#718 in 命令行界面
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"));