fix unicode issue (#71)

This commit is contained in:
Clément DOUIN 2021-04-08 12:59:44 +02:00
parent 14d8a3fecd
commit 994141f852
No known key found for this signature in database
GPG key ID: 69C9B9CFFDEE2DEF
4 changed files with 18 additions and 13 deletions

View file

@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
### Fixed
- Unicode chars breaks the view [#71]
### Added
- Telescope support [#61]
@ -118,3 +122,4 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
[#40]: https://github.com/soywod/himalaya/issues/40
[#41]: https://github.com/soywod/himalaya/issues/41
[#61]: https://github.com/soywod/himalaya/issues/61
[#71]: https://github.com/soywod/himalaya/issues/71

1
Cargo.lock generated
View file

@ -318,6 +318,7 @@ dependencies = [
"terminal_size",
"toml",
"tree_magic",
"unicode-width",
"uuid",
]

View file

@ -18,4 +18,5 @@ serde_json = "1.0.61"
terminal_size = "0.1.15"
toml = "0.5.8"
tree_magic = "0.2.3"
unicode-width = "0.1.7"
uuid = { version = "0.8", features = ["v4"] }

View file

@ -1,5 +1,6 @@
use std::fmt;
use terminal_size::terminal_size;
use unicode_width::UnicodeWidthStr;
#[derive(Clone, Debug)]
pub struct Style(u8, u8, u8);
@ -46,8 +47,8 @@ impl Cell {
}
}
pub fn printable_value_len(&self) -> usize {
self.value.chars().collect::<Vec<_>>().len()
pub fn unicode_width(&self) -> usize {
UnicodeWidthStr::width(self.value.as_str())
}
pub fn render(&self, col_size: usize) -> String {
@ -58,18 +59,15 @@ impl Cell {
.collect::<Vec<_>>()
.concat();
let style_end = "\x1b[0m";
let unicode_width = self.unicode_width();
if col_size > 0 && self.printable_value_len() > col_size {
let value: String = self.value.chars().collect::<Vec<_>>()[0..=col_size - 2]
.into_iter()
.collect();
String::from(style_begin + &value + "" + style_end)
if col_size > 0 && unicode_width > col_size {
String::from(style_begin + &self.value[0..=col_size - 2] + "" + style_end)
} else {
let padding = if col_size == 0 {
"".to_string()
} else {
" ".repeat(col_size - self.printable_value_len() + 1)
" ".repeat(col_size - unicode_width + 1)
};
String::from(style_begin + &self.value + &padding + style_end)
@ -102,7 +100,7 @@ pub trait DisplayTable<'a, T: DisplayRow + 'a> {
let head = Self::header_row();
head.iter().for_each(|cell| {
col_sizes.push(cell.printable_value_len());
col_sizes.push(cell.unicode_width());
});
let mut table = self
@ -110,9 +108,9 @@ pub trait DisplayTable<'a, T: DisplayRow + 'a> {
.iter()
.map(|item| {
let row = item.to_row();
row.iter().enumerate().for_each(|(i, cell)| {
col_sizes[i] = col_sizes[i].max(cell.printable_value_len())
});
row.iter()
.enumerate()
.for_each(|(i, cell)| col_sizes[i] = col_sizes[i].max(cell.unicode_width()));
row
})
.collect::<Vec<_>>();