markdown_preview: Fix markdown parser producing invalid link highlights (#40239)
Fixes ZED-1YC Fixes ZED-1YK Release Notes: - N/A *or* Added/Fixed/Improved ...
This commit is contained in:
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user