Move consuming trailing element whitespace inside the parsers.
This ensures the parsers can take into account the affiliated keywords when setting their source without needing the SetSource trait.
This commit is contained in:
@@ -21,6 +21,7 @@ use super::keyword::affiliated_keyword;
|
||||
use super::org_source::OrgSource;
|
||||
use super::util::get_name;
|
||||
use super::util::in_section;
|
||||
use super::util::maybe_consume_trailing_whitespace_if_not_exiting;
|
||||
use crate::context::parser_with_context;
|
||||
use crate::context::ContextElement;
|
||||
use crate::context::ContextMatcher;
|
||||
@@ -48,6 +49,7 @@ pub(crate) fn greater_block<'b, 'g, 'r, 's>(
|
||||
context: RefContext<'b, 'g, 'r, 's>,
|
||||
input: OrgSource<'s>,
|
||||
) -> Res<OrgSource<'s>, Element<'s>> {
|
||||
let pre_affiliated_keywords_input = input;
|
||||
let (input, affiliated_keywords) = many0(affiliated_keyword)(input)?;
|
||||
start_of_line(input)?;
|
||||
let (remaining, _leading_whitespace) = space0(input)?;
|
||||
@@ -62,9 +64,24 @@ pub(crate) fn greater_block<'b, 'g, 'r, 's>(
|
||||
))(remaining)?;
|
||||
let name = Into::<&str>::into(name);
|
||||
let (remaining, element) = match name.to_lowercase().as_str() {
|
||||
"center" => center_block(context, remaining, input, &affiliated_keywords)?,
|
||||
"quote" => quote_block(context, remaining, input, &affiliated_keywords)?,
|
||||
_ => special_block(name)(context, remaining, input, &affiliated_keywords)?,
|
||||
"center" => center_block(
|
||||
context,
|
||||
remaining,
|
||||
pre_affiliated_keywords_input,
|
||||
&affiliated_keywords,
|
||||
)?,
|
||||
"quote" => quote_block(
|
||||
context,
|
||||
remaining,
|
||||
pre_affiliated_keywords_input,
|
||||
&affiliated_keywords,
|
||||
)?,
|
||||
_ => special_block(name)(
|
||||
context,
|
||||
remaining,
|
||||
pre_affiliated_keywords_input,
|
||||
&affiliated_keywords,
|
||||
)?,
|
||||
};
|
||||
Ok((remaining, element))
|
||||
}
|
||||
@@ -73,11 +90,16 @@ pub(crate) fn greater_block<'b, 'g, 'r, 's>(
|
||||
fn center_block<'b, 'g, 'r, 's>(
|
||||
context: RefContext<'b, 'g, 'r, 's>,
|
||||
input: OrgSource<'s>,
|
||||
original_input: OrgSource<'s>,
|
||||
pre_affiliated_keywords_input: OrgSource<'s>,
|
||||
affiliated_keywords: &Vec<Keyword<'s>>,
|
||||
) -> Res<OrgSource<'s>, Element<'s>> {
|
||||
let (remaining, (source, children)) =
|
||||
greater_block_body(context, input, original_input, "center", "center block")?;
|
||||
let (remaining, (source, children)) = greater_block_body(
|
||||
context,
|
||||
input,
|
||||
pre_affiliated_keywords_input,
|
||||
"center",
|
||||
"center block",
|
||||
)?;
|
||||
Ok((
|
||||
remaining,
|
||||
Element::CenterBlock(CenterBlock {
|
||||
@@ -92,11 +114,16 @@ fn center_block<'b, 'g, 'r, 's>(
|
||||
fn quote_block<'b, 'g, 'r, 's>(
|
||||
context: RefContext<'b, 'g, 'r, 's>,
|
||||
input: OrgSource<'s>,
|
||||
original_input: OrgSource<'s>,
|
||||
pre_affiliated_keywords_input: OrgSource<'s>,
|
||||
affiliated_keywords: &Vec<Keyword<'s>>,
|
||||
) -> Res<OrgSource<'s>, Element<'s>> {
|
||||
let (remaining, (source, children)) =
|
||||
greater_block_body(context, input, original_input, "quote", "quote block")?;
|
||||
let (remaining, (source, children)) = greater_block_body(
|
||||
context,
|
||||
input,
|
||||
pre_affiliated_keywords_input,
|
||||
"quote",
|
||||
"quote block",
|
||||
)?;
|
||||
Ok((
|
||||
remaining,
|
||||
Element::QuoteBlock(QuoteBlock {
|
||||
@@ -117,11 +144,11 @@ fn special_block<'s>(
|
||||
) -> Res<OrgSource<'s>, Element<'s>>
|
||||
+ 's {
|
||||
let context_name = format!("special block {}", name);
|
||||
move |context, input, original_input, affiliated_keywords| {
|
||||
move |context, input, pre_affiliated_keywords_input, affiliated_keywords| {
|
||||
_special_block(
|
||||
context,
|
||||
input,
|
||||
original_input,
|
||||
pre_affiliated_keywords_input,
|
||||
name,
|
||||
context_name.as_str(),
|
||||
affiliated_keywords,
|
||||
@@ -133,14 +160,19 @@ fn special_block<'s>(
|
||||
fn _special_block<'c, 'b, 'g, 'r, 's>(
|
||||
context: RefContext<'b, 'g, 'r, 's>,
|
||||
input: OrgSource<'s>,
|
||||
original_input: OrgSource<'s>,
|
||||
pre_affiliated_keywords_input: OrgSource<'s>,
|
||||
name: &'s str,
|
||||
context_name: &'c str,
|
||||
affiliated_keywords: &Vec<Keyword<'s>>,
|
||||
) -> Res<OrgSource<'s>, Element<'s>> {
|
||||
let (remaining, parameters) = opt(tuple((space1, parameters)))(input)?;
|
||||
let (remaining, (source, children)) =
|
||||
greater_block_body(context, remaining, original_input, name, context_name)?;
|
||||
let (remaining, (source, children)) = greater_block_body(
|
||||
context,
|
||||
remaining,
|
||||
pre_affiliated_keywords_input,
|
||||
name,
|
||||
context_name,
|
||||
)?;
|
||||
Ok((
|
||||
remaining,
|
||||
Element::SpecialBlock(SpecialBlock {
|
||||
@@ -157,7 +189,7 @@ fn _special_block<'c, 'b, 'g, 'r, 's>(
|
||||
fn greater_block_body<'c, 'b, 'g, 'r, 's>(
|
||||
context: RefContext<'b, 'g, 'r, 's>,
|
||||
input: OrgSource<'s>,
|
||||
original_input: OrgSource<'s>,
|
||||
pre_affiliated_keywords_input: OrgSource<'s>,
|
||||
name: &'c str,
|
||||
context_name: &'c str,
|
||||
) -> Res<OrgSource<'s>, (&'s str, Vec<Element<'s>>)> {
|
||||
@@ -202,7 +234,9 @@ fn greater_block_body<'c, 'b, 'g, 'r, 's>(
|
||||
|
||||
// Not checking if parent exit matcher is causing exit because the greater_block_end matcher asserts we matched a full greater block
|
||||
|
||||
let source = get_consumed(original_input, remaining);
|
||||
let (remaining, _trailing_ws) =
|
||||
maybe_consume_trailing_whitespace_if_not_exiting(context, remaining)?;
|
||||
let source = get_consumed(pre_affiliated_keywords_input, remaining);
|
||||
Ok((remaining, (Into::<&str>::into(source), children)))
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user