#front-matter #parse #markdown #toml-parser #parser #json-toml #front-matter-parsers

gray_matter

智能前端元数据解析器。Rust 中的 gray-matter 实现。解析 YAML、JSON、TOML,并支持自定义解析器。

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 解析器实现

Download history 2338/week @ 2024-05-03 2890/week @ 2024-05-10 3951/week @ 2024-05-17 4720/week @ 2024-05-24 4297/week @ 2024-05-31 2462/week @ 2024-06-07 1602/week @ 2024-06-14 2470/week @ 2024-06-21 1463/week @ 2024-06-28 1670/week @ 2024-07-05 1432/week @ 2024-07-12 1152/week @ 2024-07-19 1524/week @ 2024-07-26 1535/week @ 2024-08-02 2052/week @ 2024-08-09 1732/week @ 2024-08-16

6,994 个月下载量
用于 16 个crate (15个直接)

MIT 许可证

56KB
1.5K SLoC

Latest Version Documentation

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