From 9cfb2fa052c9cabb28d79bcf0afdac48df7ddcd4 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Mon, 11 Dec 2023 12:38:13 -0500 Subject: [PATCH] Implement the new fields for keywords. --- src/parser/keyword.rs | 5 ++++- src/types/lesser_element.rs | 9 +++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/parser/keyword.rs b/src/parser/keyword.rs index 32db3613..e2c67b72 100644 --- a/src/parser/keyword.rs +++ b/src/parser/keyword.rs @@ -58,6 +58,7 @@ fn _filtered_keyword<'s, F: Fn(OrgSource<'s>) -> Res, OrgSource<'s affiliated_keywords: AffiliatedKeywords::default(), // To be populated by the caller if this keyword is in a context to support affiliated keywords. key: parsed_key.into(), value: "", + post_blank: None, }, )); } @@ -71,6 +72,7 @@ fn _filtered_keyword<'s, F: Fn(OrgSource<'s>) -> Res, OrgSource<'s affiliated_keywords: AffiliatedKeywords::default(), // To be populated by the caller if this keyword is in a context to support affiliated keywords. key: parsed_key.into(), value: parsed_value.into(), + post_blank: None, }, )) } @@ -89,12 +91,13 @@ where AK: IntoIterator>, { let (remaining, mut kw) = filtered_keyword(regular_keyword_key)(remaining)?; - let (remaining, _trailing_ws) = + let (remaining, post_blank) = maybe_consume_trailing_whitespace_if_not_exiting(context, remaining)?; let source = get_consumed(input, remaining); kw.affiliated_keywords = parse_affiliated_keywords(context.get_global_settings(), affiliated_keywords); kw.source = Into::<&str>::into(source); + kw.post_blank = post_blank.map(Into::<&str>::into); Ok((remaining, kw)) } diff --git a/src/types/lesser_element.rs b/src/types/lesser_element.rs index c62bca44..7f0c4912 100644 --- a/src/types/lesser_element.rs +++ b/src/types/lesser_element.rs @@ -153,6 +153,7 @@ pub struct Keyword<'s> { pub affiliated_keywords: AffiliatedKeywords<'s>, pub key: &'s str, pub value: &'s str, + pub post_blank: Option<&'s str>, } #[derive(Debug)] @@ -387,11 +388,15 @@ impl<'s> StandardProperties<'s> for Keyword<'s> { } fn get_contents<'b>(&'b self) -> Option<&'s str> { - todo!() + None } 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.") } }