From 03754be71eaf1053f2ca4de12dd7aa0250cb6f2b Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Tue, 31 Oct 2023 23:16:57 -0400 Subject: [PATCH] Implement the new fields for section. --- src/parser/section.rs | 17 +++++++++++------ src/types/document.rs | 10 ++++++++-- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/parser/section.rs b/src/parser/section.rs index 4c87545d..d762cdac 100644 --- a/src/parser/section.rs +++ b/src/parser/section.rs @@ -1,3 +1,4 @@ +use nom::combinator::consumed; use nom::combinator::opt; use nom::combinator::recognize; use nom::combinator::verify; @@ -58,12 +59,12 @@ pub(crate) fn zeroth_section<'b, 'g, 'r, 's>( many0(blank_line), )))(input)?; - let (remaining, (mut children, _exit_contents)) = verify( + let (remaining, (contents, (mut children, _exit_contents))) = consumed(verify( many_till(element_matcher, exit_matcher), |(children, _exit_contents)| { !children.is_empty() || comment_and_property_drawer_element.is_some() }, - )(remaining)?; + ))(remaining)?; if let Some((comment, property_drawer, _ws)) = comment_and_property_drawer_element { children.insert(0, Element::PropertyDrawer(property_drawer)); @@ -72,7 +73,7 @@ pub(crate) fn zeroth_section<'b, 'g, 'r, 's>( } } - let (remaining, _trailing_ws) = + let (remaining, post_blank) = maybe_consume_trailing_whitespace_if_not_exiting(context, remaining)?; let source = get_consumed(input, remaining); @@ -80,6 +81,8 @@ pub(crate) fn zeroth_section<'b, 'g, 'r, 's>( remaining, Section { source: source.into(), + contents: Some(contents.into()), + post_blank: post_blank.map(Into::<&str>::into), children, }, )) @@ -115,12 +118,12 @@ pub(crate) fn section<'b, 'g, 'r, 's>( remaining = remain; input = remain; } - let (remaining, (mut children, _exit_contents)) = verify( + let (remaining, (contents, (mut children, _exit_contents))) = consumed(verify( many_till(element_matcher, exit_matcher), |(children, _exit_contents)| { !children.is_empty() || property_drawer_element.is_some() || planning_element.is_some() }, - )(remaining)?; + ))(remaining)?; if let Some(ele) = property_drawer_element.map(Element::PropertyDrawer) { children.insert(0, ele); } @@ -128,7 +131,7 @@ pub(crate) fn section<'b, 'g, 'r, 's>( children.insert(0, ele) } - let (remaining, _trailing_ws) = + let (remaining, post_blank) = maybe_consume_trailing_whitespace_if_not_exiting(context, remaining)?; let source = get_consumed(input, remaining); @@ -136,6 +139,8 @@ pub(crate) fn section<'b, 'g, 'r, 's>( remaining, Section { source: source.into(), + contents: Some(contents.into()), + post_blank: post_blank.map(Into::<&str>::into), children, }, )) diff --git a/src/types/document.rs b/src/types/document.rs index e6f26ac7..51fa9dfa 100644 --- a/src/types/document.rs +++ b/src/types/document.rs @@ -39,6 +39,8 @@ pub struct Heading<'s> { #[derive(Debug)] pub struct Section<'s> { pub source: &'s str, + pub contents: Option<&'s str>, + pub post_blank: Option<&'s str>, pub children: Vec>, } @@ -74,11 +76,15 @@ impl<'s> StandardProperties<'s> for Section<'s> { } fn get_contents<'b>(&'b self) -> Option<&'s str> { - todo!() + self.contents } fn get_post_blank(&self) -> PostBlank { - todo!() + self.post_blank + .map(|text| text.lines().count()) + .unwrap_or(0) + .try_into() + .expect("Too much post-blank to fit into a PostBlank.") } }