fuzzy replace
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
use seal::pair::{AlignmentSet, MemoryMappedAlignmentMatrix, SmithWaterman, Step};
|
||||
|
||||
// (line pos, line pos)
|
||||
pub fn match_lines(code: &str, start: &str, end: &str) -> Option<(usize, usize)> {
|
||||
let code_chars: Vec<char> = code.chars().collect();
|
||||
|
||||
@@ -91,3 +92,44 @@ pub fn match_lines(code: &str, start: &str, end: &str) -> Option<(usize, usize)>
|
||||
Some((start_line, end_line))
|
||||
}
|
||||
}
|
||||
|
||||
// (char pos, char pos)
|
||||
pub fn match_content(code: &str, pattern: &str) -> Vec<(usize, usize)> {
|
||||
let code_chars: Vec<char> = code.chars().collect();
|
||||
|
||||
if code_chars.is_empty() || pattern.is_empty() {
|
||||
return vec![];
|
||||
}
|
||||
|
||||
let strategy = SmithWaterman::new(3, -1, -1, -1);
|
||||
|
||||
let pattern_chars: Vec<char> = pattern.chars().collect();
|
||||
let set: AlignmentSet<MemoryMappedAlignmentMatrix> =
|
||||
match AlignmentSet::new(code_chars.len(), pattern_chars.len(), strategy, |x, y| {
|
||||
code_chars[x] == pattern_chars[y]
|
||||
}) {
|
||||
Ok(set) => set,
|
||||
Err(_) => return vec![],
|
||||
};
|
||||
|
||||
set.local_alignments()
|
||||
.filter_map(|alignment| {
|
||||
let mut start_char_pos = None;
|
||||
let mut end_char_pos = None;
|
||||
|
||||
for step in alignment.steps() {
|
||||
if let Step::Align { x, .. } = step {
|
||||
if start_char_pos.is_none() {
|
||||
start_char_pos = Some(x);
|
||||
}
|
||||
end_char_pos = Some(x);
|
||||
}
|
||||
}
|
||||
|
||||
match (start_char_pos, end_char_pos) {
|
||||
(Some(start), Some(end)) => Some((start, end)),
|
||||
_ => None,
|
||||
}
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user