all lots more components
This commit is contained in:
@@ -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<String> {
|
||||
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"^%(?<tags>[^%]+)%").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))
|
||||
},
|
||||
}
|
||||
},
|
||||
Tag::Image { link_type, dest_url, title, id } => Some(event),
|
||||
Tag::MetadataBlock(_metadata_block_kind) => 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))
|
||||
},
|
||||
}
|
||||
},
|
||||
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),
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user