#markdown #filesystem #flat-file #system #page #url #md

flatpage

简单的基于文件系统的 markdown 扁平页面

3 个不稳定版本

0.2.0 2024年1月15日
0.1.1 2022年7月1日
0.1.0 2022年7月1日

#467 in 文本处理

MIT 许可证

22KB
355

License Crates.io Docs.rs

简单的基于文件系统的 markdown 扁平页面。

文件夹结构

URL 中允许的字符只有 ASCII 字符、数字和连字符以及下划线。通过简单地将 / 替换为 ^ 并添加 .md 扩展名,将 URL 映射到文件。我相信这应该可以消除所有安全风险。

url 文件名
/ ^.md
/foo/bar-baz ^foo^bar-baz.md

页面格式

如果文件提供了基于 yaml 的 frontmatter 中的标题和描述,则文件可以提供标题和描述;如果没有 frontmatter,则第一行将被视为标题(并从可能的标题标记 # 中清理)。

文件内容 标题 描述 正文 HTML()
#Foo
Bar
"Foo" "# Foo\nBar" "<h1>Foo</h1>\n<p>Bar</p>\n"
---
描述:Bar
---
#Foo
"Foo" 一些("Bar") "# Foo" "<h1>Foo</h1>\n"
---
标题:Foo
描述:Bar
---
"Foo" 一些("Bar") "" ""

读取页面

let root_folder = "./";
if let Some(home) = flatpage::FlatPage::<()>::by_url(root_folder, "/").unwrap() {
    println!("title: {}", home.title);
    println!("description: {:?}", home.description);
    println!("markdown body: {}", home.body);
    println!("html body: {}", home.html());
} else {
    println!("No home page");
}

额外的 frontmatter 字段

您可以定义额外的静态类型 frontmatter 字段

#[derive(Debug, serde::Deserialize)]
struct Extra {
    slug: String,
}

let _page = flatpage::FlatPage::<Extra>::by_url("./", "/").unwrap();

缓存的元数据

页面通常会有相关页面的列表。为了避免每次都读取所有文件,您可以使用 FlatPageStore 来缓存页面 metadata(标题和描述)。

let root_folder = "./";
let store = flatpage::FlatPageStore::read_dir(root_folder).unwrap();
if let Some(meta) = store.meta_by_url("/") {
    println!("title: {}", meta.title);
    println!("description: {:?}", meta.description);
} else {
    println!("No home page");
}

贡献

我们欢迎所有类型的贡献,谢谢!

关于 README 的说明

大多数 README 是通过 cargo-sync-readme 从 crate 文档自动复制而来的。这样 README 就始终与文档同步,示例也是经过测试的。

所以,如果您想更改readme文件中的一部分,在<!-- cargo-sync-readme start --><!-- cargo-sync-readme end -->标记之间,请不要直接编辑README.md,而是更改src/lib.rs上的文档,然后与readme进行同步。

cargo sync-readme

(确保已安装cargo命令)

cargo install cargo-sync-readme

如果您已安装rusty-hook,则更改将在提交时自动应用。

许可证

本项目采用MIT许可证

依赖项

~3–4MB
~82K SLoC