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 + } +}