diff --git a/src/markdown.rs b/src/markdown.rs index 8465413..21793bc 100644 --- a/src/markdown.rs +++ b/src/markdown.rs @@ -1,15 +1,21 @@ use syntect::highlighting::ThemeSet; use syntect::parsing::SyntaxSet; -use pulldown_cmark::{Event, Options, Parser, Tag, TagEnd, TextMergeStream}; +use pulldown_cmark::{CodeBlockKind, BlockQuoteKind, Event, Options, Parser, Tag, TagEnd, TextMergeStream, CowStr, LinkType}; pub fn markdown_to_html(markdown: &str, ss: &SyntaxSet, ts: &ThemeSet, _file_path: &str) -> String { let mut options = Options::empty(); - options.insert(Options::ENABLE_TASKLISTS); options.insert(Options::ENABLE_TABLES); - options.insert(Options::ENABLE_DEFINITION_LIST); - options.insert(Options::ENABLE_HEADING_ATTRIBUTES); + options.insert(Options::ENABLE_FOOTNOTES); options.insert(Options::ENABLE_STRIKETHROUGH); + options.insert(Options::ENABLE_TASKLISTS); + options.insert(Options::ENABLE_HEADING_ATTRIBUTES); + options.insert(Options::ENABLE_DEFINITION_LIST); + options.insert(Options::ENABLE_MATH); + options.insert(Options::ENABLE_GFM); + + let mut in_code_block = false; + let mut code_content = String::new(); let mut html_output = String::new(); @@ -18,29 +24,48 @@ pub fn markdown_to_html(markdown: &str, ss: &SyntaxSet, ts: &ThemeSet, _file_pat for event in iterator { match event { Event::Start(tag) => { + if let Tag::CodeBlock(_) = tag { + in_code_block = true; + code_content.clear(); + } html_output.push_str(render_start_tag(tag).as_str()); }, Event::End(tag) => { + if let TagEnd::CodeBlock = tag { + in_code_block = false; + html_output.push_str(escape_html(code_content.as_str()).as_str()); + } html_output.push_str(render_end_tag(tag).as_str()); + }, Event::Text(text) => { - html_output.push_str(text.to_string().as_str()); + if in_code_block { + code_content.push_str(&text); + } else { + html_output.push_str(&escape_html(&text)); + } }, Event::TaskListMarker(checked) => { if checked { - html_output.push_str(""); + html_output.push_str(""); } else { - html_output.push_str(""); + html_output.push_str(""); } }, Event::Code(code) => { - html_output.push_str(format!("{}", code.to_string()).as_str()); + html_output.push_str(format!("{}", escape_html(&code)).as_str()); }, + Event::SoftBreak => html_output.push_str(""), + + Event::Rule => html_output.push_str("
"), + + Event::InlineHtml(_) => (), + Event::Html(_) => (), + other => println!("[*] Event {:?}", other), } } - println!("{}", html_output); html_output } @@ -56,7 +81,19 @@ fn render_start_tag(tag: Tag<'_>) -> String { Tag::List(Some(_)) => output.push_str("
    "), Tag::List(None) => output.push_str("