From 75a47deeddf0afd61ffaae93a4841916920a6350 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Wed, 12 Apr 2023 13:16:25 -0400 Subject: [PATCH] Compare plain list bounds. --- src/compare/diff.rs | 74 +++++++++++++++++++++++++++++++++++++-------- src/parser/mod.rs | 1 + 2 files changed, 62 insertions(+), 13 deletions(-) diff --git a/src/compare/diff.rs b/src/compare/diff.rs index 415082e8..69e83247 100644 --- a/src/compare/diff.rs +++ b/src/compare/diff.rs @@ -2,10 +2,11 @@ use super::sexp::Token; use crate::compare::util::get_offsets; use crate::parser::Document; use crate::parser::DocumentElement; -use crate::parser::Heading; -use crate::parser::Section; -use crate::parser::Paragraph; use crate::parser::Element; +use crate::parser::Heading; +use crate::parser::Paragraph; +use crate::parser::PlainList; +use crate::parser::Section; #[derive(Debug)] pub struct DiffResult { @@ -102,7 +103,7 @@ pub fn compare_document<'s>( }) } -pub fn compare_section<'s>( +fn compare_section<'s>( source: &'s str, emacs: &'s Token<'s>, rust: &'s Section<'s>, @@ -145,7 +146,7 @@ pub fn compare_section<'s>( }) } -pub fn compare_heading<'s>( +fn compare_heading<'s>( source: &'s str, emacs: &'s Token<'s>, rust: &'s Heading<'s>, @@ -181,10 +182,10 @@ pub fn compare_heading<'s>( match rust_child { DocumentElement::Heading(rust_heading) => { child_status.push(compare_heading(source, emacs_child, rust_heading)?); - }, + } DocumentElement::Section(rust_section) => { child_status.push(compare_section(source, emacs_child, rust_section)?); - }, + } }; } @@ -195,26 +196,29 @@ pub fn compare_heading<'s>( }) } -pub fn compare_element<'s>( +fn compare_element<'s>( source: &'s str, emacs: &'s Token<'s>, rust: &'s Element<'s>, ) -> Result> { match rust { Element::Paragraph(obj) => compare_paragraph(source, emacs, obj), - Element::PlainList(_) => todo!(), + Element::PlainList(obj) => compare_plain_list(source, emacs, obj), Element::GreaterBlock(_) => todo!(), Element::FootnoteDefinition(_) => todo!(), } } -pub fn compare_paragraph<'s>( +fn compare_paragraph<'s>( source: &'s str, emacs: &'s Token<'s>, rust: &'s Paragraph<'s>, ) -> Result> { let children = emacs.as_list()?; - let first_child = children.first().ok_or("Should have at least one child.")?.as_atom()?; + let first_child = children + .first() + .ok_or("Should have at least one child.")? + .as_atom()?; if first_child != "paragraph" { return Err("Paragraph should correspond to a paragraph cell.".into()); } @@ -239,8 +243,7 @@ pub fn compare_paragraph<'s>( this_status = DiffStatus::Bad; } - for (emacs_child, rust_child) in children.iter().skip(2).zip(rust.children.iter()) { - } + for (emacs_child, rust_child) in children.iter().skip(2).zip(rust.children.iter()) {} Ok(DiffResult { status: this_status, @@ -248,3 +251,48 @@ pub fn compare_paragraph<'s>( children: child_status, }) } + +fn compare_plain_list<'s>( + source: &'s str, + emacs: &'s Token<'s>, + rust: &'s PlainList<'s>, +) -> Result> { + let children = emacs.as_list()?; + let first_child = children + .first() + .ok_or("Should have at least one child.")? + .as_atom()?; + if first_child != "plain-list" { + return Err("Paragraph should correspond to a paragraph cell.".into()); + } + let mut child_status = Vec::new(); + let mut this_status = DiffStatus::Good; + + let attributes_child = children + .iter() + .nth(1) + .ok_or("Should have an attributes child.")?; + let attributes_map = attributes_child.as_map()?; + let begin = attributes_map + .get(":begin") + .ok_or("Missing :begin attribute.")? + .as_atom()?; + let end = attributes_map + .get(":end") + .ok_or("Missing :end attribute.")? + .as_atom()?; + let (rust_begin, rust_end) = get_offsets(source, rust); + if (rust_begin + 1).to_string() != begin || (rust_end + 1).to_string() != end { + this_status = DiffStatus::Bad; + } + + for (emacs_child, rust_child) in children.iter().skip(2).zip(rust.children.iter()) {} + + Ok(DiffResult { + status: this_status, + name: "plain-list".to_owned(), + children: child_status, + }) +} + +//plain-list diff --git a/src/parser/mod.rs b/src/parser/mod.rs index c9663316..4863def2 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -20,6 +20,7 @@ pub use document::DocumentElement; pub use document::Heading; pub use document::Section; pub use element::Element; +pub use greater_element::PlainList; pub use lesser_element::Paragraph; pub use source::Source; type Context<'r, 's> = &'r parser_context::ContextTree<'r, 's>;