sable-markdown/src/parser/blocks/blockquote.rs@main
raw
1use nom::{
2 IResult, Parser,
3 character::complete::char,
4 multi::{many_m_n, many1},
5 sequence::preceded,
6};
7
8use crate::{
9 ast::Block,
10 parser::util::{line_terminated, not_eof_or_eol0},
11};
12
13pub(super) fn blockquote<'a>() -> impl FnMut(&'a str) -> IResult<&'a str, Vec<Block>> {
14 move |input: &'a str| {
15 let prefix = preceded(many_m_n(0, 3, char(' ')), char('>'));
16
17 let (input, lines) =
18 many1(preceded(prefix, line_terminated(not_eof_or_eol0))).parse(input)?;
19 let inner = lines.join("\n");
20
21 let (_, inner) = many1(crate::parser::blocks::block())
22 .parse(&inner)
23 .map_err(|err| err.map_input(|_| input))?;
24
25 let inner = inner.into_iter().flatten().collect();
26
27 Ok((input, inner))
28 }
29}
30