diff --git a/src/compare/diff.rs b/src/compare/diff.rs index 4cb05e7..d948d49 100644 --- a/src/compare/diff.rs +++ b/src/compare/diff.rs @@ -1122,9 +1122,33 @@ fn compare_dynamic_block<'b, 's>( ) -> Result, Box> { let children = emacs.as_list()?; let mut child_status = Vec::new(); - let this_status = DiffStatus::Good; - let message = None; - // TODO: Compare :block-name :arguments + let mut this_status = DiffStatus::Good; + let mut message = None; + + // Compare block-name + let block_name = get_property_quoted_string(emacs, ":block-name")? + .ok_or("Dynamic blocks should have a name.")?; + if block_name != rust.name { + this_status = DiffStatus::Bad; + message = Some(format!( + "Name mismatch (emacs != rust) {:?} != {:?}", + block_name, rust.name + )); + } + + // Compare arguments + let parameters = get_property_quoted_string(emacs, ":arguments")?; + match (parameters.as_ref(), rust.parameters) { + (None, None) => {} + (Some(emacs_parameters), Some(rust_parameters)) if emacs_parameters == rust_parameters => {} + _ => { + this_status = DiffStatus::Bad; + message = Some(format!( + "Parameters mismatch (emacs != rust) {:?} != {:?}", + parameters, rust.parameters + )); + } + } 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())?); diff --git a/src/parser/dynamic_block.rs b/src/parser/dynamic_block.rs index b70d2fb..5368148 100644 --- a/src/parser/dynamic_block.rs +++ b/src/parser/dynamic_block.rs @@ -2,6 +2,7 @@ use nom::branch::alt; use nom::bytes::complete::is_not; use nom::bytes::complete::tag; use nom::bytes::complete::tag_no_case; +use nom::character::complete::anychar; use nom::character::complete::line_ending; use nom::character::complete::space0; use nom::character::complete::space1; @@ -9,6 +10,7 @@ use nom::combinator::consumed; use nom::combinator::eof; use nom::combinator::not; use nom::combinator::opt; +use nom::combinator::peek; use nom::combinator::recognize; use nom::multi::many0; use nom::multi::many_till; @@ -47,10 +49,11 @@ pub(crate) fn dynamic_block<'b, 'g, 'r, 's>( } start_of_line(input)?; let (remaining, _leading_whitespace) = space0(input)?; - let (remaining, (_begin, name, parameters, _ws)) = tuple(( + let (remaining, (_, name, parameters, _, _)) = tuple(( recognize(tuple((tag_no_case("#+begin:"), space1))), name, opt(tuple((space1, parameters))), + space0, line_ending, ))(remaining)?; let contexts = [ @@ -108,7 +111,7 @@ fn name<'s>(input: OrgSource<'s>) -> Res, OrgSource<'s>> { #[cfg_attr(feature = "tracing", tracing::instrument(ret, level = "debug"))] fn parameters<'s>(input: OrgSource<'s>) -> Res, OrgSource<'s>> { - is_not("\r\n")(input) + recognize(many_till(anychar, peek(tuple((space0, line_ending)))))(input) } #[cfg_attr(feature = "tracing", tracing::instrument(ret, level = "debug"))]