3个版本 (重大变更)
0.3.0 | 2024年6月18日 |
---|---|
0.2.0 | 2023年5月27日 |
0.1.0 | 2023年2月27日 |
#707 在 编码
每月 28 次下载
在 5 个crate中使用(通过htmlize)
215KB
457 行
生成函数以快速将字节字符串前缀映射到值
TreeMatcher
可用于构建脚本中生成将字节序列映射到任意值的匹配器函数。它返回映射值(或 None
)和输入的剩余部分。
例如,假设你生成一个名为 entity_matcher()
的匹配器来处理所有HTML实体
assert!(entity_matcher(b"×XYZ") == (Some("×"), b"XYZ".as_slice()));
- 它检查的前缀不必都是相同长度。
- 如果多个前缀匹配,它将返回最长的那个。
- 如果没有匹配,它将返回
(None, &input)
。
由于匹配器只检查输入的开始部分,你可能需要使用 iter().position()
或 memchr crate 来查找潜在匹配的开始位置。
它也可以配置为接受字节迭代器作为输入,而不是切片。
简单示例
要创建一个处理四个基本HTML实体的匹配器,可以使用以下构建脚本
use matchgen::TreeMatcher;
use std::env;
use std::error::Error;
use std::fs::File;
use std::io::{BufWriter, Write};
use std::path::Path;
fn main() -> Result<(), Box<dyn Error>> {
let out_path = Path::new(&env::var("OUT_DIR")?).join("matcher.rs");
let mut out = BufWriter::new(File::create(out_path)?);
TreeMatcher::new("pub fn entity_decode", "u8")
.doc("Decode basic HTML entities.")
.add(b"&", "b'&'")
.add(b"<", "b'<'")
.add(b">", "b'>'")
.add(b""", "b'\"'")
.render(&mut out)?;
Ok(())
}
要使用匹配器
include!(concat!(env!("OUT_DIR"), "/matcher.rs"));
fn main() {
assert_eq!(
entity_decode(b"& on & on"),
(Some(b'&'), b" on & on".as_slice()),
);
}
开发状态
这可能是稳定的。我在等待一段时间,看看是否能想出新的功能或更好的实现相同功能的途径,然后再发布1.0版本。
我愿意接受 建议。
许可
本项目采用Apache 2和MIT许可证双重许可。您可以选择使用其中之一。
贡献
除非您明确声明,否则您根据Apache 2.0许可证提交的任何贡献都将按照上述方式双许可,不附加任何额外的条款或条件。