markdown-ppp 2.9.2

Feature-rich Markdown Parsing and Pretty-Printing library
Documentation
use crate::ast::Block;
use crate::parser::util::*;
use crate::parser::MarkdownParserState;
use nom::{
    character::complete::char,
    combinator::opt,
    multi::{many1, many_m_n},
    sequence::preceded,
    IResult, Parser,
};
use std::rc::Rc;

pub(crate) fn blockquote<'a>(
    state: Rc<MarkdownParserState>,
) -> impl FnMut(&'a str) -> IResult<&'a str, Vec<Block>> {
    move |input: &'a str| {
        // Block quote marker: 0-3 leading spaces, '>', optional space
        // Per CommonMark spec, the space after '>' is part of the marker and should be stripped
        let prefix = preceded(many_m_n(0, 3, char(' ')), (char('>'), opt(char(' '))));

        let (input, lines) =
            many1(preceded(prefix, line_terminated(not_eof_or_eol0))).parse(input)?;
        let inner = lines.join("\n");

        let nested_state = Rc::new(state.nested());
        let (_, inner) = many1(crate::parser::blocks::block(nested_state))
            .parse(&inner)
            .map_err(|err| err.map_input(|_| input))?;

        let inner = inner.into_iter().flatten().collect();

        Ok((input, inner))
    }
}