diff --git a/src/parser/greater_block.rs b/src/parser/greater_block.rs index d8b6d8c7..65f0747b 100644 --- a/src/parser/greater_block.rs +++ b/src/parser/greater_block.rs @@ -5,22 +5,21 @@ use nom::character::complete::anychar; use nom::character::complete::line_ending; use nom::character::complete::space0; use nom::character::complete::space1; -use nom::combinator::consumed; use nom::combinator::eof; use nom::combinator::not; use nom::combinator::opt; use nom::combinator::peek; use nom::combinator::recognize; use nom::combinator::verify; -use nom::multi::many0; use nom::multi::many_till; -use nom::sequence::preceded; use nom::sequence::tuple; use super::affiliated_keyword::parse_affiliated_keywords; use super::org_source::OrgSource; +use super::paragraph::empty_paragraph; use super::util::in_section; use super::util::maybe_consume_trailing_whitespace_if_not_exiting; +use crate::context::bind_context; use crate::context::parser_with_context; use crate::context::ContextElement; use crate::context::ContextMatcher; @@ -37,7 +36,6 @@ use crate::parser::util::start_of_line; use crate::types::CenterBlock; use crate::types::Element; use crate::types::Keyword; -use crate::types::Paragraph; use crate::types::QuoteBlock; use crate::types::SpecialBlock; @@ -265,18 +263,19 @@ fn greater_block_body<'c, 'b, 'g, 'r, 's>( let exit_matcher = parser_with_context!(exit_matcher_parser)(&parser_context); not(exit_matcher)(remaining)?; let contents_begin = remaining; - let (remaining, leading_blank_lines) = opt(consumed(tuple(( - blank_line, - many0(preceded(not(exit_matcher), blank_line)), - ))))(remaining)?; - let leading_blank_lines = - leading_blank_lines.map(|(source, (first_line, _remaining_lines))| { - Element::Paragraph(Paragraph::of_text(source.into(), first_line.into())) - }); + + let blank_line_context = ContextElement::ExitMatcherNode(ExitMatcherNode { + class: ExitClass::Alpha, + exit_matcher: &leading_blank_lines_end, + }); + let blank_line_context = parser_context.with_additional_node(&blank_line_context); + + let (remaining, leading_blank_lines) = + opt(bind_context!(empty_paragraph, &blank_line_context))(remaining)?; let (remaining, (mut children, _exit_contents)) = many_till(element_matcher, exit_matcher)(remaining)?; if let Some(lines) = leading_blank_lines { - children.insert(0, lines); + children.insert(0, Element::Paragraph(lines)); } let contents = get_consumed(contents_begin, remaining); @@ -335,3 +334,14 @@ fn _greater_block_end<'b, 'g, 'r, 's, 'c>( let source = get_consumed(input, remaining); Ok((remaining, source)) } + +#[cfg_attr( + feature = "tracing", + tracing::instrument(ret, level = "debug", skip(_context)) +)] +fn leading_blank_lines_end<'b, 'g, 'r, 's, 'c>( + _context: RefContext<'b, 'g, 'r, 's>, + input: OrgSource<'s>, +) -> Res, OrgSource<'s>> { + recognize(not(blank_line))(input) +}