11//! Resolves and rewrites links in markdown documentation.
22
3+ use std:: convert:: TryFrom ;
34use std:: iter:: once;
45
56use itertools:: Itertools ;
6- use pulldown_cmark:: { CowStr , Event , LinkType , Options , Parser , Tag } ;
7+ use pulldown_cmark:: { BrokenLink , CowStr , Event , InlineStr , LinkType , Options , Parser , Tag } ;
78use pulldown_cmark_to_cmark:: { cmark_with_options, Options as CmarkOptions } ;
89use url:: Url ;
910
@@ -24,11 +25,13 @@ pub type DocumentationLink = String;
2425
2526/// Rewrite documentation links in markdown to point to an online host (e.g. docs.rs)
2627pub fn rewrite_links ( db : & RootDatabase , markdown : & str , definition : & Definition ) -> String {
27- let doc = Parser :: new_with_broken_link_callback (
28- markdown,
29- Options :: empty ( ) ,
30- Some ( & |label, _| Some ( ( /*url*/ label. to_string ( ) , /*title*/ label. to_string ( ) ) ) ) ,
31- ) ;
28+ let mut cb = |link : BrokenLink | {
29+ Some ( (
30+ /*url*/ link. reference . to_owned ( ) . into ( ) ,
31+ /*title*/ link. reference . to_owned ( ) . into ( ) ,
32+ ) )
33+ } ;
34+ let doc = Parser :: new_with_broken_link_callback ( markdown, Options :: empty ( ) , Some ( & mut cb) ) ;
3235
3336 let doc = map_links ( doc, |target, title : & str | {
3437 // This check is imperfect, there's some overlap between valid intra-doc links
@@ -66,11 +69,11 @@ pub fn remove_links(markdown: &str) -> String {
6669 let mut opts = Options :: empty ( ) ;
6770 opts. insert ( Options :: ENABLE_FOOTNOTES ) ;
6871
69- let doc = Parser :: new_with_broken_link_callback (
70- markdown ,
71- opts ,
72- Some ( & |_ , _| Some ( ( String :: new ( ) , String :: new ( ) ) ) ) ,
73- ) ;
72+ let mut cb = |_ : BrokenLink | {
73+ let empty = InlineStr :: try_from ( "" ) . unwrap ( ) ;
74+ Some ( ( CowStr :: Inlined ( empty . clone ( ) ) , CowStr :: Inlined ( empty ) ) )
75+ } ;
76+ let doc = Parser :: new_with_broken_link_callback ( markdown , opts , Some ( & mut cb ) ) ;
7477 let doc = doc. filter_map ( move |evt| match evt {
7578 Event :: Start ( Tag :: Link ( link_type, ref target, ref title) ) => {
7679 if link_type == LinkType :: Inline && target. contains ( "://" ) {
0 commit comments