[[package]]
name = "pulldown-cmark"
-version = "0.7.2"
+version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca36dea94d187597e104a5c8e4b07576a8a45aa5db48a65e12940d3eb7461f55"
+checksum = "ffade02495f22453cd593159ea2f59827aae7f53fa8323f756799b670881dcf8"
dependencies = [
"bitflags",
"memchr",
[[package]]
name = "pulldown-cmark-to-cmark"
-version = "5.0.0"
+version = "6.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "32accf4473121d8c0b508ca5673363703762d6cc59cf25af1df48f653346f736"
+checksum = "e8f2b9878102358ec65434fdd1a9a161f8648bb2f531acc9260e4d094c96de23"
dependencies = [
"pulldown-cmark",
]
//! Resolves and rewrites links in markdown documentation.
+use std::convert::TryFrom;
use std::iter::once;
use itertools::Itertools;
-use pulldown_cmark::{CowStr, Event, LinkType, Options, Parser, Tag};
+use pulldown_cmark::{BrokenLink, CowStr, Event, InlineStr, LinkType, Options, Parser, Tag};
use pulldown_cmark_to_cmark::{cmark_with_options, Options as CmarkOptions};
use url::Url;
/// Rewrite documentation links in markdown to point to an online host (e.g. docs.rs)
pub fn rewrite_links(db: &RootDatabase, markdown: &str, definition: &Definition) -> String {
- let doc = Parser::new_with_broken_link_callback(
- markdown,
- Options::empty(),
- Some(&|label, _| Some((/*url*/ label.to_string(), /*title*/ label.to_string()))),
- );
+ let mut cb = |link: BrokenLink| {
+ Some((
+ /*url*/ link.reference.to_owned().into(),
+ /*title*/ link.reference.to_owned().into(),
+ ))
+ };
+ let doc = Parser::new_with_broken_link_callback(markdown, Options::empty(), Some(&mut cb));
let doc = map_links(doc, |target, title: &str| {
// This check is imperfect, there's some overlap between valid intra-doc links
let mut opts = Options::empty();
opts.insert(Options::ENABLE_FOOTNOTES);
- let doc = Parser::new_with_broken_link_callback(
- markdown,
- opts,
- Some(&|_, _| Some((String::new(), String::new()))),
- );
+ let mut cb = |_: BrokenLink| {
+ let empty = InlineStr::try_from("").unwrap();
+ Some((CowStr::Inlined(empty.clone()), CowStr::Inlined(empty)))
+ };
+ let doc = Parser::new_with_broken_link_callback(markdown, opts, Some(&mut cb));
let doc = doc.filter_map(move |evt| match evt {
Event::Start(Tag::Link(link_type, ref target, ref title)) => {
if link_type == LinkType::Inline && target.contains("://") {