瀏覽代碼

Fix TextCellContents cjk width

quininer kel 8 年之前
父節點
當前提交
0828133300
共有 2 個文件被更改,包括 11 次插入6 次删除
  1. 10 5
      src/output/cell.rs
  2. 1 1
      src/output/grid_details.rs

+ 10 - 5
src/output/cell.rs

@@ -1,5 +1,6 @@
 //! The `TextCell` type for the details and lines views.
 
+use std::iter::Sum;
 use std::ops::{Add, Deref, DerefMut};
 
 use ansi_term::{Style, ANSIString, ANSIStrings};
@@ -163,11 +164,9 @@ impl TextCellContents {
     /// Calculates the width that a cell with these contents would take up, by
     /// counting the number of characters in each unformatted ANSI string.
     pub fn width(&self) -> DisplayWidth {
-        let sum = self.0.iter()
-                      .map(|anstr| anstr.chars().count())
-                      .sum();
-
-        DisplayWidth(sum)
+        self.0.iter()
+            .map(|anstr| DisplayWidth::from(anstr.deref()))
+            .sum()
     }
 
     /// Promotes these contents to a full cell containing them alongside
@@ -239,6 +238,12 @@ impl Add<usize> for DisplayWidth {
     }
 }
 
+impl Sum for DisplayWidth {
+    fn sum<I>(iter: I) -> Self where I: Iterator<Item=Self> {
+        iter.fold(DisplayWidth(0), Add::add)
+    }
+}
+
 
 #[cfg(test)]
 mod width_unit_test {

+ 1 - 1
src/output/grid_details.rs

@@ -158,4 +158,4 @@ fn divide_rounding_up(a: usize, b: usize) -> usize {
     let mut result = a / b;
     if a % b != 0 { result += 1; }
     result
-}
+}