From 9442e2a14c9678c9ad638bfe069e0ea516611de0 Mon Sep 17 00:00:00 2001 From: Mike Carlton Date: Thu, 8 Oct 2015 22:13:24 -0700 Subject: [PATCH 1/3] handle ansi escapes in values --- lib/text-table/cell.rb | 14 ++++++++++---- lib/text-table/table.rb | 2 +- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/text-table/cell.rb b/lib/text-table/cell.rb index f8298a0..9253db0 100644 --- a/lib/text-table/cell.rb +++ b/lib/text-table/cell.rb @@ -23,14 +23,20 @@ def initialize(options = {}) #:nodoc: @colspan = options[:colspan] || 1 end + # visible width: without terminal escapes + def width #:nodoc: + value.gsub(/\033\[[^m]+m/, '').length + end + def to_s #:nodoc: + invisible = value.length - width ([' ' * table.horizontal_padding]*2).join case align when :left - value.ljust cell_width + value.ljust cell_width+invisible when :right - value.rjust cell_width + value.rjust cell_width+invisible when :center - value.center cell_width + value.center cell_width+invisible end end @@ -48,4 +54,4 @@ def cell_width #:nodoc: end end -end \ No newline at end of file +end diff --git a/lib/text-table/table.rb b/lib/text-table/table.rb index 427e611..16f2504 100644 --- a/lib/text-table/table.rb +++ b/lib/text-table/table.rb @@ -153,7 +153,7 @@ def all_text_table_rows #:nodoc: def column_widths #:nodoc: @column_widths ||= \ all_text_table_rows.reject {|row| row.cells == :separator}.map do |row| - row.cells.map {|cell| [(cell.value.length/cell.colspan.to_f).ceil] * cell.colspan}.flatten + row.cells.map {|cell| [(cell.width/cell.colspan.to_f).ceil] * cell.colspan}.flatten end.transpose.map(&:max) end From 80b3675da66779ee42c7933807b0d07ec50a273c Mon Sep 17 00:00:00 2001 From: Mike Carlton Date: Thu, 22 Oct 2015 13:30:38 -0700 Subject: [PATCH 2/3] spec tests for ansi escape support --- spec/integration/alignment_spec.rb | 50 ++++++++++++++++++++++++++++++ spec/spec_helper.rb | 22 +++++++++++++ 2 files changed, 72 insertions(+) diff --git a/spec/integration/alignment_spec.rb b/spec/integration/alignment_spec.rb index 12c8e16..6e3e2ae 100644 --- a/spec/integration/alignment_spec.rb +++ b/spec/integration/alignment_spec.rb @@ -51,6 +51,56 @@ end end + describe 'colorized cell alignment' do + let(:rows) { @rows.map { |row| row.map { |cell| { :value => colorize(cell, :red), :align => align } } } } + subject { decolor(table.to_s) } + + context 'when left' do + let(:align) { :left } + + it { should == deindent(%q{ + +------+------+------+------+ + | a | bb | ccc | dddd | + +------+------+------+------+ + | aa | bbb | cccc | d | + | aaa | bbbb | c | dd | + +------+------+------+------+ + | aaaa | b | cc | ddd | + +------+------+------+------+ + }) } + end + + context 'when center' do + let(:align) { :center } + + it { should == deindent(%q{ + +------+------+------+------+ + | a | bb | ccc | dddd | + +------+------+------+------+ + | aa | bbb | cccc | d | + | aaa | bbbb | c | dd | + +------+------+------+------+ + | aaaa | b | cc | ddd | + +------+------+------+------+ + }) } + end + + context 'when right' do + let(:align) { :right } + + it { should == deindent(%q{ + +------+------+------+------+ + | a | bb | ccc | dddd | + +------+------+------+------+ + | aa | bbb | cccc | d | + | aaa | bbbb | c | dd | + +------+------+------+------+ + | aaaa | b | cc | ddd | + +------+------+------+------+ + }) } + end + end + describe 'cell alignment' do let(:rows) { @rows.map { |row| row.map { |cell| { :value => cell, :align => align } } } } diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 557ceb6..34e2b0d 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -7,3 +7,25 @@ def deindent(table) table.gsub(/^\s*/, '') end + +def decolor(table) + table.gsub(/\033\[[^m]+m/, '') +end + +TERMINAL_COLOR = { + black: 0, + red: 1, + green: 2, + yellow: 3, + blue: 4, + magenta: 5, + cyan: 6, + white: 7 +} + +def colorize(text, foreground = nil, background = nil) + codes = [ ] + codes << 30 + TERMINAL_COLOR[foreground] if foreground + codes << 40 + TERMINAL_COLOR[background] if background + "\x1b[#{codes.join(';')}m#{text}\x1b[0m" +end From 82e33aef4ad2a24165c5de576aacfbb814ad01f9 Mon Sep 17 00:00:00 2001 From: Mike Carlton Date: Thu, 22 Oct 2015 14:41:05 -0700 Subject: [PATCH 3/3] fix spec helper to work with ruby 1.8.7 --- spec/spec_helper.rb | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 34e2b0d..9d23ee8 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -13,14 +13,14 @@ def decolor(table) end TERMINAL_COLOR = { - black: 0, - red: 1, - green: 2, - yellow: 3, - blue: 4, - magenta: 5, - cyan: 6, - white: 7 + :black => 0, + :red => 1, + :green => 2, + :yellow => 3, + :blue => 4, + :magenta => 5, + :cyan => 6, + :white => 7 } def colorize(text, foreground = nil, background = nil)