From 4431a3ad6274e8f608a2bafbb8f9962599ea87d7 Mon Sep 17 00:00:00 2001 From: Natty Date: Thu, 5 Oct 2023 22:25:29 +0200 Subject: [PATCH] Code block parsing --- magnetar_mmm_parser/src/lib.rs | 39 ++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/magnetar_mmm_parser/src/lib.rs b/magnetar_mmm_parser/src/lib.rs index b08ae5b..6cc9cb7 100644 --- a/magnetar_mmm_parser/src/lib.rs +++ b/magnetar_mmm_parser/src/lib.rs @@ -331,6 +331,45 @@ impl Context { Ok((input, boxing_sequence(Token::Center)(tokens))) } + fn tag_block_code<'a>(&self, input: Span<'a>) -> IResult, Token<'a>> { + let delim = &tag("```"); + + let (input, _) = opt(line_ending)(input)?; + + if input.get_column() != 0 { + return fail(input); + } + + let (input, _) = delim(input)?; + let (input, lang) = opt(map( + recognize(many1(tuple((not(delim), not_line_ending)))), + Span::into_fragment, + ))(input)?; + let (input, _) = line_ending(input)?; + + let (input, code) = map( + recognize(many1_count(tuple(( + not(tuple((line_ending, delim))), + anychar, + )))), + Span::into_fragment, + )(input)?; + + let (input, _) = line_ending(input)?; + let (input, _) = delim(input)?; + let (input, _) = many0(space)(input)?; + let (input, _) = not(not_line_ending)(input)?; + let (input, _) = opt(line_ending)(input)?; + + Ok(( + input, + Token::BlockCode { + lang: lang.map(<&str>::into), + inner: code.into(), + }, + )) + } + fn tag_block_math<'a>(&self, input: Span<'a>) -> IResult, Token<'a>> { let start = &tag("\\["); let end = &tag("\\]");