From afb43ff34fbb611e9c8e5f8762c0306cf98cfdf6 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Wed, 4 Oct 2023 12:59:57 -0400 Subject: [PATCH] Switch to getting the contents with a function to handle the escaped lines. --- .../lesser_block/example/escaped_lines.org | 10 +++++++++ src/compare/diff.rs | 5 +++-- src/types/lesser_element.rs | 22 +++++++++++++++++++ 3 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 org_mode_samples/lesser_element/lesser_block/example/escaped_lines.org diff --git a/org_mode_samples/lesser_element/lesser_block/example/escaped_lines.org b/org_mode_samples/lesser_element/lesser_block/example/escaped_lines.org new file mode 100644 index 00000000..71dcda3e --- /dev/null +++ b/org_mode_samples/lesser_element/lesser_block/example/escaped_lines.org @@ -0,0 +1,10 @@ +#+begin_example +,* foo +,** bar +,*** baz + lorem + , ipsum +,#+begin_src dolar + +,#+end_src +#+end_example diff --git a/src/compare/diff.rs b/src/compare/diff.rs index 938622d8..3e2e44df 100644 --- a/src/compare/diff.rs +++ b/src/compare/diff.rs @@ -1549,11 +1549,12 @@ fn compare_example_block<'b, 's>( // Compare value let contents = get_property_quoted_string(emacs, ":value")?.unwrap_or(String::new()); - if contents != rust.contents { + let rust_contents = rust.get_contents(); + if contents != rust_contents { this_status = DiffStatus::Bad; message = Some(format!( "Value mismatch (emacs != rust) {:?} != {:?}", - contents, rust.contents + contents, rust_contents )); } diff --git a/src/types/lesser_element.rs b/src/types/lesser_element.rs index 3d8a21f0..11e3c6f6 100644 --- a/src/types/lesser_element.rs +++ b/src/types/lesser_element.rs @@ -237,3 +237,25 @@ impl<'s> Comment<'s> { ret } } + +impl<'s> ExampleBlock<'s> { + /// Get the inner contents of the ExampleBlock with the escaping commas removed. + pub fn get_contents(&self) -> String { + let mut ret = String::with_capacity(self.contents.len()); + for line in self.contents.lines() { + let first_comma = line.find(",#+").or_else(|| line.find(",*")); + if let Some(first_comma) = first_comma { + let before_first_comma = &line[..first_comma]; + let is_escaping_comma = before_first_comma.chars().all(char::is_whitespace); + if is_escaping_comma { + ret.push_str(&line[(first_comma + 1)..]); + } else { + ret.push_str(line); + } + } else { + ret.push_str(line); + } + } + ret + } +}