wayver's git archive


an obsidian renderer
git clone https://git.wayver.dev/sable

sable-markdown/src/parser/blocks/mod.rs@2b84405277e54ab809e328cf0237374d4b4dbd0c

raw
Date Commit Message Author Files + -
2026-02-23 01:55 initial mvp wayverd 139 17808 0
...

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                // Alway try before link definition
37                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