Class: Clir::Table

Inherits:
Object
  • Object
show all
Defined in:
lib/clir/Table.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(params = nil) ⇒ Table

Instanciation

:colonnes_totaux  {Hash} Table des indices (1-start) des
                  colonnes dont il faut faire la somme.
                  Avec en clé l'indice réel de la colonne et
                  en valeur soit nil pour un nombre normal, 
                  soit :euros pour une somme financière.
                  Si cette donnée est définie, une nouvelle
                  ligne sera ajoutée au bout du tableau avec
                  la somme de cette colonne.

:header   {Array} Entête, nom de chaque colonne. On peut 
          utiliser les retours de chariot pour faire deux
          lignes.
:gutter   {Integer} Goutière entre chaque colonne. 4 par défaut
:indent   {Integer} Indentation initiale, en nombre d'espaces

:char_separator  {String} La caractère pour faire les lignes
                  horizontales de séparation. Une étoile par
                  défaut.

Parameters:

  • params (Hash) (defaults to: nil)

    Définition générale de la table.

Options Hash (params):

  • :align (Hash)

    Définition de l’alignement dans les colonnes. En clé l’indice 1-start de la colonne, en valeur une valeur parmi :right, :left et :center

  • :max_widths (Array|Hash|Integer)

    Max width for columns. If it’s a integer, it’s the max width for each column. If it’s an Array, it’s the definition of each column in order. For example, [4, 5, 6] means 4 signs for the first column, 5 for the second one and 6 for the third column. Columns without max widths must have nil value. If it’s a Hash, the key is the column index (1-start) and the value is the max lenght in signs.



82
83
84
85
86
# File 'lib/clir/Table.rb', line 82

def initialize(params = nil)
  @params = params || {}
  @lines = []
  add_header_lines
end

Instance Attribute Details

#column_countObject (readonly)

Returns the value of attribute column_count.



38
39
40
# File 'lib/clir/Table.rb', line 38

def column_count
  @column_count
end

#paramsObject (readonly)

Returns the value of attribute params.



36
37
38
# File 'lib/clir/Table.rb', line 36

def params
  @params
end

Instance Method Details

#add(ary) ⇒ Object Also known as: <<



161
162
163
# File 'lib/clir/Table.rb', line 161

def add(ary)
  @lines << ary
end

#add_header_linesObject

Building header

On part toujours du principe qu’il y a deux lignes, et si l’une est vide, on n’en met qu’une seule.



170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
# File 'lib/clir/Table.rb', line 170

def add_header_lines
  @header_lines = []
  return if params[:header].nil?
  two_lines = false
  line1 = []
  line2 = []
  params[:header].each do |lib|
    lib1, lib2 = 
      if lib.match?("\n")
        two_lines = true
        lib.split("\n")
      else
        ['', lib]
      end
    line1 << lib1
    line2 << lib2
  end
  @column_count = line2.count
  @header_lines << line1 if two_lines
  @header_lines << line2
  @header_lines << :separation
end

#alignObject



217
218
219
# File 'lib/clir/Table.rb', line 217

def align
  @align ||= params[:align]
end

#char_separatorObject



201
202
203
# File 'lib/clir/Table.rb', line 201

def char_separator
  @char_separator ||= params[:char_separator] || '*'
end

#colonne_alignsObject

Alignement des colonnes



230
231
232
# File 'lib/clir/Table.rb', line 230

def colonne_aligns
  @colonne_aligns
end

#colonnes_totauxObject



225
226
227
# File 'lib/clir/Table.rb', line 225

def colonnes_totaux
  @colonnes_totaux ||= params[:colonnes_totaux]
end

#displayObject



88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# File 'lib/clir/Table.rb', line 88

def display
  #
  # On définit l'alignement de chaque colonne
  # 
  define_colonnes_align

  #
  # On fait les totaux des colonnes désignées
  # 
  formate_cells_totaux unless colonnes_totaux.nil?

  # 
  # On mesure les largeurs des colonnes
  # 
  calc_column_widths

  #
  # On ajoute une séparation à la toute fin
  # 
  add(separation)

  # 
  # Séparation toujours
  # 
  puts "\n\n"

  #
  # Écriture du titre (if any)
  # 
  traite_titre if @params[:title]

  # 
  # Boucle sur chaque ligne d'entête
  # 
  @header_lines.each do |cols|
    traite_colonnes( cols, is_header = true )
  end
  # 
  # Boucle sur chaque ligne de données
  # 
  @lines.each do |cols|
    traite_colonnes( cols, is_header = false)
  end
  puts "\n\n"
end

#gutterObject



205
206
207
# File 'lib/clir/Table.rb', line 205

def gutter
  @gutter ||= ' ' * gutter_width
end

#gutter_widthObject



209
210
211
# File 'lib/clir/Table.rb', line 209

def gutter_width
  @gutter_width ||= params[:gutter] || 4
end

#indentObject



213
214
215
# File 'lib/clir/Table.rb', line 213

def indent
  @indent ||= ' ' * (params[:indent] || 2)
end

#max_widthsObject



221
222
223
# File 'lib/clir/Table.rb', line 221

def max_widths
  @max_widths ||= params[:max_widths]
end

#separationObject



197
198
199
# File 'lib/clir/Table.rb', line 197

def separation
  @separation ||= char_separator * (table_width + 4)
end

#table_widthObject



193
194
195
# File 'lib/clir/Table.rb', line 193

def table_width
  @table_width ||= @column_widths.sum + (gutter_width * (column_count - 1))
end

#traite_colonnes(cols, for_header = false) ⇒ Object



139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
# File 'lib/clir/Table.rb', line 139

def traite_colonnes(cols, for_header = false)
  line = 
    case cols
    when Array
      '  ' + cols.collect.with_index do |col, idx|
        alignment = for_header ? :ljust : colonne_aligns[idx]
        col = col.to_s
        if col.length > @column_widths[idx]
          col[0...(@column_widths[idx] - 1)] + ''
        else
          col.to_s.send(alignment, @column_widths[idx])
        end
      end.join(gutter) + '  '
    when :separation  then separation
    when String       then cols
    end
  #
  # Écriture de la ligne
  # 
  puts indent + line    
end

#traite_titreObject



135
136
137
# File 'lib/clir/Table.rb', line 135

def traite_titre
  puts "#{indent}#{char_separator} #{params[:title].upcase} #{char_separator}\n#{indent}#{separation}"
end