Add TOML metadata parsing.

This commit is contained in:
2025-08-30 20:46:09 -05:00
parent 6d2855eeca
commit cb226f021f
4 changed files with 112 additions and 21 deletions

76
Cargo.lock generated
View File

@@ -266,9 +266,9 @@ dependencies = [
[[package]]
name = "clap"
version = "4.5.40"
version = "4.5.46"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "40b6887a1d8685cebccf115538db5c0efe625ccac9696ad45c409d96566e910f"
checksum = "2c5e4fcf9c21d2e544ca1ee9d8552de13019a42aa7dbf32747fa7aaf1df76e57"
dependencies = [
"clap_builder",
"clap_derive",
@@ -276,9 +276,9 @@ dependencies = [
[[package]]
name = "clap_builder"
version = "4.5.40"
version = "4.5.46"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e0c66c08ce9f0c698cbce5c0279d0bb6ac936d8674174fe48f736533b964f59e"
checksum = "fecb53a0e6fcfb055f686001bc2e2592fa527efaf38dbe81a6a9563562e57d41"
dependencies = [
"anstream",
"anstyle",
@@ -288,9 +288,9 @@ dependencies = [
[[package]]
name = "clap_derive"
version = "4.5.40"
version = "4.5.45"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d2c7947ae4cc3d851207c1adb5b5e260ff0cca11446b1d6d1423788e442257ce"
checksum = "14cb31bb0a7d536caef2639baa7fad459e15c3144efefa6dbd1c84562c4739f6"
dependencies = [
"heck",
"proc-macro2",
@@ -495,7 +495,7 @@ dependencies = [
"atomic 0.6.1",
"pear",
"serde",
"toml",
"toml 0.8.23",
"uncased",
"version_check",
]
@@ -814,7 +814,7 @@ dependencies = [
"rocket",
"serde",
"tera",
"toml",
"toml 0.9.5",
]
[[package]]
@@ -1637,9 +1637,9 @@ dependencies = [
[[package]]
name = "regex"
version = "1.11.1"
version = "1.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191"
checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912"
dependencies = [
"aho-corasick",
"memchr",
@@ -1854,6 +1854,15 @@ dependencies = [
"serde",
]
[[package]]
name = "serde_spanned"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "40734c41988f7306bb04f0ecf60ec0f3f1caa34290e4e8ea471dcd3346483b83"
dependencies = [
"serde",
]
[[package]]
name = "sha2"
version = "0.10.9"
@@ -2160,11 +2169,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362"
dependencies = [
"serde",
"serde_spanned",
"toml_datetime",
"serde_spanned 0.6.9",
"toml_datetime 0.6.11",
"toml_edit",
]
[[package]]
name = "toml"
version = "0.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "75129e1dc5000bfbaa9fee9d1b21f974f9fbad9daec557a521ee6e080825f6e8"
dependencies = [
"indexmap",
"serde",
"serde_spanned 1.0.0",
"toml_datetime 0.7.0",
"toml_parser",
"toml_writer",
"winnow",
]
[[package]]
name = "toml_datetime"
version = "0.6.11"
@@ -2174,6 +2198,15 @@ dependencies = [
"serde",
]
[[package]]
name = "toml_datetime"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bade1c3e902f58d73d3f294cd7f20391c1cb2fbcb643b73566bc773971df91e3"
dependencies = [
"serde",
]
[[package]]
name = "toml_edit"
version = "0.22.27"
@@ -2182,18 +2215,33 @@ checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a"
dependencies = [
"indexmap",
"serde",
"serde_spanned",
"toml_datetime",
"serde_spanned 0.6.9",
"toml_datetime 0.6.11",
"toml_write",
"winnow",
]
[[package]]
name = "toml_parser"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b551886f449aa90d4fe2bdaa9f4a2577ad2dde302c61ecf262d80b116db95c10"
dependencies = [
"winnow",
]
[[package]]
name = "toml_write"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801"
[[package]]
name = "toml_writer"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fcc842091f2def52017664b53082ecbbeb5c7731092bad69d2c63050401dfd64"
[[package]]
name = "tower-service"
version = "0.3.3"

View File

@@ -7,9 +7,9 @@ edition = "2021"
[dependencies]
pulldown-cmark = "0.13.0"
tera = "1.20.0"
toml = "0.8.23"
toml = "0.9.5"
grep = "0.3.2"
regex = "1.11.1"
regex = "1.11.2"
pathdiff = "0.2.3"
[dependencies.chrono]
@@ -21,7 +21,7 @@ version = "0.20.2"
default-features = false
[dependencies.clap]
version = "4.5.40"
version = "4.5.45"
features = ["derive"]
[dependencies.rocket]

View File

@@ -31,6 +31,8 @@ use pathdiff::diff_paths;
use chrono::{DateTime, MappedLocalTime, TimeZone, Local};
use pulldown_cmark::{Event, Tag, TagEnd};
pub struct Historian {
source_root: PathBuf,
index_filename: String,
@@ -368,11 +370,47 @@ pub struct PageRenderer {
tera: Tera
}
fn render_markdown (content: &tera::Value, args: &HashMap<String, tera::Value>) -> tera::Result<tera::Value> {
let parser = pulldown_cmark::Parser::new(content.as_str().unwrap());
fn parse_markdown (content: &str, metadata: &mut Table) -> String {
let mut metadata_str = String::new();
let mut in_metadata = false;
let parser = pulldown_cmark::Parser::new_ext(content, pulldown_cmark::Options::ENABLE_YAML_STYLE_METADATA_BLOCKS).map(|event| {
match &event {
Event::Start(tag) => {
if let Tag::MetadataBlock(_) = tag {
in_metadata = true;
}
}
Event::Text(text) => {
if in_metadata {
metadata_str.push_str(text);
}
}
Event::End(tag) => {
if let TagEnd::MetadataBlock(_) = tag {
if in_metadata {
if let Ok(parsed_metadata) = toml::de::from_str::<Table>(&metadata_str) {
println!("{:?}", parsed_metadata);
for (key, value) in parsed_metadata {
metadata.insert(key, value);
}
}
}
metadata_str.clear();
in_metadata = false;
}
}
_ => {}
}
event
});
let mut html_output = String::new();
pulldown_cmark::html::push_html(&mut html_output, parser);
Ok(tera::Value::String(html_output))
html_output
}
fn render_markdown (content: &tera::Value, args: &HashMap<String, tera::Value>) -> tera::Result<tera::Value> {
Ok(tera::Value::String(parse_markdown(content.as_str().unwrap(), &mut Table::new())))
}
impl PageRenderer {
@@ -506,6 +544,11 @@ impl<'a> Render<'a> {
}
self.context.insert("content", &content);
let mut metadata = Table::new();
let html_content = parse_markdown(&content, &mut metadata);
self.context.insert("html_content", &html_content);
self.context.insert("metadata", &metadata);
let mut ancestors: VecDeque<&Page> = VecDeque::new();
let mut ancestor = page.parent.as_ref();
while ancestor.is_some() {

View File

@@ -1,4 +1,4 @@
{% extends "base.html" %}
{% block content %}
{{ content | markdown | safe }}
{{ html_content | safe }}
{% endblock content %}