3 个不稳定版本
0.2.0 | 2024年1月15日 |
---|---|
0.1.1 | 2022年7月1日 |
0.1.0 | 2022年7月1日 |
#467 in 文本处理
22KB
355 行
简单的基于文件系统的 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