5个版本
0.0.4 | 2023年7月23日 |
---|---|
0.0.3 | 2023年2月17日 |
0.0.2 | 2023年2月17日 |
0.0.1 | 2023年2月16日 |
0.0.0 | 2023年2月14日 |
#301 在 算法
74 每月下载量
93KB
2K SLoC
DiffMatchPatch - diffmatchpatch
Diff Match and Patch库提供强大的算法来执行同步纯文本所需的操作。此存储库包含原始diff-match-patch库的Rust版本,使用最新的crate包。
与上游的修改
- 使用
Chars(Vec<char>)
来表示文本,而不是使用String
以避免不必要的字符串遍历 - 将
diff_lines_to_chars
扩展到diff_any_to_chars
以支持单词、行、文本块以及任何可比较的项目序列 - 测试用例来自google/diff-match-patch和distill-io/diff-match-patch.rs
- 实现
patch
部分 - 辅助
prelude
模块
演示
相同的示例是从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
}
原始
特性
- 纯文本比较和修补库
- 检索两块文本之间的差异
- 为将一块文本转换为另一块文本创建一组修补程序
- 将一组修补程序应用于一块文本以将其转换为另一块文本
- 即使底层文本不完全匹配,也会尽力应用修补程序。
速度测试
在M1 Pro MacBook Pro上
Python3 8.695004s
JS(Chrome) 0.469s
speedtest 147.20 ms