Allow parsing toml metadata out of specially delimited comments.

This commit is contained in:
2025-08-30 23:07:22 -05:00
parent cb226f021f
commit 5d760b4cdf

View File

@@ -373,7 +373,7 @@ pub struct PageRenderer {
fn parse_markdown (content: &str, metadata: &mut Table) -> String { fn parse_markdown (content: &str, metadata: &mut Table) -> String {
let mut metadata_str = String::new(); let mut metadata_str = String::new();
let mut in_metadata = false; let mut in_metadata = false;
let parser = pulldown_cmark::Parser::new_ext(content, pulldown_cmark::Options::ENABLE_YAML_STYLE_METADATA_BLOCKS).map(|event| { let parser = pulldown_cmark::Parser::new_ext(content, pulldown_cmark::Options::ENABLE_YAML_STYLE_METADATA_BLOCKS).filter(|event| {
match &event { match &event {
Event::Start(tag) => { Event::Start(tag) => {
if let Tag::MetadataBlock(_) = tag { if let Tag::MetadataBlock(_) = tag {
@@ -385,24 +385,33 @@ fn parse_markdown (content: &str, metadata: &mut Table) -> String {
metadata_str.push_str(text); metadata_str.push_str(text);
} }
} }
Event::Html(html) => {
if html.starts_with("<!---") {
in_metadata = true;
} else if html.starts_with("--->") {
in_metadata = false;
return false;
} else if in_metadata {
metadata_str.push_str(html);
}
}
Event::End(tag) => { Event::End(tag) => {
if let TagEnd::MetadataBlock(_) = tag { if !metadata_str.is_empty() {
if in_metadata {
if let Ok(parsed_metadata) = toml::de::from_str::<Table>(&metadata_str) { if let Ok(parsed_metadata) = toml::de::from_str::<Table>(&metadata_str) {
println!("{:?}", parsed_metadata); println!("{:?}", parsed_metadata);
for (key, value) in parsed_metadata { for (key, value) in parsed_metadata {
metadata.insert(key, value); metadata.insert(key, value);
} }
} }
}
metadata_str.clear(); metadata_str.clear();
in_metadata = false; in_metadata = false;
return false;
} }
} }
_ => {} _ => {}
} }
event !in_metadata
}); });
let mut html_output = String::new(); let mut html_output = String::new();
pulldown_cmark::html::push_html(&mut html_output, parser); pulldown_cmark::html::push_html(&mut html_output, parser);