markdown: Use parsed text (#24388)
Fixes #15463 Release Notes: - Fixed display of symbols such as ` ` in hover popovers
This commit is contained in:
parent
888a2df3f0
commit
e689c8c01b
4 changed files with 40 additions and 24 deletions
|
@ -37,9 +37,10 @@ pub fn parse_markdown(text: &str) -> Vec<(Range<usize>, MarkdownEvent)> {
|
|||
}
|
||||
events.push((range, MarkdownEvent::End(tag)));
|
||||
}
|
||||
pulldown_cmark::Event::Text(_) => {
|
||||
pulldown_cmark::Event::Text(parsed) => {
|
||||
// Automatically detect links in text if we're not already within a markdown
|
||||
// link.
|
||||
let mut parsed = parsed.as_ref();
|
||||
if !within_link {
|
||||
let mut finder = LinkFinder::new();
|
||||
finder.kinds(&[linkify::LinkKind::Url]);
|
||||
|
@ -49,7 +50,12 @@ pub fn parse_markdown(text: &str) -> Vec<(Range<usize>, MarkdownEvent)> {
|
|||
text_range.start + link.start()..text_range.start + link.end();
|
||||
|
||||
if link_range.start > range.start {
|
||||
events.push((range.start..link_range.start, MarkdownEvent::Text));
|
||||
let (text, tail) = parsed.split_at(link_range.start - range.start);
|
||||
events.push((
|
||||
range.start..link_range.start,
|
||||
MarkdownEvent::Text(SharedString::new(text)),
|
||||
));
|
||||
parsed = tail;
|
||||
}
|
||||
|
||||
events.push((
|
||||
|
@ -61,15 +67,20 @@ pub fn parse_markdown(text: &str) -> Vec<(Range<usize>, MarkdownEvent)> {
|
|||
id: SharedString::default(),
|
||||
}),
|
||||
));
|
||||
events.push((link_range.clone(), MarkdownEvent::Text));
|
||||
|
||||
let (link_text, tail) = parsed.split_at(link_range.end - link_range.start);
|
||||
events.push((
|
||||
link_range.clone(),
|
||||
MarkdownEvent::Text(SharedString::new(link_text)),
|
||||
));
|
||||
events.push((link_range.clone(), MarkdownEvent::End(MarkdownTagEnd::Link)));
|
||||
|
||||
range.start = link_range.end;
|
||||
parsed = tail;
|
||||
}
|
||||
}
|
||||
|
||||
if range.start < range.end {
|
||||
events.push((range, MarkdownEvent::Text));
|
||||
events.push((range, MarkdownEvent::Text(SharedString::new(parsed))));
|
||||
}
|
||||
}
|
||||
pulldown_cmark::Event::Code(_) => {
|
||||
|
@ -94,7 +105,7 @@ pub fn parse_markdown(text: &str) -> Vec<(Range<usize>, MarkdownEvent)> {
|
|||
events
|
||||
}
|
||||
|
||||
pub fn parse_links_only(text: &str) -> Vec<(Range<usize>, MarkdownEvent)> {
|
||||
pub fn parse_links_only(mut text: &str) -> Vec<(Range<usize>, MarkdownEvent)> {
|
||||
let mut events = Vec::new();
|
||||
let mut finder = LinkFinder::new();
|
||||
finder.kinds(&[linkify::LinkKind::Url]);
|
||||
|
@ -106,9 +117,15 @@ pub fn parse_links_only(text: &str) -> Vec<(Range<usize>, MarkdownEvent)> {
|
|||
let link_range = link.start()..link.end();
|
||||
|
||||
if link_range.start > text_range.start {
|
||||
events.push((text_range.start..link_range.start, MarkdownEvent::Text));
|
||||
let (head, tail) = text.split_at(link_range.start - text_range.start);
|
||||
events.push((
|
||||
text_range.start..link_range.start,
|
||||
MarkdownEvent::Text(SharedString::new(head)),
|
||||
));
|
||||
text = tail;
|
||||
}
|
||||
|
||||
let (link_text, tail) = text.split_at(link_range.end - link_range.start);
|
||||
events.push((
|
||||
link_range.clone(),
|
||||
MarkdownEvent::Start(MarkdownTag::Link {
|
||||
|
@ -118,14 +135,18 @@ pub fn parse_links_only(text: &str) -> Vec<(Range<usize>, MarkdownEvent)> {
|
|||
id: SharedString::default(),
|
||||
}),
|
||||
));
|
||||
events.push((link_range.clone(), MarkdownEvent::Text));
|
||||
events.push((
|
||||
link_range.clone(),
|
||||
MarkdownEvent::Text(SharedString::new(link_text)),
|
||||
));
|
||||
events.push((link_range.clone(), MarkdownEvent::End(MarkdownTagEnd::Link)));
|
||||
|
||||
text_range.start = link_range.end;
|
||||
text = tail;
|
||||
}
|
||||
|
||||
if text_range.end > text_range.start {
|
||||
events.push((text_range, MarkdownEvent::Text));
|
||||
events.push((text_range, MarkdownEvent::Text(SharedString::new(text))));
|
||||
}
|
||||
|
||||
events
|
||||
|
@ -142,7 +163,7 @@ pub enum MarkdownEvent {
|
|||
/// End of a tagged element.
|
||||
End(MarkdownTagEnd),
|
||||
/// A text node.
|
||||
Text,
|
||||
Text(SharedString),
|
||||
/// An inline code node.
|
||||
Code,
|
||||
/// An HTML node.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue