telegram-markdown-v2 0.2.0

Transform regular Markdown into Telegram MarkdownV2 (parse_mode = MarkdownV2).
Documentation
use std::collections::HashMap;

use markdown::mdast::Node;

use crate::types::Definition;

/// Collects all reference-style link definitions from a Markdown AST.
///
/// The returned map is keyed by each definition identifier as produced by the
/// parser.
pub fn collect_definitions(root: &Node) -> HashMap<String, Definition> {
    let mut definitions = HashMap::new();
    collect_recursive(root, &mut definitions);
    definitions
}

fn collect_recursive(node: &Node, definitions: &mut HashMap<String, Definition>) {
    if let Node::Definition(definition) = node {
        definitions.insert(
            definition.identifier.clone(),
            Definition {
                title: definition.title.clone(),
                url: definition.url.clone(),
            },
        );
    }

    for child in child_nodes(node) {
        collect_recursive(child, definitions);
    }
}

fn child_nodes(node: &Node) -> &[Node] {
    match node {
        Node::Root(n) => &n.children,
        Node::Blockquote(n) => &n.children,
        Node::List(n) => &n.children,
        Node::ListItem(n) => &n.children,
        Node::Paragraph(n) => &n.children,
        Node::Heading(n) => &n.children,
        Node::Strong(n) => &n.children,
        Node::Emphasis(n) => &n.children,
        Node::Delete(n) => &n.children,
        Node::Link(n) => &n.children,
        Node::LinkReference(n) => &n.children,
        Node::Table(n) => &n.children,
        Node::TableRow(n) => &n.children,
        Node::TableCell(n) => &n.children,
        _ => &[],
    }
}