markdown_ppp/parser/
mod.rs

1mod blocks;
2pub mod config;
3mod inline;
4mod link_util;
5mod util;
6
7use crate::ast::Document;
8use crate::parser::config::MarkdownParserConfig;
9use nom::{
10    branch::alt,
11    character::complete::{line_ending, space1},
12    combinator::eof,
13    multi::many0,
14    sequence::terminated,
15    Parser,
16};
17use std::rc::Rc;
18
19pub struct MarkdownParserState {
20    pub config: Rc<MarkdownParserConfig>,
21}
22
23impl MarkdownParserState {
24    pub fn with_config(config: MarkdownParserConfig) -> Self {
25        Self {
26            config: Rc::new(config),
27        }
28    }
29}
30
31impl Default for MarkdownParserState {
32    fn default() -> Self {
33        Self::with_config(MarkdownParserConfig::default())
34    }
35}
36
37/// Parse the given Markdown string into an AST.
38pub fn parse_markdown(
39    state: MarkdownParserState,
40    input: &str,
41) -> Result<Document, nom::Err<nom::error::Error<&str>>> {
42    let empty_lines = many0(alt((space1, line_ending)));
43    let mut parser = terminated(
44        many0(crate::parser::blocks::block(Rc::new(state))),
45        (empty_lines, eof),
46    );
47    let (_, blocks) = parser.parse(input)?;
48
49    Ok(Document { blocks })
50}