fix: support cjk

This commit is contained in:
Xerxes-2 2024-06-30 20:04:59 +10:00
parent 8f414a4c6b
commit 1182ce69ec
No known key found for this signature in database
GPG key ID: A6C508165D76B601
2 changed files with 24 additions and 2 deletions

View file

@ -39,8 +39,9 @@ impl Input {
));
let (limit, snap) = (self.limit(), self.snap_mut());
let offset =
snap.cursor.saturating_sub(limit / 2).min(snap.len().saturating_sub(limit.saturating_sub(1)));
let offset = InputSnap::find_window_backward(&snap.value, snap.cursor, limit / 2)
.start
.min(InputSnap::find_window_backward(&snap.value, snap.value.chars().count(), limit).start);
if snap.offset != offset {
snap.offset = offset;
} else if snap.value.is_empty() {

View file

@ -87,4 +87,25 @@ impl InputSnap {
}
*v.first().unwrap()..v.last().unwrap() + 1
}
#[inline]
pub(super) fn find_window_backward(s: &str, offset: usize, limit: usize) -> Range<usize> {
let mut width = 0;
let len = s.chars().count();
let v: Vec<_> = s
.chars()
.rev()
.enumerate()
.skip(len.saturating_sub(offset + 1))
.map_while(|(i, c)| {
width += c.width().unwrap_or(0);
if width < limit { Some(len.saturating_sub(i + 1)) } else { None }
})
.collect();
if v.is_empty() {
return 0..0;
}
*v.last().unwrap()..v.first().unwrap() + 1
}
}