all lots more components

This commit is contained in:
2026-02-01 12:23:26 +01:00
parent 5e8d2e04e0
commit 865387d021

View File

@@ -1,6 +1,6 @@
use std::{collections::BTreeMap}; 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 minijinja::{context, Environment, Value};
use regex::Regex; use regex::Regex;
@@ -30,52 +30,276 @@ pub fn parse_md(md: String, jinja_env: &Environment) -> Option<String> {
match &event { match &event {
Event::Start(tag) => { Event::Start(tag) => {
match tag { match tag {
Tag::Paragraph => Some(event), Tag::Paragraph => {
Tag::Heading { level, id, classes, attrs } => Some(event), render_component("paragraph_start", Value::UNDEFINED, jinja_env)
Tag::BlockQuote(_block_quote_kind) => Some(event), .and_then(|s| Some(Event::Html(s.into())))
Tag::CodeBlock(_code_block_kind) => Some(event), .or(Some(event))
Tag::HtmlBlock => Some(event), },
Tag::List(_) => Some(event), Tag::Heading { level, id, classes, attrs } => {
Tag::Item => Some(event), render_component("heading_start", context! {
Tag::FootnoteDefinition(_cow_str) => Some(event), level => *level as u8,
Tag::DefinitionList => Some(event), id,
Tag::DefinitionListTitle => Some(event), classes,
Tag::DefinitionListDefinition => Some(event), attrs
Tag::Table(_alignments) => Some(event), }, jinja_env)
Tag::TableHead => Some(event), .and_then(|s| Some(Event::Html(s.into())))
Tag::TableRow => Some(event), .or(Some(event))
Tag::TableCell => Some(event), },
Tag::Emphasis => Some(event), Tag::BlockQuote(block_quote_kind) => {
Tag::Strong => Some(event), render_component("blockquote_start", context! {
Tag::Strikethrough => Some(event), kind => block_quote_kind
Tag::Superscript => Some(event), }, jinja_env)
Tag::Subscript => Some(event), .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 } => { Tag::Link { link_type, dest_url, title, id } => {
let re = Regex::new(r"^%(?<tags>[^%]+)%").unwrap(); let re = Regex::new(r"^%(?<tags>[^%]+)%").unwrap();
// let out = .unwrap();
let (url, args) = match re.captures(&dest_url) { let (url, args) = match re.captures(&dest_url) {
Some(args) => { Some(args) => {
(dest_url.strip_prefix(args.get(0).unwrap().as_str()).unwrap().to_string(), parse_args(args.name("tags").unwrap().as_str())) (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) None => (dest_url.to_string(), Value::UNDEFINED)
}; };
match render_component("link_start", context! { render_component("link_start", context! {
link_type => link_type, link_type => link_type,
dest_url => url, dest_url => url,
title => title, title => title,
id => id, id => id,
args => args args => args
}, jinja_env) }, jinja_env)
{ .and_then(|s| Some(Event::Html(s.into())))
Some(html) => Some(Event::Html(html.into())), .or(Some(event))
None => 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))
},
} }
}, },
Tag::Image { link_type, dest_url, title, id } => Some(event), Event::End(tag) => {
Tag::MetadataBlock(_metadata_block_kind) => Some(event), 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))
},
} }
}, },
Event::End(_tag_end) => Some(event),
Event::Text(_cow_str) => Some(event), Event::Text(_cow_str) => Some(event),
Event::Code(_cow_str) => Some(event), Event::Code(_cow_str) => Some(event),
Event::InlineMath(_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]; let args = &capture[2];
match render_component(template, context! { args => parse_args(args)}, jinja_env){ match render_component(template, context! { args => parse_args(args)}, jinja_env){
Some(html) => html, 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(_) => { Err(e) => {
println!("ERROR: could not find template: {component}"); match e.kind() {
Some("".to_string()) minijinja::ErrorKind::TemplateNotFound => None,
_ => panic!("Failt to render component {}: {:?}", component, e),
}
}, },
} }
} }