diff --git a/src/parser/document.rs b/src/parser/document.rs index 3eb3eeb..f71aaee 100644 --- a/src/parser/document.rs +++ b/src/parser/document.rs @@ -6,6 +6,7 @@ use nom::multi::many0; use super::headline::heading; use super::in_buffer_settings::apply_in_buffer_settings; +use super::in_buffer_settings::apply_post_parse_in_buffer_settings; use super::in_buffer_settings::scan_for_in_buffer_settings; use super::org_source::OrgSource; use super::section::zeroth_section; @@ -168,25 +169,17 @@ fn document_org_source<'b, 'g, 'r, 's>( let mut new_global_settings = context.get_global_settings().clone(); new_global_settings.radio_targets = all_radio_targets; let parser_context = context.with_global_settings(&new_global_settings); - let (remaining, document) = _document(&parser_context, input) + let (remaining, mut document) = _document(&parser_context, input) .map(|(rem, out)| (Into::<&str>::into(rem), out))?; + apply_post_parse_in_buffer_settings(&mut document) + .map_err(|err| nom::Err::>>::Failure(err.into()))?; return Ok((remaining.into(), document)); } } // Find final in-buffer settings that do not impact parsing - document.category = Into::::into(&document) - .into_iter() - .filter_map(|ast_node| { - if let AstNode::Keyword(ast_node) = ast_node { - if ast_node.key.eq_ignore_ascii_case("category") { - return Some(ast_node); - } - } - None - }) - .last() - .map(|kw| kw.value.to_owned()); + apply_post_parse_in_buffer_settings(&mut document) + .map_err(|err| nom::Err::>>::Failure(err.into()))?; Ok((remaining.into(), document)) } diff --git a/src/parser/in_buffer_settings.rs b/src/parser/in_buffer_settings.rs index 167d428..3586d2f 100644 --- a/src/parser/in_buffer_settings.rs +++ b/src/parser/in_buffer_settings.rs @@ -11,7 +11,9 @@ use super::OrgSource; use crate::context::HeadlineLevelFilter; use crate::error::CustomError; use crate::error::Res; +use crate::iter::AstNode; use crate::settings::GlobalSettings; +use crate::types::Document; use crate::types::Keyword; #[cfg_attr(feature = "tracing", tracing::instrument(ret, level = "debug"))] @@ -114,6 +116,25 @@ pub(crate) fn apply_in_buffer_settings<'g, 's, 'sf>( Ok(new_settings) } +/// Apply in-buffer settings that do not impact parsing and therefore can be applied after parsing. +pub(crate) fn apply_post_parse_in_buffer_settings<'g, 's, 'sf>( + document: &mut Document<'s>, +) -> Result<(), &'static str> { + document.category = Into::::into(&*document) + .into_iter() + .filter_map(|ast_node| { + if let AstNode::Keyword(ast_node) = ast_node { + if ast_node.key.eq_ignore_ascii_case("category") { + return Some(ast_node); + } + } + None + }) + .last() + .map(|kw| kw.value.to_owned()); + Ok(()) +} + #[cfg(test)] mod tests { use super::*;