aboutsummaryrefslogtreecommitdiff
path: root/crates/ide/src/link_rewrite.rs
diff options
context:
space:
mode:
authorflw <[email protected]>2020-09-26 06:02:09 +0100
committerflw <[email protected]>2020-09-29 12:47:18 +0100
commite73ee9dfa28e2c093cc79e0e8d729945c43f3c81 (patch)
tree633e533ce5aa3c10337bafc240e1f4911e4ecb65 /crates/ide/src/link_rewrite.rs
parent18c62c8a39d95ce3bb10ff5446bb589b1128a090 (diff)
Add hover config `linksInHover` to suppress links
Diffstat (limited to 'crates/ide/src/link_rewrite.rs')
-rw-r--r--crates/ide/src/link_rewrite.rs37
1 files changed, 36 insertions, 1 deletions
diff --git a/crates/ide/src/link_rewrite.rs b/crates/ide/src/link_rewrite.rs
index acedea71b..107787bb9 100644
--- a/crates/ide/src/link_rewrite.rs
+++ b/crates/ide/src/link_rewrite.rs
@@ -4,7 +4,7 @@
4 4
5use hir::{Adt, Crate, HasAttrs, ModuleDef}; 5use hir::{Adt, Crate, HasAttrs, ModuleDef};
6use ide_db::{defs::Definition, RootDatabase}; 6use ide_db::{defs::Definition, RootDatabase};
7use pulldown_cmark::{CowStr, Event, Options, Parser, Tag}; 7use pulldown_cmark::{CowStr, Event, LinkType, Options, Parser, Tag};
8use pulldown_cmark_to_cmark::{cmark_with_options, Options as CmarkOptions}; 8use pulldown_cmark_to_cmark::{cmark_with_options, Options as CmarkOptions};
9use url::Url; 9use url::Url;
10 10
@@ -45,6 +45,41 @@ pub fn rewrite_links(db: &RootDatabase, markdown: &str, definition: &Definition)
45 out 45 out
46} 46}
47 47
48/// Remove all links in markdown documentation.
49pub fn remove_links(markdown: &str) -> String {
50 let mut drop_link = false;
51
52 let mut opts = Options::empty();
53 opts.insert(Options::ENABLE_FOOTNOTES);
54
55 let doc = Parser::new_with_broken_link_callback(
56 markdown,
57 opts,
58 Some(&|_, _| Some((String::new(), String::new()))),
59 );
60 let doc = doc.filter_map(move |evt| match evt {
61 Event::Start(Tag::Link(link_type, ref target, ref title)) => {
62 if link_type == LinkType::Inline && target.contains("://") {
63 Some(Event::Start(Tag::Link(link_type, target.clone(), title.clone())))
64 } else {
65 drop_link = true;
66 None
67 }
68 }
69 Event::End(_) if drop_link => {
70 drop_link = false;
71 None
72 }
73 _ => Some(evt),
74 });
75
76 let mut out = String::new();
77 let mut options = CmarkOptions::default();
78 options.code_block_backticks = 3;
79 cmark_with_options(doc, &mut out, None, options).ok();
80 out
81}
82
48fn rewrite_intra_doc_link( 83fn rewrite_intra_doc_link(
49 db: &RootDatabase, 84 db: &RootDatabase,
50 def: Definition, 85 def: Definition,