From 865387d0216451aebb61fbe786afc9f70a451ba2 Mon Sep 17 00:00:00 2001 From: LailaTheElf Date: Sun, 1 Feb 2026 12:23:26 +0100 Subject: [PATCH] all lots more components --- src/render/parse_md.rs | 297 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 263 insertions(+), 34 deletions(-) diff --git a/src/render/parse_md.rs b/src/render/parse_md.rs index 34af50a..fb32fe0 100644 --- a/src/render/parse_md.rs +++ b/src/render/parse_md.rs @@ -1,6 +1,6 @@ use std::{collections::BTreeMap}; -use pulldown_cmark::{Event, Options, Parser, Tag}; +use pulldown_cmark::{Event, Options, Parser, Tag, TagEnd}; use minijinja::{context, Environment, Value}; use regex::Regex; @@ -30,52 +30,276 @@ pub fn parse_md(md: String, jinja_env: &Environment) -> Option { match &event { Event::Start(tag) => { match tag { - Tag::Paragraph => Some(event), - Tag::Heading { level, id, classes, attrs } => Some(event), - Tag::BlockQuote(_block_quote_kind) => Some(event), - Tag::CodeBlock(_code_block_kind) => Some(event), - Tag::HtmlBlock => Some(event), - Tag::List(_) => Some(event), - Tag::Item => Some(event), - Tag::FootnoteDefinition(_cow_str) => Some(event), - Tag::DefinitionList => Some(event), - Tag::DefinitionListTitle => Some(event), - Tag::DefinitionListDefinition => Some(event), - Tag::Table(_alignments) => Some(event), - Tag::TableHead => Some(event), - Tag::TableRow => Some(event), - Tag::TableCell => Some(event), - Tag::Emphasis => Some(event), - Tag::Strong => Some(event), - Tag::Strikethrough => Some(event), - Tag::Superscript => Some(event), - Tag::Subscript => Some(event), + Tag::Paragraph => { + render_component("paragraph_start", Value::UNDEFINED, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + Tag::Heading { level, id, classes, attrs } => { + render_component("heading_start", context! { + level => *level as u8, + id, + classes, + attrs + }, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + Tag::BlockQuote(block_quote_kind) => { + render_component("blockquote_start", context! { + kind => block_quote_kind + }, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + Tag::CodeBlock(code_block_kind) => { + render_component("codeblock_start", context! { + kind => code_block_kind + }, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + Tag::HtmlBlock => { + render_component("htmlblock_start", Value::UNDEFINED, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + Tag::List(start) => { + render_component("list_start", context! { + start + }, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + Tag::Item => { + render_component("item_start", Value::UNDEFINED, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + Tag::FootnoteDefinition(cow_str) => { + render_component("footnote_definition_start", context! { + label => cow_str + }, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + Tag::DefinitionList => { + render_component("definitionlist_start", Value::UNDEFINED, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + Tag::DefinitionListTitle => { + render_component("definitionlist_title_start", Value::UNDEFINED, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + Tag::DefinitionListDefinition => { + render_component("definitionlist_definition_start", Value::UNDEFINED, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + Tag::Table(alignments) => { + render_component("table_start", context! { + alignments + }, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + Tag::TableHead => { + render_component("tablehead_start", Value::UNDEFINED, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + Tag::TableRow => { + render_component("tablerow_start", Value::UNDEFINED, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + Tag::TableCell => { + render_component("tablecell_start", Value::UNDEFINED, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + Tag::Emphasis => { + render_component("emphasis_start", Value::UNDEFINED, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + Tag::Strong => { + render_component("strong_start", Value::UNDEFINED, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + Tag::Strikethrough => { + render_component("strikethrough_start", Value::UNDEFINED, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + Tag::Superscript => { + render_component("superscript_start", Value::UNDEFINED, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + Tag::Subscript => { + render_component("subscript_start", Value::UNDEFINED, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, Tag::Link { link_type, dest_url, title, id } => { let re = Regex::new(r"^%(?[^%]+)%").unwrap(); - // let out = .unwrap(); let (url, args) = match re.captures(&dest_url) { Some(args) => { (dest_url.strip_prefix(args.get(0).unwrap().as_str()).unwrap().to_string(), parse_args(args.name("tags").unwrap().as_str())) }, None => (dest_url.to_string(), Value::UNDEFINED) }; - match render_component("link_start", context! { + render_component("link_start", context! { link_type => link_type, dest_url => url, title => title, id => id, args => args }, jinja_env) - { - Some(html) => Some(Event::Html(html.into())), - None => Some(event), - } + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + Tag::Image { link_type, dest_url, title, id } => { + render_component("image_start", Value::UNDEFINED, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + Tag::MetadataBlock(_metadata_block_kind) => { + render_component("metadata_block_start", Value::UNDEFINED, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + } + }, + Event::End(tag) => { + match tag { + TagEnd::Paragraph => { + render_component("paragraph_end", Value::UNDEFINED, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + TagEnd::Heading(level) => { + render_component("heading_end", context! { + level => *level as u8 + }, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + TagEnd::BlockQuote(block_quote_kind) => { + render_component("blockquote_end", context! { + kind => block_quote_kind + }, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + TagEnd::CodeBlock => { + render_component("codeblock_end", Value::UNDEFINED, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + TagEnd::HtmlBlock => { + render_component("htmlblock_end", Value::UNDEFINED, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + TagEnd::List(start) => { + render_component("list_end", context! { + start + }, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + TagEnd::Item => { + render_component("item_end", Value::UNDEFINED, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + TagEnd::FootnoteDefinition => { + render_component("footnote_definition_end", Value::UNDEFINED, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + TagEnd::DefinitionList => { + render_component("definitionlist_end", Value::UNDEFINED, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + TagEnd::DefinitionListTitle => { + render_component("definitionlist_title_end", Value::UNDEFINED, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + TagEnd::DefinitionListDefinition => { + render_component("definitionlist_definition_end", Value::UNDEFINED, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + TagEnd::Table => { + render_component("table_end", Value::UNDEFINED, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + TagEnd::TableHead => { + render_component("tablehead_end", Value::UNDEFINED, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + TagEnd::TableRow => { + render_component("tablerow_end", Value::UNDEFINED, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + TagEnd::TableCell => { + render_component("tablecell_end", Value::UNDEFINED, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + TagEnd::Emphasis => { + render_component("emphasis_end", Value::UNDEFINED, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + TagEnd::Strong => { + render_component("strong_end", Value::UNDEFINED, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + TagEnd::Strikethrough => { + render_component("strikethrough_end", Value::UNDEFINED, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + TagEnd::Superscript => { + render_component("superscript_end", Value::UNDEFINED, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + TagEnd::Subscript => { + render_component("subscript_end", Value::UNDEFINED, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + TagEnd::Link => { + render_component("link_end", Value::UNDEFINED, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + TagEnd::Image => { + render_component("image_end", Value::UNDEFINED, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) + }, + TagEnd::MetadataBlock(_metadata_block_kind) => { + render_component("metadata_block_end", Value::UNDEFINED, jinja_env) + .and_then(|s| Some(Event::Html(s.into()))) + .or(Some(event)) }, - Tag::Image { link_type, dest_url, title, id } => Some(event), - Tag::MetadataBlock(_metadata_block_kind) => Some(event), } }, - Event::End(_tag_end) => Some(event), Event::Text(_cow_str) => Some(event), Event::Code(_cow_str) => Some(event), Event::InlineMath(_cow_str) => Some(event), @@ -102,7 +326,10 @@ fn md_preprocessor(md: &String, jinja_env: &Environment) -> String { let args = &capture[2]; match render_component(template, context! { args => parse_args(args)}, jinja_env){ Some(html) => html, - None => String::from("") + None => { + println!("ERROR: could not find template {}", template); + String::from("") + } } }); @@ -122,9 +349,11 @@ fn render_component(component: &str, args: Value, jinja_env: &Environment) -> Op }, } }, - Err(_) => { - println!("ERROR: could not find template: {component}"); - Some("".to_string()) + Err(e) => { + match e.kind() { + minijinja::ErrorKind::TemplateNotFound => None, + _ => panic!("Failt to render component {}: {:?}", component, e), + } }, } }