Class: ANSI::Columns

Inherits:
Object
  • Object
show all
Defined in:
lib/ansi/columns.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(list, options = {}, &format) ⇒ Columns

Create a column-based layout.

The format block MUST return ANSI codes.

Parameters:

  • list (String, Array)

    Multiline String or Array of strings to columnize.

  • options (Hash) (defaults to: {})

    Options to customize columnization.

Options Hash (options):

  • :columns (Fixnum)

    Number of columns.

  • :align (Symbol)

    Column alignment, either :left, :right or :center.

  • :padding (String, Fixnum)

    String or number or spaces to append to each column.



26
27
28
29
30
31
32
33
34
35
36
# File 'lib/ansi/columns.rb', line 26

def initialize(list, options={}, &format)
  self.list = list

  self.columns = options[:columns] || options[:cols]
  self.padding = options[:padding] || 1
  self.align   = options[:align]   || :left
  #self.ansi    = options[:ansi]
  self.format  = format

  #@columns = nil if @columns == 0
end

Instance Attribute Details

#alignObject

Alignment to apply to cells.



82
83
84
# File 'lib/ansi/columns.rb', line 82

def align
  @align
end

#columnsObject

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

#formatObject

Formating to apply to cells.



98
99
100
# File 'lib/ansi/columns.rb', line 98

def format
  @format
end

#listObject

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

#paddingObject

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

#inspectObject



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)

TODO:

Put in empty strings for blank cells.

TODO:

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