diff --git a/Cargo.lock b/Cargo.lock index 9987c93..b8ca346 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -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" diff --git a/Cargo.toml b/Cargo.toml index 1e22ecc..5039cc2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -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] diff --git a/src/lib.rs b/src/lib.rs index 8e25e75..1fb9128 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -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) -> tera::Result { - 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::(&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) -> tera::Result { + 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() { diff --git a/templates/page.html b/templates/page.html index a8c01b0..d5a6a95 100644 --- a/templates/page.html +++ b/templates/page.html @@ -1,4 +1,4 @@ {% extends "base.html" %} {% block content %} -{{ content | markdown | safe }} +{{ html_content | safe }} {% endblock content %}