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

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() {