#data #stylish #styling #details #format #text #macro

macro stylish-macros

stylish-core的内部实现细节

3个不稳定版本

0.1.1 2022年9月13日
0.1.0 2022年7月29日
0.0.0 2021年1月3日

进程宏 中排名第 1799

Download history 63/week @ 2024-03-11 62/week @ 2024-03-18 84/week @ 2024-03-25 132/week @ 2024-04-01 56/week @ 2024-04-08 101/week @ 2024-04-15 59/week @ 2024-04-22 67/week @ 2024-04-29 43/week @ 2024-05-06 70/week @ 2024-05-13 51/week @ 2024-05-20 103/week @ 2024-05-27 94/week @ 2024-06-03 102/week @ 2024-06-10 118/week @ 2024-06-17 100/week @ 2024-06-24

每月下载量 424
6 个crate中使用了(直接使用2个)

MIT/Apache

48KB
834

version-badge license-badge rust-version-badge

又一个实现彩色文本的crate。

与现有crate相比,stylish 有一个主要的设计目标

将数据样式与应用样式输出的方式解耦。

这源于两个用例

  1. 一个库crate,它渲染数据格式的“诊断”表示(例如类似JSON的)。这个库正在被用于基于WASM的Web应用和CLI应用;在两种情况下,这些应用都可以通过添加一些语法高亮来改进渲染的数据,但在一种情况下我们想输出HTML,而在另一种情况下则需要ANSI颜色代码。

  2. 一个(不同的)CLI应用,它可以使用嵌入在输出消息中的不同数据类型的语义着色来简化解析,并可选择关闭颜色。为了简化颜色切换,消息的渲染不需要持续检查颜色是否开启。

除了这个主要的设计目标,还有一个次要的设计目标

尽可能集成到 std::fmt 以利用现有知识。

我们已经在 std::fmt 中有一个标准化的格式化基础设施。开发者已经知道如何使用它,并且非常容易使用。通过重用现有的设计和仅在需要时扩展它,应该可以轻松地开始使用 stylish

使用属性编写数据

您可以使用两种主要机制来输出带属性的属性数据;或者将属性作为格式字符串的一部分应用,或者实现stylish::Display以便能够打印具有属性的一些类型。

在格式字符串中应用属性

stylish的宏扩展了标准fmt参数以支持在()中设置属性。这些必须在选择特质的参数之前放在参数的末尾。

assert_eq!(
    stylish::html::format!("Hello {:(fg=red)}", "Ferris"),
    "Hello <span style=color:red>Ferris</span>",
);

允许的属性

有两种参数化属性和三种非参数化属性

  • fg指定一个Foreground样式,并接受小写的Color

  • bg指定一个Background样式,并且也接受小写的Color

  • boldnormalfaint不接收任何参数,并指定一个Intensity样式

语法更改

特定的语法更改是扩展format_spec如下

format_spec := [[fill]align][sign]['#']['0'][width]['.' precision][attributes]type
attributes := '(' [attribute [',' attribute]* [',']] ')'
attribute := key ['=' value]
key := identifier
value := identifier

为类型实现样式

stylish::Display类似于std::fmt::Display,但有一个支持设置样式属性Formatter。它可以通过在格式字符串中使用特性选择器s来指定。有关如何在写入数据时编程设置样式的更多详细信息,请参阅Formatter文档。

struct Name(&'static str);

impl stylish::Display for Name {
    fn fmt(&self, f: &mut stylish::Formatter<'_>) -> stylish::Result {
        let color = match self.0 {
            "Ferris" => stylish::Color::Red,
            "Gorris" => stylish::Color::Cyan,
            _ => stylish::Color::Default,
        };
        f.with(stylish::Foreground(color)).write_str(self.0)
    }
}

assert_eq!(
    stylish::html::format!("Hello {:s} and {:s}", Name("Ferris"), Name("Gorris")),
    "Hello <span style=color:red>Ferris</span> and <span style=color:cyan>Gorris</span>",
);

功能

功能 激活 效果
std 默认开启 启用io模块(以及其他模块中的io辅助工具)
alloc std隐含的 启用String和许多使用它的项目
macros 默认开启 在启用的其他模块中启用宏
ansi 默认关闭 启用ansi模块以及使用它的项目
html 默认关闭 启用html模块以及使用它的项目
plain 默认关闭 启用plain模块以及使用它的项目

Rust 版本策略

此crate仅支持当前稳定的Rust版本,补丁发布可能随时使用新功能。

许可证

许可下之一

由您自行决定。

贡献

除非您明确声明,否则您有意提交并包含在本作品中的任何贡献,都应双许可,如上所述,不附加任何额外条款或条件。

依赖项

~2.5MB
~54K SLoC