unidok_parser/
lib.rs

1#[cfg(test)]
2#[macro_use]
3mod test_macros;
4
5mod accumulate;
6mod blocks;
7mod html;
8mod inlines;
9mod input;
10mod macros;
11mod parse;
12mod parsing_mode;
13mod state;
14mod utils;
15
16use crate::blocks::ParseBlock;
17use crate::parse::{Parse, ParseInfallible};
18use crate::state::{Context, ParsingState};
19use crate::utils::Indents;
20
21use unidok_repr::ast::AstData;
22use unidok_repr::config::Config;
23use unidok_repr::ir::blocks::AnnBlock;
24use unidok_repr::ir::IrState;
25use unidok_repr::{IntoIR, SyntaxSpan, ToSpans};
26
27pub use crate::input::Input;
28
29pub struct Doc<'a> {
30    pub blocks: Vec<AnnBlock<'a>>,
31    pub state: IrState<'a>,
32    pub spans: Vec<SyntaxSpan>,
33}
34
35pub fn parse(input: &mut Input, config: Config) -> Doc<'_> {
36    let parsed = input.parse(ParseBlock::new_multi(None, ParsingState::new_global())).unwrap();
37    assert!(input.is_empty());
38
39    let mut spans = Vec::new();
40    if config.retrieve_spans {
41        for p in &parsed {
42            p.to_spans(&mut spans);
43        }
44    }
45
46    let mut data = AstData::new(config);
47    accumulate::accumulate_block_data(&parsed, &mut data, false, &input.text);
48
49    let blocks = parsed.into_ir(&input.text, &mut data);
50    let state = IrState::new(&input.text, data);
51    Doc { blocks, state, spans }
52}