use markdown_it::{MarkdownIt, Node, NodeValue, Renderer};
use markdown_it::parser::core::CoreRule;
use super::block_rule::BlockFerris;
use super::inline_rule::InlineFerris;
#[derive(Debug)]
pub struct FerrisCounter(usize);
impl NodeValue for FerrisCounter {
fn render(&self, node: &Node, fmt: &mut dyn Renderer) {
let mut attrs = node.attrs.clone();
attrs.push(("class", "ferris-counter".into()));
fmt.cr(); fmt.open("footer", &attrs);
#[allow(clippy::useless_format)] fmt.text(&match self.0 {
0 => format!("No crabs around here."),
1 => format!("There is a crab lurking in this document."),
_ => format!("There are {} crabs lurking in this document.", self.0),
});
fmt.close("footer");
fmt.cr();
}
}
struct FerrisCounterRule;
impl CoreRule for FerrisCounterRule {
fn run(root: &mut Node, _: &MarkdownIt) {
let mut counter = 0;
root.walk(|node, _| {
if node.is::<InlineFerris>() || node.is::<BlockFerris>() {
counter += 1;
}
});
root.children.push(Node::new(FerrisCounter(counter)))
}
}
pub fn add(md: &mut MarkdownIt) {
md.add_rule::<FerrisCounterRule>();
}