4 个版本 (2 个破坏性更新)
0.10.0 | 2024 年 7 月 12 日 |
---|---|
0.9.0 | 2024 年 7 月 10 日 |
0.1.1 | 2024 年 6 月 13 日 |
0.1.0 | 2024 年 6 月 13 日 |
#260 in GUI
280KB
3.5K SLoC
美观 🌸 美观
[ 文档 | Rust Crate | Python 包 | 仓库 ]
🎖️ 如同在 Real Python #211 中展示
Prettypretty 是一个 Rust 库,具有可选的 Python 集成,将 2020 年代的色彩科学应用于 1970 年代的终端,以构建出色的终端用户界面 (TUI)。预期的好处是双重的
- 您可以利用高分辨率色彩和 色彩空间 的全部表现力和便利性来设计和构建 TUI,包括在笛卡尔或极坐标形式下的感知均匀的 Oklab,无论是否采用原始或 修改后的亮度。
- Prettypretty 负责将预期的外观与终端的功能、当前运行时上下文(包括亮色或暗色模式)以及用户的偏好(无论他们是否偏向 FORCE_COLOR 或 NO_COLOR)相协调。
为了实现这一点,prettypretty 为终端和高分辨率色彩提供简单的抽象,促进它们与常见色彩空间之间的无缝转换,并实现最先进的算法,用于 色彩映射、色彩插值、感知对比度,以及基于色调和亮度的下采样,以优化选择 ANSI 颜色。
Python 集成
可选的 Python 集成通过 pyffi
功能标志启用,依赖于 PyO3 和 Maturin 来构建具有相同功能的扩展模块。只有在 Rust 库使用特质实现的地方,Python 模块 使用专用方法。此外,由于 Rust 库目前是 BYO(T)IO,即自己提供(终端)I/O,Python 库提供了强大的终端抽象,使得查询当前颜色主题的终端变得非常容易。
Python 文档 涵盖了当前仅适用于 Python 的功能。随着时间的推移,我预计这些功能也将移植到 Rust。
支持的最低 Rust 和 Python 版本
Prettypretty 充分利用了这两种编程语言,因此需要相对较新的版本。
- 根据 cargo-msrv,最低支持的 Rust 版本是 1.77.2。
- 根据 vermin,最低支持的 Python 版本是 3.11.0。
我预计随着项目的成熟,最低版本和最新版本之间的版本差距将越来越大,这是应该的。
脚本
除了 文档 外,了解 prettypretty 的一个好起点是脚本
-
prettypretty.progress 以下是在 Python 中使用该库的示例,仅用不到 100 行代码就实现了一个进度条。完成后的进度条如下所示,适用于浅色和深色主题。
-
prettypretty.plot 在 Oklab 的色相/色调平面上绘制颜色,如果您不提供颜色,则默认为终端当前的颜色方案。以下是在 Apple 的 Terminal.app 中的基本主题的颜色图表。
-
prettypretty.grid 可视化感知对比度和颜色下采样策略,对于嵌入在 8 位颜色中的 6x6x6 RGB 立方体进行了全面可视化,对于通过更大的 24 位 RGB 立方体的 32x32 切片进行了选择性可视化。
致谢
我于 2024 年在两个月的时间里写下了大部分的 prettypretty。两次。我首先用 Python 实现了核心颜色例程,然后又在 Rust 中实现了。到目前为止,只有 Rust 版本幸存下来。但 Python 仍然是 prettypretty 的顶级运行时目标。有两件事真正帮助了这个项目的启动。首先,我一直在尝试不同的终端样式方法,并知道我在寻找什么。其次,我从 Lea Verou 和 Chris Lilley 在 Color.js 库和 CSS Color 4 规范上的工作中受益匪浅。Prettypretty 直接重用了 Color.js 之间的颜色空间转换公式,并实现了几个 CSS Color 4 算法。
版权 2024 Robert Grimm。此存储库中的代码已在 Apache 2.0 许可下发布为开源。
依赖项
~0–630KB
~12K SLoC