From a267f23e0f6d89140d10ac710ec48a661b5998c7 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Wed, 19 Apr 2023 16:51:00 -0400 Subject: [PATCH] Initial code structure for property drawers. --- src/compare/diff.rs | 33 ++++++++++++++++++++++++++++++++- src/parser/element.rs | 9 +++++++++ src/parser/greater_element.rs | 7 +++++++ src/parser/mod.rs | 2 ++ src/parser/property_drawer.rs | 11 +++++++++++ 5 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 src/parser/property_drawer.rs diff --git a/src/compare/diff.rs b/src/compare/diff.rs index a1480aae..4920fb3e 100644 --- a/src/compare/diff.rs +++ b/src/compare/diff.rs @@ -1,7 +1,6 @@ use super::sexp::Token; use super::util::assert_bounds; use super::util::assert_name; -use crate::compare::util::get_offsets; use crate::parser::Comment; use crate::parser::Document; use crate::parser::DocumentElement; @@ -13,6 +12,7 @@ use crate::parser::Heading; use crate::parser::Paragraph; use crate::parser::PlainList; use crate::parser::PlainListItem; +use crate::parser::PropertyDrawer; use crate::parser::Section; use crate::DynamicBlock; @@ -197,6 +197,7 @@ fn compare_element<'s>( Element::FootnoteDefinition(obj) => compare_footnote_definition(source, emacs, obj), Element::Comment(obj) => compare_comment(source, emacs, obj), Element::Drawer(obj) => compare_drawer(source, emacs, obj), + Element::PropertyDrawer(obj) => compare_property_drawer(source, emacs, obj), } } @@ -428,3 +429,33 @@ fn compare_drawer<'s>( children: child_status, }) } + +fn compare_property_drawer<'s>( + source: &'s str, + emacs: &'s Token<'s>, + rust: &'s PropertyDrawer<'s>, +) -> Result> { + let children = emacs.as_list()?; + let mut child_status = Vec::new(); + let mut this_status = DiffStatus::Good; + let emacs_name = "property-drawer"; + if assert_name(emacs, emacs_name).is_err() { + this_status = DiffStatus::Bad; + } + + if assert_bounds(source, emacs, rust).is_err() { + this_status = DiffStatus::Bad; + } + + for (emacs_child, rust_child) in children.iter().skip(2).zip(rust.children.iter()) { + // TODO: What are node properties and are they the only legal child of property drawers? + // child_status.push(compare_element(source, emacs_child, rust_child)?); + } + + Ok(DiffResult { + status: this_status, + name: emacs_name.to_owned(), + message: None, + children: child_status, + }) +} diff --git a/src/parser/element.rs b/src/parser/element.rs index ecf9a80d..e3a2c4e5 100644 --- a/src/parser/element.rs +++ b/src/parser/element.rs @@ -8,6 +8,7 @@ use super::greater_element::DynamicBlock; use super::greater_element::FootnoteDefinition; use super::greater_element::GreaterBlock; use super::greater_element::PlainList; +use super::greater_element::PropertyDrawer; use super::lesser_element::Comment; use super::lesser_element::Paragraph; use super::paragraph::paragraph; @@ -29,6 +30,7 @@ pub enum Element<'s> { FootnoteDefinition(FootnoteDefinition<'s>), Comment(Comment<'s>), Drawer(Drawer<'s>), + PropertyDrawer(PropertyDrawer<'s>), } impl<'s> Source<'s> for Element<'s> { @@ -41,6 +43,7 @@ impl<'s> Source<'s> for Element<'s> { Element::FootnoteDefinition(obj) => obj.source, Element::Comment(obj) => obj.source, Element::Drawer(obj) => obj.source, + Element::PropertyDrawer(obj) => obj.source, } } } @@ -93,6 +96,12 @@ impl<'s> Source<'s> for Drawer<'s> { } } +impl<'s> Source<'s> for PropertyDrawer<'s> { + fn get_source(&'s self) -> &'s str { + self.source + } +} + #[tracing::instrument(ret, level = "debug")] pub fn element<'r, 's>(context: Context<'r, 's>, input: &'s str) -> Res<&'s str, Element<'s>> { let non_paragraph_matcher = parser_with_context!(non_paragraph_element)(context); diff --git a/src/parser/greater_element.rs b/src/parser/greater_element.rs index 90187263..c40d85c3 100644 --- a/src/parser/greater_element.rs +++ b/src/parser/greater_element.rs @@ -43,3 +43,10 @@ pub struct Drawer<'s> { pub name: &'s str, pub children: Vec>, } + +#[derive(Debug)] +pub struct PropertyDrawer<'s> { + pub source: &'s str, + pub name: &'s str, + pub children: Vec>, +} diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 3a2eb612..6359a5c6 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -16,6 +16,7 @@ mod parser_context; mod parser_with_context; mod plain_list; mod plain_text; +mod property_drawer; mod source; mod util; pub use document::document; @@ -30,6 +31,7 @@ pub use greater_element::FootnoteDefinition; pub use greater_element::GreaterBlock; pub use greater_element::PlainList; pub use greater_element::PlainListItem; +pub use greater_element::PropertyDrawer; pub use lesser_element::Comment; pub use lesser_element::Paragraph; pub use source::Source; diff --git a/src/parser/property_drawer.rs b/src/parser/property_drawer.rs new file mode 100644 index 00000000..31f2ee53 --- /dev/null +++ b/src/parser/property_drawer.rs @@ -0,0 +1,11 @@ +use super::Context; +use crate::parser::error::Res; +use crate::parser::greater_element::PropertyDrawer; + +#[tracing::instrument(ret, level = "debug")] +pub fn property_drawer<'r, 's>( + context: Context<'r, 's>, + input: &'s str, +) -> Res<&'s str, PropertyDrawer<'s>> { + todo!() +}