Markdown parser fork with extended syntax for personal use.
at main 79 lines 2.3 kB view raw
1//! Turn bytes of markdown into events. 2 3use crate::event::{Event, Point}; 4use crate::message; 5use crate::state::{Name as StateName, State}; 6use crate::subtokenize::subtokenize; 7use crate::tokenizer::Tokenizer; 8use crate::util::location::Location; 9use crate::ParseOptions; 10use alloc::{string::String, vec, vec::Vec}; 11 12/// Info needed, in all content types, when parsing markdown. 13/// 14/// Importantly, this contains a set of known definitions. 15/// It also references the input value as bytes (`u8`). 16#[derive(Debug)] 17pub struct ParseState<'a> { 18 /// Configuration. 19 pub location: Option<Location>, 20 /// Configuration. 21 pub options: &'a ParseOptions, 22 /// List of chars. 23 pub bytes: &'a [u8], 24 /// Set of defined definition identifiers. 25 pub definitions: Vec<String>, 26 /// Set of defined GFM footnote definition identifiers. 27 pub gfm_footnote_definitions: Vec<String>, 28} 29 30/// Turn a string of markdown into events. 31/// 32/// Passes the bytes back so the compiler can access the source. 33pub fn parse<'a>( 34 value: &'a str, 35 options: &'a ParseOptions, 36) -> Result<(Vec<Event>, ParseState<'a>), message::Message> { 37 let bytes = value.as_bytes(); 38 39 let mut parse_state = ParseState { 40 options, 41 bytes, 42 location: if options.mdx_esm_parse.is_some() || options.mdx_expression_parse.is_some() { 43 Some(Location::new(bytes)) 44 } else { 45 None 46 }, 47 definitions: vec![], 48 gfm_footnote_definitions: vec![], 49 }; 50 51 let start = Point { 52 line: 1, 53 column: 1, 54 index: 0, 55 vs: 0, 56 }; 57 let mut tokenizer = Tokenizer::new(start, &parse_state); 58 59 let state = tokenizer.push( 60 (0, 0), 61 (parse_state.bytes.len(), 0), 62 State::Next(StateName::DocumentStart), 63 ); 64 let mut result = tokenizer.flush(state, true)?; 65 let mut events = tokenizer.events; 66 67 loop { 68 let fn_defs = &mut parse_state.gfm_footnote_definitions; 69 let defs = &mut parse_state.definitions; 70 fn_defs.append(&mut result.gfm_footnote_definitions); 71 defs.append(&mut result.definitions); 72 73 if result.done { 74 return Ok((events, parse_state)); 75 } 76 77 result = subtokenize(&mut events, &parse_state, None)?; 78 } 79}