1
1
//! Resolves and rewrites links in markdown documentation.
2
2
3
+ use std:: convert:: TryFrom ;
3
4
use std:: iter:: once;
4
5
5
6
use itertools:: Itertools ;
6
- use pulldown_cmark:: { CowStr , Event , LinkType , Options , Parser , Tag } ;
7
+ use pulldown_cmark:: { BrokenLink , CowStr , Event , InlineStr , LinkType , Options , Parser , Tag } ;
7
8
use pulldown_cmark_to_cmark:: { cmark_with_options, Options as CmarkOptions } ;
8
9
use url:: Url ;
9
10
@@ -24,11 +25,13 @@ pub type DocumentationLink = String;
24
25
25
26
/// Rewrite documentation links in markdown to point to an online host (e.g. docs.rs)
26
27
pub 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) ) ;
32
35
33
36
let doc = map_links ( doc, |target, title : & str | {
34
37
// This check is imperfect, there's some overlap between valid intra-doc links
@@ -66,11 +69,11 @@ pub fn remove_links(markdown: &str) -> String {
66
69
let mut opts = Options :: empty ( ) ;
67
70
opts. insert ( Options :: ENABLE_FOOTNOTES ) ;
68
71
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 ) ) ;
74
77
let doc = doc. filter_map ( move |evt| match evt {
75
78
Event :: Start ( Tag :: Link ( link_type, ref target, ref title) ) => {
76
79
if link_type == LinkType :: Inline && target. contains ( "://" ) {
0 commit comments