diff --git a/lib/terminal-table/cell.rb b/lib/terminal-table/cell.rb index 831fabb..0ac9b06 100644 --- a/lib/terminal-table/cell.rb +++ b/lib/terminal-table/cell.rb @@ -1,3 +1,5 @@ +require 'unicode/display_width' + module Terminal class Table class Cell @@ -55,7 +57,8 @@ def lines def render(line = 0) left = " " * @table.style.padding_left right = " " * @table.style.padding_right - render_width = lines[line].to_s.size - escape(lines[line]).size + width + display_width = Unicode::DisplayWidth.of(escape(lines[line])) + render_width = lines[line].to_s.size - display_width + width align("#{left}#{lines[line]}#{right}", alignment, render_width + @table.cell_padding) end alias :to_s :render @@ -65,7 +68,7 @@ def render(line = 0) # removes all ANSI escape sequences (e.g. color) def value_for_column_width_recalc - lines.map{ |s| escape(s) }.max_by{ |s| s.size } + lines.map{ |s| escape(s) }.max_by{ |s| Unicode::DisplayWidth.of(s) } end ## diff --git a/lib/terminal-table/table.rb b/lib/terminal-table/table.rb index 8deff1c..458bac3 100755 --- a/lib/terminal-table/table.rb +++ b/lib/terminal-table/table.rb @@ -1,3 +1,5 @@ +require 'unicode/display_width' + module Terminal class Table @@ -200,7 +202,7 @@ def recalc_column_widths row colspan = cell.colspan cell_value = cell.value_for_column_width_recalc colspan.downto(1) do |j| - cell_length = cell_value.to_s.length + cell_length = Unicode::DisplayWidth.of(cell_value.to_s) if colspan > 1 spacing_length = cell_spacing * (colspan - 1) length_in_columns = (cell_length - spacing_length) diff --git a/spec/table_spec.rb b/spec/table_spec.rb index aca36d7..5c93da6 100755 --- a/spec/table_spec.rb +++ b/spec/table_spec.rb @@ -591,5 +591,18 @@ module Terminal EOF end + it "should render a table with fullwidth characters" do + @table.headings = ['COL 1', 'COL 2', 'COL 3', 'COL4'] + @table << ['中文', 'にっぽんご', '한국어', 'ABC'] + @table << ['Chinese','Japanese','Korean', '.......'] + @table.render.should == <<-EOF.deindent + +---------+------------+--------+----------+ + | COL 1 | COL 2 | COL 3 | COL4 | + +---------+------------+--------+----------+ + | 中文 | にっぽんご | 한국어 | ABC | + | Chinese | Japanese | Korean | ....... | + +---------+------------+--------+----------+ + EOF + end end end diff --git a/terminal-table.gemspec b/terminal-table.gemspec index 6fc6c69..2a4c923 100644 --- a/terminal-table.gemspec +++ b/terminal-table.gemspec @@ -21,4 +21,6 @@ Gem::Specification.new do |spec| spec.add_development_dependency "rspec", ">= 3.0" spec.add_development_dependency "term-ansicolor" spec.add_development_dependency "pry" + + spec.add_runtime_dependency "unicode-display_width", "~> 1.1" end