Skip to content

Commit

Permalink
Use unicode char width for incrementing segment offset
Browse files Browse the repository at this point in the history
  • Loading branch information
ku1ik committed Feb 24, 2024
1 parent 5367506 commit e7d54d9
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 8 deletions.
1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ license = "Apache-2.0"
[dependencies]
serde = { version = "1.0.130", features = ["derive"] }
rgb = "0.8.33"
unicode-width = "0.1.11"

[dev-dependencies]
rand = "0.7"
Expand Down
5 changes: 5 additions & 0 deletions src/cell.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use crate::pen::Pen;
use unicode_width::UnicodeWidthChar;

#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub struct Cell(pub char, pub Pen);
Expand All @@ -11,6 +12,10 @@ impl Cell {
pub fn is_default(&self) -> bool {
self.0 == ' ' && self.1.is_default()
}

pub(crate) fn char_width(&self) -> usize {
UnicodeWidthChar::width(self.0).unwrap_or(0)
}
}

impl Default for Cell {
Expand Down
32 changes: 24 additions & 8 deletions src/line.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
use std::ops::{Index, Range, RangeFull};

use crate::cell::Cell;
use crate::dump::Dump;
use crate::pen::Pen;
use crate::segment::Segment;
use std::ops::{Index, Range, RangeFull};

#[derive(Debug, Clone, PartialEq)]
pub struct Line {
Expand Down Expand Up @@ -201,13 +200,16 @@ impl<'a, I: Iterator<Item = &'a Cell>, F: Fn(&char) -> bool> Iterator for Segmen
}

for cell in self.iter.by_ref() {
self.offset += 1;
let char_width = cell.char_width();
let offset = self.offset;
self.offset += char_width;

if (self.predicate)(&cell.0) {
let ready = Some(Segment {
chars: vec![cell.0],
pen: cell.1,
offset: self.offset - 1,
offset,
char_width,
});

if let Some(segment) = self.current.take() {
Expand All @@ -220,12 +222,15 @@ impl<'a, I: Iterator<Item = &'a Cell>, F: Fn(&char) -> bool> Iterator for Segmen

match self.current.as_mut() {
Some(segment) => {
if cell.1 != segment.pen {
return self.current.replace(Segment {
if cell.1 != segment.pen || char_width != segment.char_width {
let ready = self.current.replace(Segment {
chars: vec![cell.0],
pen: cell.1,
offset: self.offset - 1,
offset,
char_width,
});

return ready;
}

segment.chars.push(cell.0);
Expand All @@ -235,7 +240,8 @@ impl<'a, I: Iterator<Item = &'a Cell>, F: Fn(&char) -> bool> Iterator for Segmen
self.current = Some(Segment {
chars: vec![cell.0],
pen: cell.1,
offset: self.offset - 1,
offset,
char_width,
});
}
}
Expand Down Expand Up @@ -295,6 +301,8 @@ mod tests {
Cell('c', pen2),
Cell('d', pen1),
Cell('e', pen1),
Cell('👩', pen1),
Cell('f', pen1),
];

let segments: Vec<Segment> = Segments::new(cells.iter(), |_| false).collect();
Expand All @@ -310,6 +318,14 @@ mod tests {
assert_eq!(&segments[2].chars, &['d', 'e']);
assert_eq!(segments[2].pen, pen1);
assert_eq!(segments[2].offset, 3);

assert_eq!(&segments[3].chars, &['👩']);
assert_eq!(segments[3].pen, pen1);
assert_eq!(segments[3].offset, 5);

assert_eq!(&segments[4].chars, &['f']);
assert_eq!(segments[4].pen, pen1);
assert_eq!(segments[4].offset, 7);
}

#[test]
Expand Down
2 changes: 2 additions & 0 deletions src/segment.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ pub struct Segment {
pub(crate) chars: Vec<char>,
pub(crate) pen: Pen,
pub(crate) offset: usize,
#[serde(skip)]
pub(crate) char_width: usize,
}

impl Segment {
Expand Down

0 comments on commit e7d54d9

Please sign in to comment.