Skip to content

Commit

Permalink
fix: utf8-indexed previews (#34)
Browse files Browse the repository at this point in the history
  • Loading branch information
Terkwood authored Jun 13, 2022
1 parent 417a5f4 commit 1489039
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 12 deletions.
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "zeditor"
version = "0.1.1-a"
version = "0.1.1-b"
edition = "2021"

[dependencies]
Expand Down
38 changes: 28 additions & 10 deletions src/search.rs
Original file line number Diff line number Diff line change
Expand Up @@ -104,21 +104,12 @@ fn search_text(
let start = hit.start() + substart;
let end = start + subend;

// be careful not to slice in the middle of utf8 chars
let text_utf8 = text.chars().collect::<Vec<_>>();
hits.push(Hit {
path: path.clone(),
search: term.to_string(),
start,
end,
preview: text_utf8[start.checked_sub(peek_size).unwrap_or_default()
..std::cmp::min(
end.checked_add(peek_size).unwrap_or(text_utf8.len()),
text_utf8.len(),
)]
.iter()
.cloned()
.collect::<String>(),
preview: make_preview(text, start, end, peek_size),
})
}
}
Expand All @@ -128,6 +119,33 @@ fn search_text(
Ok(hits)
}

/// generate a preview of the area around our search target,
/// looking forward _and_ behind by `peek_size` chars
///
/// will not to slice in the middle of UTF8 chars
fn make_preview(text: &str, start: usize, end: usize, peek_size: usize) -> String {
let chars_before = &text[0..start].chars().collect::<Vec<_>>();

let chars_after = &text[end..text.len()].chars().collect::<Vec<_>>();

let search_target = &text[start..end];

let peek_before = chars_before
.iter()
.rev()
.take(peek_size)
.rev()
.cloned()
.collect::<String>();

let peek_after = chars_after
.iter()
.take(peek_size)
.cloned()
.collect::<String>();
format!("{}{}{}", peek_before, search_target, peek_after)
}

fn make_regex_vec(terms: &[&str]) -> Vec<(String, regex::Regex)> {
terms
.iter()
Expand Down

0 comments on commit 1489039

Please sign in to comment.