test
This commit is contained in:
parent
cb42c7d71f
commit
dcd8eca131
3 changed files with 7 additions and 105 deletions
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
|
|
@ -1,4 +1,7 @@
|
||||||
{
|
{
|
||||||
"rust-analyzer.check.overrideCommand": ["just", "check-json"],
|
"rust-analyzer.check.overrideCommand": ["just", "check-json"],
|
||||||
"git-blame.gitWebUrl": "",
|
"git-blame.gitWebUrl": "",
|
||||||
|
"rust-analyzer.cargo.features": [
|
||||||
|
"desktop"
|
||||||
|
],
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -82,6 +82,7 @@ palette = "0.7.3"
|
||||||
rfd = { version = "0.14.0", optional = true }
|
rfd = { version = "0.14.0", optional = true }
|
||||||
serde = { version = "1.0.180", features = ["derive"]}
|
serde = { version = "1.0.180", features = ["derive"]}
|
||||||
slotmap = "1.0.6"
|
slotmap = "1.0.6"
|
||||||
|
textdistance = "1.0.2"
|
||||||
thiserror = "1.0.44"
|
thiserror = "1.0.44"
|
||||||
tokio = { version = "1.24.2", optional = true }
|
tokio = { version = "1.24.2", optional = true }
|
||||||
tracing = "0.1"
|
tracing = "0.1"
|
||||||
|
|
|
||||||
106
src/desktop.rs
106
src/desktop.rs
|
|
@ -82,118 +82,16 @@ pub fn app_id_or_fallback_matches(app_id: &str, entry: &DesktopEntryData) -> boo
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
pub fn lcs(s1: &str, s2: &str) -> usize {
|
|
||||||
|
|
||||||
let mut mat: Vec<Vec<i32>> = vec![vec![0; s1.len() + 1]; s2.len() + 1];
|
|
||||||
|
|
||||||
for (i, u) in s1.char_indices() {
|
|
||||||
for (j, v) in s2.char_indices() {
|
|
||||||
if i == 0 || j == 0 {
|
|
||||||
mat[i][j] = 0;
|
|
||||||
} else if u == v {
|
|
||||||
mat[i][j] = mat[i - 1][j - 1] + 1;
|
|
||||||
} else {
|
|
||||||
mat[i][j] = max(mat[i - 1][j], mat[i][j - 1]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let mut s1_iter = s1.char_indices().rev().peekable();
|
|
||||||
let mut s2_iter = s1.char_indices().rev().peekable();
|
|
||||||
|
|
||||||
let mut res = 0;
|
|
||||||
|
|
||||||
dbg!(&mat);
|
|
||||||
|
|
||||||
while let (Some((i, u)), Some((j, v))) = (s1_iter.peek(), s2_iter.peek()) {
|
|
||||||
if u == v {
|
|
||||||
res += 1;
|
|
||||||
s1_iter.next();
|
|
||||||
s2_iter.next();
|
|
||||||
} else if mat[i - 1][*j] > mat[*i][j - 1] {
|
|
||||||
s1_iter.next();
|
|
||||||
} else {
|
|
||||||
s2_iter.next();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
println!("res = {res}");
|
|
||||||
res
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// lower is better
|
/// lower is better
|
||||||
fn match_entry(id: &str, de: &DesktopEntry) -> f32 {
|
fn match_entry(id: &str, de: &DesktopEntry) -> f32 {
|
||||||
|
|
||||||
/**
|
|
||||||
* `levenshtein-rs` - levenshtein
|
|
||||||
*
|
|
||||||
* MIT licensed.
|
|
||||||
*
|
|
||||||
* Copyright (c) 2016 Titus Wormer <tituswormer@gmail.com>
|
|
||||||
*/
|
|
||||||
#[must_use]
|
|
||||||
pub fn levenshtein(a: &str, b: &str) -> usize {
|
|
||||||
let mut result = 0;
|
|
||||||
|
|
||||||
/* Shortcut optimizations / degenerate cases. */
|
|
||||||
if a == b {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
let length_a = a.chars().count();
|
|
||||||
let length_b = b.chars().count();
|
|
||||||
|
|
||||||
if length_a == 0 {
|
|
||||||
return length_b;
|
|
||||||
}
|
|
||||||
|
|
||||||
if length_b == 0 {
|
|
||||||
return length_a;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Initialize the vector.
|
|
||||||
*
|
|
||||||
* This is why it’s fast, normally a matrix is used,
|
|
||||||
* here we use a single vector. */
|
|
||||||
let mut cache: Vec<usize> = (1..).take(length_a).collect();
|
|
||||||
let mut distance_a;
|
|
||||||
let mut distance_b;
|
|
||||||
|
|
||||||
/* Loop. */
|
|
||||||
for (index_b, code_b) in b.chars().enumerate() {
|
|
||||||
result = index_b;
|
|
||||||
distance_a = index_b;
|
|
||||||
|
|
||||||
for (index_a, code_a) in a.chars().enumerate() {
|
|
||||||
distance_b = if code_a == code_b {
|
|
||||||
distance_a
|
|
||||||
} else {
|
|
||||||
distance_a + 1
|
|
||||||
};
|
|
||||||
|
|
||||||
distance_a = cache[index_a];
|
|
||||||
|
|
||||||
result = if distance_a > result {
|
|
||||||
if distance_b > result {
|
|
||||||
result + 1
|
|
||||||
} else {
|
|
||||||
distance_b
|
|
||||||
}
|
|
||||||
} else if distance_b > distance_a {
|
|
||||||
distance_a + 1
|
|
||||||
} else {
|
|
||||||
distance_b
|
|
||||||
};
|
|
||||||
|
|
||||||
cache[index_a] = result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
result
|
|
||||||
}
|
|
||||||
|
|
||||||
let cmp = |id, de| {
|
let cmp = |id, de| {
|
||||||
|
|
||||||
|
let dist = textdistance::str::lcsstr(id, de);
|
||||||
let score = levenshtein(id, de);
|
let score = levenshtein(id, de);
|
||||||
let max_len = ((id.len() as i32 - de.len() as i32)).abs();
|
let max_len = ((id.len() as i32 - de.len() as i32)).abs();
|
||||||
score as f32 / max_len as f32
|
score as f32 / max_len as f32
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue