Struct markdown_it::plugins::cmark::block::reference::ReferenceMap
source · pub struct ReferenceMap(_);Expand description
Storage for parsed references
if you have some external source for your link references, you can add them like this:
use markdown_it::parser::block::builtin::BlockParserRule;
use markdown_it::parser::core::{CoreRule, Root};
use markdown_it::plugins::cmark::block::reference::{ReferenceMap, DefaultReferenceMap, CustomReferenceMap};
use markdown_it::{MarkdownIt, Node};
let md = &mut MarkdownIt::new();
markdown_it::plugins::cmark::add(md);
#[derive(Debug, Default)]
struct RefMapOverride(DefaultReferenceMap);
impl CustomReferenceMap for RefMapOverride {
fn get(&self, label: &str) -> Option<(&str, Option<&str>)> {
// override a specific link
if label == "rust" {
return Some((
"https://www.rust-lang.org/",
Some("The Rust Language"),
));
}
self.0.get(label)
}
fn insert(&mut self, label: String, destination: String, title: Option<String>) -> bool {
self.0.insert(label, destination, title)
}
}
struct AddCustomReferences;
impl CoreRule for AddCustomReferences {
fn run(root: &mut Node, _: &MarkdownIt) {
let data = root.cast_mut::<Root>().unwrap();
data.ext.insert(ReferenceMap::new(RefMapOverride::default()));
}
}
md.add_rule::<AddCustomReferences>()
.before::<BlockParserRule>();
let html = md.parse("[rust]").render();
assert_eq!(
html.trim(),
r#"<p><a href="https://www.rust-lang.org/" title="The Rust Language">rust</a></p>"#
);You can also view all references that user created by adding the following rule:
use markdown_it::parser::core::{CoreRule, Root};
use markdown_it::plugins::cmark::block::reference::{ReferenceMap, DefaultReferenceMap};
use markdown_it::{MarkdownIt, Node};
let md = &mut MarkdownIt::new();
markdown_it::plugins::cmark::add(md);
let ast = md.parse("[hello]: world");
let root = ast.node_value.downcast_ref::<Root>().unwrap();
let refmap = root.ext.get::<ReferenceMap>()
.map(|m| m.downcast_ref::<DefaultReferenceMap>().expect("expect references to be handled by default map"));
let mut labels = vec![];
if let Some(refmap) = refmap {
for (label, _dest, _title) in refmap.iter() {
labels.push(label);
}
}
assert_eq!(labels, ["hello"]);Implementations§
source§impl ReferenceMap
impl ReferenceMap
pub fn new(custom_map: impl CustomReferenceMap + 'static) -> Self
Trait Implementations§
source§impl Debug for ReferenceMap
impl Debug for ReferenceMap
source§impl Default for ReferenceMap
impl Default for ReferenceMap
source§impl Deref for ReferenceMapwhere
Box<dyn CustomReferenceMap>: Deref,
impl Deref for ReferenceMapwhere Box<dyn CustomReferenceMap>: Deref,
source§impl DerefMut for ReferenceMapwhere
Box<dyn CustomReferenceMap>: DerefMut,
impl DerefMut for ReferenceMapwhere Box<dyn CustomReferenceMap>: DerefMut,
impl RootExt for ReferenceMap
Auto Trait Implementations§
impl !RefUnwindSafe for ReferenceMap
impl Send for ReferenceMap
impl Sync for ReferenceMap
impl Unpin for ReferenceMap
impl !UnwindSafe for ReferenceMap
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere T: Any,
source§fn into_any(self: Box<T, Global>) -> Box<dyn Any + 'static, Global>
fn into_any(self: Box<T, Global>) -> Box<dyn Any + 'static, Global>
Convert
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any + 'static>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any + 'static>
Convert
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
Convert
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
Convert
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.