From 3297e5230e86b67c4013f8133aefd2c9d47cc464 Mon Sep 17 00:00:00 2001 From: adamelmore <2363879+adamdottv@users.noreply.github.com> Date: Tue, 27 Jan 2026 08:11:06 -0600 Subject: [PATCH] fix(app): open markdown links in external browser --- packages/desktop/src-tauri/src/markdown.rs | 47 +++++++++++++++++++++- 1 file changed, 45 insertions(+), 2 deletions(-) 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]