10 个版本
0.2.8 | 2024年5月27日 |
---|---|
0.2.6 | 2023年4月8日 |
0.2.5 | 2023年1月13日 |
0.2.4 | 2022年7月22日 |
0.1.0 | 2021年2月7日 |
#87 in 解析器实现
6,994 个月下载量
用于 16 个crate (15个直接)
56KB
1.5K SLoC
gray_matter 是一个从字符串中轻松提取前端元数据的工具。它是 gray-matter 的快速 Rust 实现。支持以下前端元数据格式
- TOML
- YAML
- JSON
它还提供了一个 Engine
特性接口,用于实现与 gray_matter 一起工作的自定义解析器。
用法
将 gray_matter
添加为依赖项
将此crate添加到 Cargo.toml
[dependencies]
# other dependencies...
gray_matter = "0.2"
基本解析
use gray_matter::Matter;
use gray_matter::engine::YAML;
use serde::Deserialize;
const INPUT: &str = r#"---
title: gray-matter-rs
tags:
- gray-matter
- rust
---
Some excerpt
---
Other stuff
"#;
fn main() {
// Select one parser engine, such as YAML, and parse it
// into gray_matter's custom data type: `Pod`
let matter = Matter::<YAML>::new();
let result = matter.parse(INPUT);
// You can now inspect the data from gray_matter.
assert_eq!(result.content, "Some excerpt\n---\nOther stuff");
assert_eq!(result.excerpt, Some("Some excerpt".to_owned()));
assert_eq!(result.data.as_ref().unwrap()["title"].as_string(), Ok("gray-matter-rs".to_string()));
assert_eq!(result.data.as_ref().unwrap()["tags"][0].as_string(), Ok("gray-matter".to_string()));
assert_eq!(result.data.as_ref().unwrap()["tags"][1].as_string(), Ok("rust".to_string()));
// The `Pod` data type can be a bit unwieldy, so
// you can also deserialize it into a custom struct
#[derive(Deserialize, Debug)]
struct FrontMatter {
title: String,
tags: Vec<String>
}
// Deserialize `result` manually:
let front_matter: FrontMatter = result.data.unwrap().deserialize().unwrap();
println!("{:?}", front_matter);
// FrontMatter { title: "gray-matter-rs", tags: ["gray-matter", "rust"] }
// ...or skip a step, by using `parse_with_struct`.
let result_with_struct = matter.parse_with_struct::<FrontMatter>(INPUT).unwrap();
println!("{:?}", result_with_struct.data)
// FrontMatter { title: "gray-matter-rs", tags: ["gray-matter", "rust"] }
}
自定义分隔符
默认分隔符是 ---
,适用于前端元数据和摘录。您可以通过修改 Matter
结构体来更改此设置。
use gray_matter::{Matter, ParsedEntityStruct};
use gray_matter::engine::YAML;
use serde::Deserialize;
fn main() {
let mut matter: Matter<YAML> = Matter::new();
matter.delimiter = "~~~".to_owned();
matter.excerpt_delimiter = Some("<!-- endexcerpt -->".to_owned());
#[derive(Deserialize, Debug)]
struct FrontMatter {
abc: String,
}
let result: ParsedEntityStruct<FrontMatter> = matter.parse_with_struct(
"~~~\nabc: xyz\n~~~\nfoo\nbar\nbaz\n<!-- endexcerpt -->\ncontent",
).unwrap();
}
自定义关闭分隔符
默认情况下,开分隔符和关闭分隔符相同(---
)。您可以通过修改 Matter
结构体的 close_delimiter
属性来更改此设置。
use gray_matter::{Matter, ParsedEntityStruct};
use gray_matter::engine::YAML;
use serde::Deserialize;
fn main() {
let mut matter: Matter<YAML> = Matter::new();
matter.delimiter = "<!--".to_owned();
matter.close_delimiter = Some("-->".to_owned());
matter.excerpt_delimiter = Some("<!-- endexcerpt -->".to_owned());
#[derive(Deserialize, Debug)]
struct FrontMatter {
abc: String,
}
let result: ParsedEntityStruct<FrontMatter> = matter.parse_with_struct(
"<!--\nabc: xyz\n-->\nfoo\nbar\nbaz\n<!-- endexcerpt -->\ncontent",
).unwrap();
}
贡献者
贡献
如果您需要更多的解析器引擎,请随时创建一个 PR 来帮助我完善这个crate。
依赖项
~2.6–4MB
~69K SLoC