|
|
@ -3,6 +3,8 @@ use ropey::{iter::Chunks, str_utils::byte_to_char_idx, RopeSlice};
|
|
|
|
use unicode_segmentation::{GraphemeCursor, GraphemeIncomplete};
|
|
|
|
use unicode_segmentation::{GraphemeCursor, GraphemeIncomplete};
|
|
|
|
use unicode_width::UnicodeWidthStr;
|
|
|
|
use unicode_width::UnicodeWidthStr;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
use std::fmt;
|
|
|
|
|
|
|
|
|
|
|
|
#[must_use]
|
|
|
|
#[must_use]
|
|
|
|
pub fn grapheme_width(g: &str) -> usize {
|
|
|
|
pub fn grapheme_width(g: &str) -> usize {
|
|
|
|
if g.as_bytes()[0] <= 127 {
|
|
|
|
if g.as_bytes()[0] <= 127 {
|
|
|
@ -147,7 +149,7 @@ pub fn is_grapheme_boundary(slice: RopeSlice, char_idx: usize) -> bool {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// An iterator over the graphemes of a `RopeSlice`.
|
|
|
|
/// An iterator over the graphemes of a `RopeSlice`.
|
|
|
|
#[derive(Debug, Clone)]
|
|
|
|
#[derive(Clone)]
|
|
|
|
pub struct RopeGraphemes<'a> {
|
|
|
|
pub struct RopeGraphemes<'a> {
|
|
|
|
text: RopeSlice<'a>,
|
|
|
|
text: RopeSlice<'a>,
|
|
|
|
chunks: Chunks<'a>,
|
|
|
|
chunks: Chunks<'a>,
|
|
|
@ -156,6 +158,18 @@ pub struct RopeGraphemes<'a> {
|
|
|
|
cursor: GraphemeCursor,
|
|
|
|
cursor: GraphemeCursor,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
impl<'a> fmt::Debug for RopeGraphemes<'a> {
|
|
|
|
|
|
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
|
|
|
|
|
|
f.debug_struct("RopeGraphemes")
|
|
|
|
|
|
|
|
.field("text", &self.text)
|
|
|
|
|
|
|
|
.field("chunks", &self.chunks)
|
|
|
|
|
|
|
|
.field("cur_chunk", &self.cur_chunk)
|
|
|
|
|
|
|
|
.field("cur_chunk_start", &self.cur_chunk_start)
|
|
|
|
|
|
|
|
// .field("cursor", &self.cursor)
|
|
|
|
|
|
|
|
.finish()
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
impl<'a> RopeGraphemes<'a> {
|
|
|
|
impl<'a> RopeGraphemes<'a> {
|
|
|
|
#[must_use]
|
|
|
|
#[must_use]
|
|
|
|
pub fn new(slice: RopeSlice) -> RopeGraphemes {
|
|
|
|
pub fn new(slice: RopeSlice) -> RopeGraphemes {
|
|
|
|