diff options
| author | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2023-02-18 14:10:38 +0400 |
|---|---|---|
| committer | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2023-02-18 14:45:01 +0400 |
| commit | ccdb598d1b495952bdb09122dc53c39b40f23758 (patch) | |
| tree | a21f00dcb8eae10686b34051bf36fb1a816547c1 /src/librustdoc/html | |
| parent | 34ba77d26064f9038fddd5349ceede088f8557f9 (diff) | |
| download | rust-ccdb598d1b495952bdb09122dc53c39b40f23758.tar.gz rust-ccdb598d1b495952bdb09122dc53c39b40f23758.zip | |
rustdoc: Cleanup broken link callbacks
Diffstat (limited to 'src/librustdoc/html')
| -rw-r--r-- | src/librustdoc/html/markdown.rs | 46 |
1 files changed, 17 insertions, 29 deletions
diff --git a/src/librustdoc/html/markdown.rs b/src/librustdoc/html/markdown.rs index 394bea3caee..a34628991b2 100644 --- a/src/librustdoc/html/markdown.rs +++ b/src/librustdoc/html/markdown.rs @@ -34,7 +34,6 @@ use rustc_span::{Span, Symbol}; use once_cell::sync::Lazy; use std::borrow::Cow; -use std::cell::RefCell; use std::collections::VecDeque; use std::default::Default; use std::fmt::Write; @@ -1226,14 +1225,12 @@ pub(crate) struct MarkdownLink { pub(crate) fn markdown_links<R>( md: &str, - filter_map: impl Fn(MarkdownLink) -> Option<R>, + preprocess_link: impl Fn(MarkdownLink) -> Option<R>, ) -> Vec<R> { if md.is_empty() { return vec![]; } - let links = RefCell::new(vec![]); - // FIXME: remove this function once pulldown_cmark can provide spans for link definitions. let locate = |s: &str, fallback: Range<usize>| unsafe { let s_start = s.as_ptr(); @@ -1265,21 +1262,14 @@ pub(crate) fn markdown_links<R>( } }; - let mut push = |link: BrokenLink<'_>| { - let span = span_for_link(&link.reference, link.span); - filter_map(MarkdownLink { - kind: LinkType::ShortcutUnknown, - link: link.reference.to_string(), - range: span, - }) - .map(|link| links.borrow_mut().push(link)); - None - }; - - for ev in Parser::new_with_broken_link_callback(md, main_body_opts(), Some(&mut push)) - .into_offset_iter() - { - if let Event::Start(Tag::Link( + Parser::new_with_broken_link_callback( + md, + main_body_opts(), + Some(&mut |link: BrokenLink<'_>| Some((link.reference, "".into()))), + ) + .into_offset_iter() + .filter_map(|(event, span)| match event { + Event::Start(Tag::Link( // `<>` links cannot be intra-doc links so we skip them. kind @ (LinkType::Inline | LinkType::Reference @@ -1290,16 +1280,14 @@ pub(crate) fn markdown_links<R>( | LinkType::ShortcutUnknown), dest, _, - )) = ev.0 - { - debug!("found link: {dest}"); - let span = span_for_link(&dest, ev.1); - filter_map(MarkdownLink { kind, link: dest.into_string(), range: span }) - .map(|link| links.borrow_mut().push(link)); - } - } - - links.into_inner() + )) => preprocess_link(MarkdownLink { + kind, + range: span_for_link(&dest, span), + link: dest.into_string(), + }), + _ => None, + }) + .collect() } #[derive(Debug)] |
