pub struct ReferenceMap(/* private fields */);
Expand description
Storage for parsed references
If you have some external source for your link references, you can add them like this:
use markdown_that::parser::block::builtin::BlockParserRule;
use markdown_that::parser::core::{CoreRule, Root};
use markdown_that::plugins::cmark::block::reference::{ReferenceMap, DefaultReferenceMap, CustomReferenceMap};
use markdown_that::{MarkdownThat, Node};
let md = &mut MarkdownThat::new();
markdown_that::plugins::cmark::add(md);
#[derive(Debug, Default)]
struct RefMapOverride(DefaultReferenceMap);
impl CustomReferenceMap for RefMapOverride {
fn insert(&mut self, label: String, destination: String, title: Option<String>) -> bool {
self.0.insert(label, destination, title)
}
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)
}
}
struct AddCustomReferences;
impl CoreRule for AddCustomReferences {
fn run(root: &mut Node, _: &MarkdownThat) {
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 the user created by adding the following rule:
use markdown_that::parser::core::{CoreRule, Root};
use markdown_that::plugins::cmark::block::reference::{ReferenceMap, DefaultReferenceMap};
use markdown_that::{MarkdownThat, Node};
let md = &mut MarkdownThat::new();
markdown_that::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 ReferenceMap
impl Deref for ReferenceMap
Source§impl DerefMut for ReferenceMap
impl DerefMut for ReferenceMap
impl RootExt for ReferenceMap
Auto Trait Implementations§
impl Freeze for ReferenceMap
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>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Converts
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
, which can then be
downcast
into Box<dyn ConcreteType>
where ConcreteType
implements Trait
.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Converts
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
, which 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)
Converts
&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)
Converts
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.