2个不稳定版本

0.1.0 2022年7月29日
0.0.0 2021年1月13日

#182 in 文本编辑器

Download history 122/week @ 2024-04-01 54/week @ 2024-04-08 107/week @ 2024-04-15 63/week @ 2024-04-22 71/week @ 2024-04-29 43/week @ 2024-05-06 70/week @ 2024-05-13 53/week @ 2024-05-20 104/week @ 2024-05-27 95/week @ 2024-06-03 102/week @ 2024-06-10 117/week @ 2024-06-17 160/week @ 2024-06-24 62/week @ 2024-07-01 95/week @ 2024-07-08 96/week @ 2024-07-15

每月下载量 434
2 个crate中(通过 stylish)使用

MIT/Apache

63KB
629

version-badge license-badge rust-version-badge

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

stylish 与现有crate区分开来的一个主要设计目标是

将样式应用于数据应与如何输出该样式解耦。

这源于两个用例

  1. 一个库crate,该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::Displaystd::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 on-by-default 启用 io 模块(以及其他模块中的 io 辅助函数)
alloc std 暗示 启用 String 和使用它的各种项
on-by-default 在所有已启用的模块中启用宏
ansi off-by-default 启用 ansi 模块和使用它的项
html off-by-default 启用 html 模块和使用它的项
plain off-by-default 启用 plain 模块和使用它的项

Rust 版本策略

此crate只支持Rust的当前稳定版本,补丁版本可能随时使用新特性。

许可证

许可协议为以下之一

由您选择。

贡献

除非您明确声明,否则您有意提交以供作品包含的贡献将根据上述条款双重授权,无需任何额外条款或条件。

依赖项

~85–465KB