06afc1879b
Thanks to stephaneyfx from the #rust IRC channel for showing me that this needs separate type parameters on the functions in order to compile. The only API change that can't be helped are the `line_junk` and `char_junk` function pointers in the Differ struct, which now take `&&str` and `&char` parameters, respectively. This is probably for the better, since `char_junk` now operates on Unicode scalar values rather than the single UTF-8 bytes disguised as `&str` that were previously retrieved via the unsafe `slice_unchecked()` function.
83 lines
2.2 KiB
Markdown
83 lines
2.2 KiB
Markdown
# Difflib [](https://travis-ci.org/DimaKudosh/difflib)
|
|
|
|
Port of Python's difflib library to Rust.
|
|
It's provide all necessary tools for comparing word sequences.
|
|
|
|
## Installation
|
|
Simply add difflib to your dependencies block in Cargo.toml
|
|
|
|
```rust
|
|
[dependencies]
|
|
difflib = "0.4.0"
|
|
```
|
|
|
|
## Documentation
|
|
Documentation is available at https://github.com/DimaKudosh/difflib/wiki
|
|
|
|
## Example
|
|
```rust
|
|
extern crate difflib;
|
|
|
|
use difflib::differ::Differ;
|
|
use difflib::sequencematcher::SequenceMatcher;
|
|
|
|
fn main() {
|
|
// unified_diff
|
|
let first_text = "one two three four".split(" ").collect::<Vec<&str>>();
|
|
let second_text = "zero one tree four".split(" ").collect::<Vec<&str>>();
|
|
let diff = difflib::unified_diff(
|
|
&first_text,
|
|
&second_text,
|
|
"Original",
|
|
"Current",
|
|
"2005-01-26 23:30:50",
|
|
"2010-04-02 10:20:52",
|
|
3,
|
|
);
|
|
for line in &diff {
|
|
println!("{:?}", line);
|
|
}
|
|
|
|
//context_diff
|
|
let diff = difflib::context_diff(
|
|
&first_text,
|
|
&second_text,
|
|
"Original",
|
|
"Current",
|
|
"2005-01-26 23:30:50",
|
|
"2010-04-02 10:20:52",
|
|
3,
|
|
);
|
|
for line in &diff {
|
|
println!("{:?}", line);
|
|
}
|
|
|
|
//get_close_matches
|
|
let words = vec!["ape", "apple", "peach", "puppy"];
|
|
let result = difflib::get_close_matches("appel", words, 3, 0.6);
|
|
println!("{:?}", result);
|
|
|
|
//Differ examples
|
|
let differ = Differ::new();
|
|
let diff = differ.compare(&first_text, &second_text);
|
|
for line in &diff {
|
|
println!("{:?}", line);
|
|
}
|
|
|
|
//SequenceMatcher examples
|
|
let mut matcher = SequenceMatcher::new("one two three four", "zero one tree four");
|
|
let m = matcher.find_longest_match(0, 18, 0, 18);
|
|
println!("{:?}", m);
|
|
let all_matches = matcher.get_matching_blocks();
|
|
println!("{:?}", all_matches);
|
|
let opcode = matcher.get_opcodes();
|
|
println!("{:?}", opcode);
|
|
let grouped_opcodes = matcher.get_grouped_opcodes(2);
|
|
println!("{:?}", grouped_opcodes);
|
|
let ratio = matcher.ratio();
|
|
println!("{:?}", ratio);
|
|
matcher.set_seqs("aaaaa", "aaaab");
|
|
println!("{:?}", matcher.ratio());
|
|
}
|
|
```
|