diff --git a/packages/desktop/src-tauri/src/markdown.rs b/packages/desktop/src-tauri/src/markdown.rs index a2a53b222..c3ca73857 100644 --- a/packages/desktop/src-tauri/src/markdown.rs +++ b/packages/desktop/src-tauri/src/markdown.rs @@ -1,4 +1,43 @@ -use comrak::{markdown_to_html, Options}; +use comrak::{create_formatter, parse_document, Arena, Options, html::ChildRendering, nodes::NodeValue}; +use std::fmt::Write; + +create_formatter!(ExternalLinkFormatter, { + NodeValue::Link(ref nl) => |context, node, entering| { + let skip = context.options.parse.relaxed_autolinks + && node.parent().is_some_and(|p| comrak::node_matches!(p, NodeValue::Link(..))); + if skip { + return Ok(ChildRendering::HTML); + } + + if entering { + context.write_str("", + )?; + } else { + context.write_str("")?; + } + }, +}); pub fn parse_markdown(input: &str) -> String { let mut options = Options::default(); @@ -8,7 +47,11 @@ pub fn parse_markdown(input: &str) -> String { options.extension.autolink = true; options.render.r#unsafe = true; - markdown_to_html(input, &options) + let arena = Arena::new(); + let doc = parse_document(&arena, input, &options); + let mut html = String::new(); + ExternalLinkFormatter::format_document(doc, &options, &mut html).unwrap_or_default(); + html } #[tauri::command]