Class: ANSI::Columns
- Inherits:
-
Object
- Object
- ANSI::Columns
- Defined in:
- lib/ansi/columns.rb
Instance Attribute Summary collapse
-
#align ⇒ Object
Alignment to apply to cells.
-
#columns ⇒ Object
Default number of columns to display.
-
#format ⇒ Object
Formating to apply to cells.
-
#list ⇒ Object
List layout into columns.
-
#padding ⇒ Object
Padding size to apply to cells.
Instance Method Summary collapse
-
#ansi_formatting(cell, col, row) ⇒ Object
private
Used to apply ANSI formatting to each cell.
-
#initialize(list, options = {}, &format) ⇒ Columns
constructor
Create a column-based layout.
- #inspect ⇒ Object
- #join(cols = nil) ⇒ Object
-
#template(max, pad) ⇒ Object
private
Aligns the cell left or right.
-
#to_s(cols = nil) ⇒ Object
Return string in column layout.
-
#to_s_columns(columns = nil) ⇒ Object
private
Layout string lines into columns.
Constructor Details
#initialize(list, options = {}, &format) ⇒ Columns
Create a column-based layout.
The format
block MUST return ANSI codes.
26 27 28 29 30 31 32 33 34 35 36 |
# File 'lib/ansi/columns.rb', line 26 def initialize(list, ={}, &format) self.list = list self.columns = [:columns] || [:cols] self.padding = [:padding] || 1 self.align = [:align] || :left #self.ansi = options[:ansi] self.format = format #@columns = nil if @columns == 0 end |
Instance Attribute Details
#align ⇒ Object
Alignment to apply to cells.
82 83 84 |
# File 'lib/ansi/columns.rb', line 82 def align @align end |
#columns ⇒ Object
Default number of columns to display. If nil then the number of coumns is estimated from the size of the terminal.
58 59 60 |
# File 'lib/ansi/columns.rb', line 58 def columns @columns end |
#format ⇒ Object
Formating to apply to cells.
98 99 100 |
# File 'lib/ansi/columns.rb', line 98 def format @format end |
#list ⇒ Object
List layout into columns. Each new line is taken to be a row-column cell.
45 46 47 |
# File 'lib/ansi/columns.rb', line 45 def list @list end |
#padding ⇒ Object
Padding size to apply to cells.
69 70 71 |
# File 'lib/ansi/columns.rb', line 69 def padding @padding end |
Instance Method Details
#ansi_formatting(cell, col, row) ⇒ Object (private)
Used to apply ANSI formatting to each cell.
177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 |
# File 'lib/ansi/columns.rb', line 177 def ansi_formatting(cell, col, row) if @format case @format.arity when 0 f = @format[] when 1 f = @format[cell] when 2 f = @format[col, row] else f = @format[cell, col, row] end else f = nil end [f].flatten.compact end |
#inspect ⇒ Object
39 40 41 |
# File 'lib/ansi/columns.rb', line 39 def inspect "#<#{self.class}:#{object_id} #{list.inspect} x #{columns}>" end |
#join(cols = nil) ⇒ Object
116 117 118 |
# File 'lib/ansi/columns.rb', line 116 def join(cols=nil) to_s_columns(cols || columns) end |
#template(max, pad) ⇒ Object (private)
Aligns the cell left or right.
164 165 166 167 168 169 170 171 172 173 174 |
# File 'lib/ansi/columns.rb', line 164 def template(max, pad) case align when :center, 'center' offset = " " * (max / 2) "#{offset}%#{max}s#{offset}#{pad}" when :right, 'right' "%#{max}s#{pad}" else "%-#{max}s#{pad}" end end |
#to_s(cols = nil) ⇒ Object
Return string in column layout. The number of columns is determined by the ‘columns` property or overriden by cols
argument.
111 112 113 |
# File 'lib/ansi/columns.rb', line 111 def to_s(cols=nil) to_s_columns(cols || columns) end |
#to_s_columns(columns = nil) ⇒ Object (private)
Put in empty strings for blank cells.
Centering look like it’s off by one to the right.
Layout string lines into columns.
127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 |
# File 'lib/ansi/columns.rb', line 127 def to_s_columns(columns=nil) lines = list.to_a count = lines.size max = lines.map{ |l| l.size }.max if columns.nil? width = Terminal.terminal_width columns = (width / (max + padding.size)).to_i end rows = [] mod = (count / columns.to_f).to_i mod += 1 if count % columns != 0 lines.each_with_index do |line, index| (rows[index % mod] ||=[]) << line.strip end pad = padding tmp = template(max, pad) str = "" rows.each_with_index do |row, ri| row.each_with_index do |cell, ci| ansi_codes = ansi_formatting(cell, ci, ri) if ansi_codes.empty? str << (tmp % cell) else str << (tmp % cell).ansi(*ansi_codes) end end str.rstrip! str << "\n" end str end |