Split GreaterBlock into CenterBlock, QuoteBlock, and SpecialBlock.

Center and quote blocks do not have parameters nor do they store their name so I am separating them out.
This commit is contained in:
Tom Alexander
2023-10-02 22:21:24 -04:00
parent 36217f5704
commit 2352636672
10 changed files with 255 additions and 60 deletions

View File

@@ -17,6 +17,7 @@ use crate::types::AngleLink;
use crate::types::AstNode;
use crate::types::BabelCall;
use crate::types::Bold;
use crate::types::CenterBlock;
use crate::types::CheckboxType;
use crate::types::Citation;
use crate::types::CitationReference;
@@ -40,7 +41,6 @@ use crate::types::FixedWidthArea;
use crate::types::FootnoteDefinition;
use crate::types::FootnoteReference;
use crate::types::GetStandardProperties;
use crate::types::GreaterBlock;
use crate::types::Heading;
use crate::types::HorizontalRule;
use crate::types::Hour;
@@ -69,12 +69,14 @@ use crate::types::PlainText;
use crate::types::Planning;
use crate::types::PriorityCookie;
use crate::types::PropertyDrawer;
use crate::types::QuoteBlock;
use crate::types::RadioLink;
use crate::types::RadioTarget;
use crate::types::RegularLink;
use crate::types::RepeaterType;
use crate::types::RepeaterWarningDelayValueType;
use crate::types::Section;
use crate::types::SpecialBlock;
use crate::types::SrcBlock;
use crate::types::StandardProperties;
use crate::types::StatisticsCookie;
@@ -329,7 +331,9 @@ fn compare_ast_node<'b, 's>(
AstNode::Paragraph(node) => compare_paragraph(source, emacs, node),
AstNode::PlainList(node) => compare_plain_list(source, emacs, node),
AstNode::PlainListItem(node) => compare_plain_list_item(source, emacs, node),
AstNode::GreaterBlock(node) => compare_greater_block(source, emacs, node),
AstNode::CenterBlock(node) => compare_center_block(source, emacs, node),
AstNode::QuoteBlock(node) => compare_quote_block(source, emacs, node),
AstNode::SpecialBlock(node) => compare_special_block(source, emacs, node),
AstNode::DynamicBlock(node) => compare_dynamic_block(source, emacs, node),
AstNode::FootnoteDefinition(node) => compare_footnote_definition(source, emacs, node),
AstNode::Comment(node) => compare_comment(source, emacs, node),
@@ -1011,10 +1015,60 @@ fn compare_plain_list_item<'b, 's>(
.into())
}
fn compare_greater_block<'b, 's>(
fn compare_center_block<'b, 's>(
source: &'s str,
emacs: &'b Token<'s>,
rust: &'b GreaterBlock<'s>,
rust: &'b CenterBlock<'s>,
) -> Result<DiffEntry<'b, 's>, Box<dyn std::error::Error>> {
let children = emacs.as_list()?;
let mut child_status = Vec::new();
let this_status = DiffStatus::Good;
let message = None;
for (emacs_child, rust_child) in children.iter().skip(2).zip(rust.children.iter()) {
child_status.push(compare_ast_node(source, emacs_child, rust_child.into())?);
}
Ok(DiffResult {
status: this_status,
name: rust.get_elisp_name(),
message,
children: child_status,
rust_source: rust.get_source(),
emacs_token: emacs,
}
.into())
}
fn compare_quote_block<'b, 's>(
source: &'s str,
emacs: &'b Token<'s>,
rust: &'b QuoteBlock<'s>,
) -> Result<DiffEntry<'b, 's>, Box<dyn std::error::Error>> {
let children = emacs.as_list()?;
let mut child_status = Vec::new();
let this_status = DiffStatus::Good;
let message = None;
for (emacs_child, rust_child) in children.iter().skip(2).zip(rust.children.iter()) {
child_status.push(compare_ast_node(source, emacs_child, rust_child.into())?);
}
Ok(DiffResult {
status: this_status,
name: rust.get_elisp_name(),
message,
children: child_status,
rust_source: rust.get_source(),
emacs_token: emacs,
}
.into())
}
fn compare_special_block<'b, 's>(
source: &'s str,
emacs: &'b Token<'s>,
rust: &'b SpecialBlock<'s>,
) -> Result<DiffEntry<'b, 's>, Box<dyn std::error::Error>> {
let children = emacs.as_list()?;
let mut child_status = Vec::new();
@@ -1023,6 +1077,8 @@ fn compare_greater_block<'b, 's>(
// TODO: Special block compare :type :parameters
// Center and quote block has no additional properties
let special_block_type = get_property_quoted_string(emacs, ":type")?;
for (emacs_child, rust_child) in children.iter().skip(2).zip(rust.children.iter()) {
child_status.push(compare_ast_node(source, emacs_child, rust_child.into())?);
}

View File

@@ -4,6 +4,7 @@ use crate::types::AngleLink;
use crate::types::AstNode;
use crate::types::BabelCall;
use crate::types::Bold;
use crate::types::CenterBlock;
use crate::types::Citation;
use crate::types::CitationReference;
use crate::types::Clock;
@@ -22,7 +23,6 @@ use crate::types::ExportSnippet;
use crate::types::FixedWidthArea;
use crate::types::FootnoteDefinition;
use crate::types::FootnoteReference;
use crate::types::GreaterBlock;
use crate::types::Heading;
use crate::types::HorizontalRule;
use crate::types::InlineBabelCall;
@@ -42,10 +42,12 @@ use crate::types::PlainListItem;
use crate::types::PlainText;
use crate::types::Planning;
use crate::types::PropertyDrawer;
use crate::types::QuoteBlock;
use crate::types::RadioLink;
use crate::types::RadioTarget;
use crate::types::RegularLink;
use crate::types::Section;
use crate::types::SpecialBlock;
use crate::types::SrcBlock;
use crate::types::StatisticsCookie;
use crate::types::StrikeThrough;
@@ -83,7 +85,9 @@ impl<'r, 's> GetElispFact<'s> for AstNode<'r, 's> {
AstNode::Paragraph(inner) => *inner,
AstNode::PlainList(inner) => *inner,
AstNode::PlainListItem(inner) => *inner,
AstNode::GreaterBlock(inner) => *inner,
AstNode::CenterBlock(inner) => *inner,
AstNode::QuoteBlock(inner) => *inner,
AstNode::SpecialBlock(inner) => *inner,
AstNode::DynamicBlock(inner) => *inner,
AstNode::FootnoteDefinition(inner) => *inner,
AstNode::Comment(inner) => *inner,
@@ -142,7 +146,9 @@ impl<'s> GetElispFact<'s> for Element<'s> {
match self {
Element::Paragraph(inner) => inner,
Element::PlainList(inner) => inner,
Element::GreaterBlock(inner) => inner,
Element::CenterBlock(inner) => inner,
Element::QuoteBlock(inner) => inner,
Element::SpecialBlock(inner) => inner,
Element::DynamicBlock(inner) => inner,
Element::FootnoteDefinition(inner) => inner,
Element::Comment(inner) => inner,
@@ -230,13 +236,21 @@ impl<'s> ElispFact<'s> for PlainListItem<'s> {
}
}
impl<'s> ElispFact<'s> for GreaterBlock<'s> {
impl<'s> ElispFact<'s> for CenterBlock<'s> {
fn get_elisp_name<'b>(&'b self) -> Cow<'s, str> {
match self.name.to_lowercase().as_str() {
"center" => "center-block".into(),
"quote" => "quote-block".into(),
_ => "special-block".into(),
}
"center-block".into()
}
}
impl<'s> ElispFact<'s> for QuoteBlock<'s> {
fn get_elisp_name<'b>(&'b self) -> Cow<'s, str> {
"quote-block".into()
}
}
impl<'s> ElispFact<'s> for SpecialBlock<'s> {
fn get_elisp_name<'b>(&'b self) -> Cow<'s, str> {
"special-block".into()
}
}