markdown-ppp 2.9.2

Feature-rich Markdown Parsing and Pretty-Printing library
Documentation
use pretty::{Arena, DocAllocator, DocBuilder};

pub(crate) fn escape(value: &str) -> String {
    let mut escaped = String::new();
    for c in value.chars() {
        match c {
            '&' => escaped.push_str("&"),
            '<' => escaped.push_str("&lt;"),
            '>' => escaped.push_str("&gt;"),
            '"' => escaped.push_str("&quot;"),
            '\'' => escaped.push_str("&apos;"),
            _ => escaped.push(c),
        }
    }
    escaped
}

pub(crate) fn tag<'a>(
    state: &'a crate::html_printer::State<'a>,
    tag: &'static str,
    attributes: Vec<(String, String)>,
    inner: DocBuilder<'a, Arena<'a>, ()>,
) -> DocBuilder<'a, Arena<'a>, ()> {
    let mut attrs = state.arena.nil();
    for (key, value) in attributes {
        let attr = state
            .arena
            .text(" ")
            .append(state.arena.text(key))
            .append(state.arena.text("=\""))
            .append(state.arena.text(escape(&value)))
            .append(state.arena.text("\""));
        attrs = attrs.append(attr);
    }
    let open_tag = state
        .arena
        .text("<")
        .append(state.arena.text(tag))
        .append(attrs)
        .append(state.arena.text(">"));
    let close_tag = state
        .arena
        .text("</")
        .append(state.arena.text(tag))
        .append(state.arena.text(">"));
    open_tag.append(inner).append(close_tag)
}