#diff #dmp #text #patch #difference #algorithm #match

diffmatchpatch

Rust中对diff-match-patch的重新实现

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算法

Download history 46/week @ 2024-03-11 10/week @ 2024-03-18 3/week @ 2024-03-25 27/week @ 2024-04-01 14/week @ 2024-04-08 18/week @ 2024-04-22 15/week @ 2024-05-06 15/week @ 2024-05-13 13/week @ 2024-05-27 15/week @ 2024-06-03 6/week @ 2024-06-10 16/week @ 2024-06-17 36/week @ 2024-06-24

74 每月下载量

MIT/Apache

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

原始

此代码最初是从dmp分叉而来,授权协议为MIT

特性

  • 纯文本比较和修补库
  • 检索两块文本之间的差异
  • 为将一块文本转换为另一块文本创建一组修补程序
  • 将一组修补程序应用于一块文本以将其转换为另一块文本
  • 即使底层文本不完全匹配,也会尽力应用修补程序。

速度测试

在M1 Pro MacBook Pro上

Python3                         8.695004s
JS(Chrome)                      0.469s
speedtest                       147.20 ms

依赖项