1 个不稳定版本
0.1.0 | 2023年8月8日 |
---|
#23 in #pretty-printing
用于 pprint
14KB
299 行
pprint
一个用于使用文档模型进行美观打印的Rust库。自动为结构体、枚举和原始类型派生Pretty
;默认也支持向量和映射类型;与derive(Debug)
宏非常相似,只是更美观且更可配置。
用法
use pprint::{Doc, Printer, PRINTER};
let doc = Doc::from(vec![1, 2, 3])
.wrap("[", "]")
.join(", ");
print!("{}", PRINTER.pretty(doc));
// prints:
// [
// 1,
// 2,
// 3
// ]
文档模型
文档模型提供了一组丰富的构建块
- 原始值,如字符串、数字
- 容器,如向量、元组、映射、集合
- 格式化,如
concat
、join
、wrap
、group
- 使用
indent
和dedent
进行缩进控制 - 使用
if_break
进行条件格式化 - 使用
hardline
、softline
进行换行
Printer
处理将Doc
美观地打印到字符串,具有可配置的选项
max_width
- 每行的最大宽度indent
- 每个缩进级别的空格数break_long_text
- 在长文本中插入换行符use_tabs
- 使用制表符而不是空格进行缩进
派生宏
库的一半开发时间花在了派生宏上,这使得几乎任何类型的 pretty 打印都变得简单。以下是一个简单的示例
#[derive(Pretty)]
struct Point {
x: f64,
y: f64
}
let point = Point { x: 1.0, y: 2.0 };
print!("{}", Doc::from(point)); // prints "(x: 1, y: 2)"
Pretty
支持一个额外的属性,pprint
,用于自定义对象的 pretty 打印定义。以下选项可用
- skip: bool: 跳过此字段 - 不要将其包含在输出中
- indent: bool: 缩进此字段 - 在前后添加换行和缩进
- 重命名:选项:重命名此字段 - 使用提供的字符串作为字段名称
- 获取器:选项:使用提供的函数获取此字段的值
- verbose:布尔:详细输出 - 在输出中包含字段名称
#[derive(Pretty)]
#[pprint(verbose)]
struct Point {
#[pprint(rename = "x-coordinate")]
x: f64,
#[pprint(rename = "y-coordinate")]
y: f64
#[pprint(skip)]
_skip_me: bool,
}
let point = Point { x: 1.0, y: 2.0, _skip_me: true };
print!("{}", Doc::from(point));
// prints:
// Point {
// x-coordinate: 1,
// y-coordinate: 2
// }
结构可以任意嵌套,等等。更复杂的示例可以在 测试文件 中找到。
关于
这个库部分是为了学习更多关于Rust的进程宏而创建的,部分是因为我非常喜欢格式化打印。它仍在进行中,但我迄今为止相当满意。如果您有任何建议,请随时提交问题或拉取请求。
值得注意的是,实现了 text_justify
函数,该函数基于麻省理工学院6.006课程《算法导论》中精彩的系列讲座(特别是第20讲)。这是一个简单而相当优雅的算法,我在实践中发现它非常有效。
依赖项
~1.5MB
~35K SLoC