Only deduplicate once
This commit is contained in:
parent
d6b9e0b9c5
commit
5625bb1aa7
1 changed files with 37 additions and 10 deletions
|
|
@ -157,10 +157,20 @@ where
|
||||||
);
|
);
|
||||||
|
|
||||||
let original_length = operation.len();
|
let original_length = operation.len();
|
||||||
let (side, result) = match side {
|
let previous_operation = match side {
|
||||||
Side::Left => {
|
Side::Left => &mut last_right_op,
|
||||||
let result = operation.merge_operations(last_right_op.as_ref());
|
Side::Right => &mut last_left_op,
|
||||||
|
};
|
||||||
|
let result = operation.merge_operations(previous_operation.as_ref());
|
||||||
|
|
||||||
|
if matches!(result, Operation::Insert { .. })
|
||||||
|
&& matches!(previous_operation, Some(Operation::Insert { .. }))
|
||||||
|
{
|
||||||
|
*previous_operation = None;
|
||||||
|
}
|
||||||
|
|
||||||
|
match side {
|
||||||
|
Side::Left => {
|
||||||
if let ref op @ (Operation::Insert { .. } | Operation::Equal { .. }) = result {
|
if let ref op @ (Operation::Insert { .. } | Operation::Equal { .. }) = result {
|
||||||
let merged_length_signed = isize::try_from(merged_length)
|
let merged_length_signed = isize::try_from(merged_length)
|
||||||
.expect("merged_length must fit in isize");
|
.expect("merged_length must fit in isize");
|
||||||
|
|
@ -189,12 +199,8 @@ where
|
||||||
|
|
||||||
maybe_left_op = left_iter.next();
|
maybe_left_op = left_iter.next();
|
||||||
last_left_op = Some(result.clone());
|
last_left_op = Some(result.clone());
|
||||||
|
|
||||||
(Side::Left, result)
|
|
||||||
}
|
}
|
||||||
Side::Right => {
|
Side::Right => {
|
||||||
let result = operation.merge_operations(last_left_op.as_ref());
|
|
||||||
|
|
||||||
if let ref op @ (Operation::Insert { .. } | Operation::Equal { .. }) = result {
|
if let ref op @ (Operation::Insert { .. } | Operation::Equal { .. }) = result {
|
||||||
let merged_length_signed = isize::try_from(merged_length)
|
let merged_length_signed = isize::try_from(merged_length)
|
||||||
.expect("merged_length must fit in isize");
|
.expect("merged_length must fit in isize");
|
||||||
|
|
@ -223,10 +229,8 @@ where
|
||||||
|
|
||||||
maybe_right_op = right_iter.next();
|
maybe_right_op = right_iter.next();
|
||||||
last_right_op = Some(result.clone());
|
last_right_op = Some(result.clone());
|
||||||
|
|
||||||
(Side::Right, result)
|
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
if result.len() == 0 {
|
if result.len() == 0 {
|
||||||
continue;
|
continue;
|
||||||
|
|
@ -544,6 +548,7 @@ where
|
||||||
mod tests {
|
mod tests {
|
||||||
use insta::assert_debug_snapshot;
|
use insta::assert_debug_snapshot;
|
||||||
use pretty_assertions::assert_eq;
|
use pretty_assertions::assert_eq;
|
||||||
|
use test_case::test_case;
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
|
|
@ -586,6 +591,28 @@ mod tests {
|
||||||
assert_eq!(operations.apply().text(), expected);
|
assert_eq!(operations.apply().text(), expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test_case("", "- item", "- item\n- item"; "empty_parent")]
|
||||||
|
#[test_case("", "- item\n- item", "- item\n- item\n- item"; "repeated_items")]
|
||||||
|
#[test_case("", "- item\n", "- item\n- item\n"; "trailing_newline")]
|
||||||
|
#[test_case("", "- 世界", "- 世界\r\n- 世界"; "unicode_and_crlf")]
|
||||||
|
#[test_case("# Title\n", "# Title\n- item", "# Title\n- item\n- item"; "nonempty_parent")]
|
||||||
|
fn test_merge_preserves_repeated_markdown_items(parent: &str, shorter: &str, longer: &str) {
|
||||||
|
for (left, right) in [(shorter, longer), (longer, shorter)] {
|
||||||
|
let left = EditedText::from_strings_with_tokenizer(
|
||||||
|
parent,
|
||||||
|
&left.into(),
|
||||||
|
&*BuiltinTokenizer::Markdown,
|
||||||
|
);
|
||||||
|
let right = EditedText::from_strings_with_tokenizer(
|
||||||
|
parent,
|
||||||
|
&right.into(),
|
||||||
|
&*BuiltinTokenizer::Markdown,
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_eq!(left.merge(right).apply().text(), longer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_from_diff_length_exceeds_original() {
|
fn test_from_diff_length_exceeds_original() {
|
||||||
let result = EditedText::from_diff(
|
let result = EditedText::from_diff(
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue