diff --git a/src/compare/diff.rs b/src/compare/diff.rs index 86afe8e4..96757e95 100644 --- a/src/compare/diff.rs +++ b/src/compare/diff.rs @@ -53,6 +53,7 @@ use crate::types::PlainLink; use crate::types::PlainList; use crate::types::PlainListItem; use crate::types::PlainListItemCounter; +use crate::types::PlainListItemPreBlank; use crate::types::PlainListType; use crate::types::PlainText; use crate::types::Planning; @@ -887,7 +888,19 @@ fn compare_plain_list_item<'s>( } }; - // TODO: Compare :pre-blank + // Compare pre-blank + // :pre-blank appears to count the line breaks between "::" and the contents in a descriptive list. Oddly enough it does not count the spaces so I'm not quite sure what the value is. + let pre_blank = get_property_unquoted_atom(emacs, ":pre-blank")?; + let pre_blank: Option = pre_blank + .map(|val| val.parse()) + .map_or(Ok(None), |r| r.map(Some))?; + if pre_blank.unwrap_or(0) != rust.pre_blank { + this_status = DiffStatus::Bad; + message = Some(format!( + "Pre-blank mismatch (emacs != rust) {:?} != {:?}", + pre_blank, rust.pre_blank + )); + } Ok(DiffResult { status: this_status, diff --git a/src/parser/plain_list.rs b/src/parser/plain_list.rs index 76a16e11..61f8b6b2 100644 --- a/src/parser/plain_list.rs +++ b/src/parser/plain_list.rs @@ -45,6 +45,7 @@ use crate::types::Object; use crate::types::PlainList; use crate::types::PlainListItem; use crate::types::PlainListItemCounter; +use crate::types::PlainListItemPreBlank; use crate::types::PlainListType; #[cfg_attr(feature = "tracing", tracing::instrument(ret, level = "debug"))] @@ -220,6 +221,7 @@ fn plain_list_item<'b, 'g, 'r, 's>( tag: maybe_tag .map(|(_ws, item_tag)| item_tag) .unwrap_or(Vec::new()), + pre_blank: 0, children: Vec::new(), }, ), @@ -227,7 +229,11 @@ fn plain_list_item<'b, 'g, 'r, 's>( } Err(_) => {} }; - let (remaining, _ws) = item_tag_post_gap(&parser_context, remaining)?; + let (remaining, pre_blank) = item_tag_post_gap(&parser_context, remaining)?; + let pre_blank = Into::<&str>::into(pre_blank) + .bytes() + .filter(|b| *b == b'\n') + .count(); let (mut remaining, (mut children, _exit_contents)) = many_till( include_input(parser_with_context!(element(true))(&parser_context)), @@ -266,6 +272,8 @@ fn plain_list_item<'b, 'g, 'r, 's>( tag: maybe_tag .map(|(_ws, item_tag)| item_tag) .unwrap_or(Vec::new()), + pre_blank: PlainListItemPreBlank::try_from(pre_blank) + .expect("pre-blank cannot be larger than 2."), children: children.into_iter().map(|(_start, item)| item).collect(), }, ), diff --git a/src/types/greater_element.rs b/src/types/greater_element.rs index c5977cf3..c63b58ca 100644 --- a/src/types/greater_element.rs +++ b/src/types/greater_element.rs @@ -29,10 +29,12 @@ pub struct PlainListItem<'s> { pub counter: Option, pub checkbox: Option<(CheckboxType, &'s str)>, pub tag: Vec>, + pub pre_blank: PlainListItemPreBlank, pub children: Vec>, } pub type PlainListItemCounter = u16; +pub type PlainListItemPreBlank = u8; #[derive(Debug)] pub enum CheckboxType { diff --git a/src/types/mod.rs b/src/types/mod.rs index 0a17d710..7976ecd1 100644 --- a/src/types/mod.rs +++ b/src/types/mod.rs @@ -25,6 +25,7 @@ pub use greater_element::NodeProperty; pub use greater_element::PlainList; pub use greater_element::PlainListItem; pub use greater_element::PlainListItemCounter; +pub use greater_element::PlainListItemPreBlank; pub use greater_element::PlainListType; pub use greater_element::PropertyDrawer; pub use greater_element::Table;