From b0b83ef5aa8e3e0682186aefe185fa93804d4e80 Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Wed, 15 Oct 2025 10:54:39 +0200 Subject: [PATCH] markdown_preview: Fix markdown parser producing invalid link highlights (#40239) Fixes ZED-1YC Fixes ZED-1YK Release Notes: - N/A *or* Added/Fixed/Improved ... --- .../markdown_preview/src/markdown_parser.rs | 28 ++++++++----------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/crates/markdown_preview/src/markdown_parser.rs b/crates/markdown_preview/src/markdown_parser.rs index b7eb73c60a049ca7adb03160d124904bab4cee89..2d621b2b2273b169bb60df98c6ec7d2cb8587373 100644 --- a/crates/markdown_preview/src/markdown_parser.rs +++ b/crates/markdown_preview/src/markdown_parser.rs @@ -9,7 +9,9 @@ use html5ever::{ParseOpts, local_name, parse_document, tendril::TendrilSink}; use language::LanguageRegistry; use markup5ever_rcdom::RcDom; use pulldown_cmark::{Alignment, Event, Options, Parser, Tag, TagEnd}; -use std::{cell::RefCell, collections::HashMap, ops::Range, path::PathBuf, rc::Rc, sync::Arc, vec}; +use std::{ + cell::RefCell, collections::HashMap, mem, ops::Range, path::PathBuf, rc::Rc, sync::Arc, vec, +}; pub async fn parse_markdown( markdown_input: &str, @@ -290,18 +292,16 @@ impl<'a> MarkdownParser<'a> { finder.kinds(&[linkify::LinkKind::Url]); let mut last_link_len = prev_len; for link in finder.links(t) { - let start = link.start(); - let end = link.end(); - let range = (prev_len + start)..(prev_len + end); + let start = prev_len + link.start(); + let end = prev_len + link.end(); + let range = start..end; link_ranges.push(range.clone()); link_urls.push(link.as_str().to_string()); // If there is a style before we match a link, we have to add this to the highlighted ranges - if style != MarkdownHighlightStyle::default() - && last_link_len < link.start() - { + if style != MarkdownHighlightStyle::default() && last_link_len < start { highlights.push(( - last_link_len..link.start(), + last_link_len..start, MarkdownHighlight::Style(style.clone()), )); } @@ -374,15 +374,11 @@ impl<'a> MarkdownParser<'a> { if !text.is_empty() { let parsed_regions = MarkdownParagraphChunk::Text(ParsedMarkdownText { source_range: source_range.clone(), - contents: text.into(), - highlights: highlights.clone(), - region_ranges: region_ranges.clone(), - regions: regions.clone(), + contents: mem::take(&mut text).into(), + highlights: mem::take(&mut highlights), + region_ranges: mem::take(&mut region_ranges), + regions: mem::take(&mut regions), }); - text = String::new(); - highlights = vec![]; - region_ranges = vec![]; - regions = vec![]; markdown_text_like.push(parsed_regions); } image = Image::identify(