sable-markdown/src/parser/blocks/mod.rs@main
raw
1mod blockquote;
2mod callout;
3mod code_block;
4mod footnote_definition;
5mod heading;
6mod html_block;
7mod link_definition;
8mod list;
9mod paragraph;
10mod table;
11mod thematic_break;
12
13#[cfg(test)]
14mod tests;
15
16use nom::{IResult, Parser, branch::alt, combinator::map, sequence::preceded};
17
18use crate::{
19 ast::Block,
20 parser::util::{eof_or_eol, line_terminated, many_empty_lines0},
21};
22
23pub(super) fn block<'a>() -> impl FnMut(&'a str) -> IResult<&'a str, Vec<Block>> {
24 move |input: &'a str| {
25 preceded(
26 many_empty_lines0,
27 alt((
28 map(code_block::code_block(), Block::CodeBlock),
29 map(heading::heading_v1(), Block::Heading),
30 heading::heading_v2_or_paragraph(),
31 map(thematic_break::thematic_break(), |()| Block::ThematicBreak),
32 map(callout::callout(), Block::Callout),
33 map(blockquote::blockquote(), Block::BlockQuote),
34 map(list::list(), Block::List),
35 map(html_block::html_block(), |s| Block::HtmlBlock(s.to_owned())),
36 map(
38 footnote_definition::footnote_definition(),
39 Block::FootnoteDefinition,
40 ),
41 map(link_definition::link_definition(), Block::Definition),
42 map(table::table(), Block::Table),
43 map(paragraph::paragraph(false), Block::Paragraph),
44 ))
45 .map(|v| vec![v]),
46 )
47 .parse(input)
48 }
49}
50