markdown_ppp/parser/
mod.rs1mod blocks;
2mod 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
37pub 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}