5 releases
0.0.4 | Jul 23, 2023 |
---|---|
0.0.3 | Feb 17, 2023 |
0.0.2 | Feb 17, 2023 |
0.0.1 | Feb 16, 2023 |
0.0.0 | Feb 14, 2023 |
#417 in Algorithms
48 downloads per month
93KB
2K
SLoC
DiffMatchPatch - diffmatchpatch
The Diff Match and Patch libraries offer robust algorithms to perform the operations required for synchronising plain text. This repository contains a Rust version of the original diff-match-patch library, using up-to-date crate packages.
Modification Compared to the Upstream
- Use
Chars(Vec<char>)
to represent text instead ofString
to avoid unnecessary traversing of the string - Extend
diff_lines_to_chars
todiff_any_to_chars
to support words, lines, text blocks, and any sequence of comparable items - Test cases from google/diff-match-patch and distill-io/diff-match-patch.rs
- Implement the
patch
part - Helper
prelude
mod
Demo
The same example is copied from https://neil.fraser.name/software/diff_match_patch/demos/diff.html.
use diffmatchpatch::prelude::*;
fn main() {
let text1 = r#"I am the very model of a modern Major-General,
I've information vegetable, animal, and mineral,
I know the kings of England, and I quote the fights historical,
From Marathon to Waterloo, in order categorical."#;
let text2 = r#"I am the very model of a cartoon individual,
My animation's comical, unusual, and whimsical,
I'm quite adept at funny gags, comedic theory I have read,
From wicked puns and stupid jokes to anvils that drop on your head."#;
// No Cleanup
//let diffs = diff_main(text2, text1);
//println!("diffs {:#?}", diffs);
// Semantic Cleanup
let diffs = diff_semantic(text2, text1);
println!("Semantic diffs {:#?}", diffs);
// Word mode
let diffs = diff_word_mode(text2, text1);
println!("Word diffs {:#?}", diffs);
// diff_word_mode is also avaliable, but is meaningless to this example
}
Original
This code is forked originally from dmp, licensed under the MIT license.
Features
- Diffing and patching library for plain text
- Retrieve differences between two blocks of text
- Create a set of patches for converting a block of text into another
- Apply a set of patches onto a block of text to convert it to another block of text
- Uses best-effort to apply patch even when the underlying text doesn't fully match.
speedtest
On an M1 Pro MacBook Pro:
Python3 8.695004s
JS(Chrome) 0.469s
speedtest 147.20 ms