use crate::util::md_tools::md_parse::*;
use pulldown_cmark::{Options, Parser, RefDefs};
use std::collections::HashMap;
type BaseParser<'a> = Parser<'a, BrokenLinkSolver>;
pub(crate) struct MdParser<'a> {
pub events: BaseParser<'a>,
pub defs: HashMap<String, String>,
}
impl<'a> MdParser<'a> {
pub fn parse(text: &'a str) -> Self {
let options = Self::options();
let callback = Some(BrokenLinkSolver());
let events = Parser::new_with_broken_link_callback(text, options, callback);
let defs = Self::to_hash_map(events.reference_definitions());
Self { events, defs }
}
pub(crate) fn to_hash_map(rd: &RefDefs) -> HashMap<String, String> {
let mut ret = HashMap::new();
for (key, def) in rd.iter() {
ret.insert(key.to_string(), def.dest.to_string());
}
ret
}
fn options() -> Options {
let mut ret = Options::empty();
ret.insert(Options::ENABLE_TABLES);
ret.insert(Options::ENABLE_FOOTNOTES);
ret.insert(Options::ENABLE_TASKLISTS);
ret.insert(Options::ENABLE_STRIKETHROUGH);
ret.insert(Options::ENABLE_SMART_PUNCTUATION);
ret
}
}