Class: Labelizor

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

Overview

Pour simplifier l’affichage de table à la console.

@usage

  t = Labelizor.new(<params>)

  t.w "<label>", "<valeur>", <options>
  ...

  t.display # puts 

NOTES
=====
  Il y a des options très pratiques comme la propriété :if qui
  permet de n'écrire la ligne que si la condition est vraie. Ça
  permet de ne pas avoir d'identation dans la définition de la
  table.
  Au lieu de :

    t.w "Mon label", "Ma valeur"
    if cest_vrai
      t.w "Autre label", "Autre valeur"
    end

  … on utilisera :

    t.w "Mon label", "Ma valeur"
    t.w "Autre label", "Autre valeur", if:cest_vrai

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(params = nil) ⇒ Labelizor

Returns a new instance of Labelizor.

Parameters:

  • params (Hash|Nil) (defaults to: nil)

    :titre Le titre à donné au tableau :titre_color Couleur à appliquer (bleu par défaut) :separator le sépateur, en général une espace mais peut être

    aussi un point
    

    :delimitor_size Integer La longueur par défaut d’une

    ligne délimitant les données.
    On peut définir la longueur d'une ligne à la
    volée avec le 2e paramètres : t.w(:delimitor, 20)
    

    :delimitor_char String Caractère utilisé pour le délimiteur

    Par défaut, un signe '='
    

    :gutter Integer La largeur de la gouttière (4 par défaut) :indentation Integer Nombre d’espace en indentation (2 par

    defaut)
    

    :selectable Boolean Si true, l’instance rajoute des numéros

    à chaque item et permet à la fin d'en choisir
    un :  value = Labelizor#display
    


57
58
59
60
# File 'lib/clir/Labelizor.rb', line 57

def initialize(params = nil)
  defaultize_config(params)
  reset
end

Instance Attribute Details

#configObject (readonly)

Returns the value of attribute config.



37
38
39
# File 'lib/clir/Labelizor.rb', line 37

def config
  @config
end

#linesObject (readonly)

Returns the value of attribute lines.



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

def lines
  @lines
end

Instance Method Details

#add_line(dline) ⇒ Object



114
115
116
117
118
119
120
121
122
123
124
125
126
127
# File 'lib/clir/Labelizor.rb', line 114

def add_line(dline)
  #
  # Si c'est une table "sélectionnable", il faut ajouter des
  # index pour choisir la valeur
  # 
  if selectable?
    @values << dline[1].freeze
    dline[0] = "#{@values.count.to_s.rjust(3)}. #{dline[0]}"
  end
  # 
  # Ajout de la ligne
  # 
  @lines << dline
end

#defaultize_config(config) ⇒ Object



61
62
63
64
65
66
67
68
69
70
71
# File 'lib/clir/Labelizor.rb', line 61

def defaultize_config(config)
  @config = config || {}
  @config.key?(:gutter)           || @config.merge!(gutter: 4)
  @config.key?(:indentation)      || @config.merge!(indentation: 2)
  @config.key?(:separator)        || @config.merge!(separator: ' ')
  @config.key?(:delimitor_size)   || @config.merge!(delimitor_size: nil)
  @config.key?(:delimitor_char)   || @config.merge!(delimitor_char: '=')
  @config.key?(:title_delimitor)  || @config.merge!(title_delimitor: '*')
  @config.key?(:delimitor_color)  || @config.merge!(delimitor_color: nil)
  @config.key?(:titre_color)      || @config.merge!(titre_color: :bleu)
end

#delimitor_charObject



194
195
196
# File 'lib/clir/Labelizor.rb', line 194

def delimitor_char
  @delimitor_char || config[:delimitor_char]
end

#delimitor_colorObject



187
188
189
# File 'lib/clir/Labelizor.rb', line 187

def delimitor_color
  @delimitor_color ||= config[:delimitor_color]
end

#delimitor_size(value = nil) ⇒ Object



190
191
192
193
# File 'lib/clir/Labelizor.rb', line 190

def delimitor_size(value = nil)
  return value unless value.nil?
  @delimitor_size ||= config[:delimitor_size] || (label_width - 1)
end

#displayObject Also known as: flush

Méthode pour afficher la table



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
162
163
164
165
# File 'lib/clir/Labelizor.rb', line 130

def display
  puts "\n"
  # 
  # Écriture du titre (if any)
  #
  if @config[:titre]
    sep = @config[:title_delimitor] * (@config[:titre].length + 2)
    titre = ("#{indent + sep}\n#{indent + ' ' + @config[:titre]}\n#{indent + sep}")
    titre = titre.send(@config[:titre_color]) unless config[:titre_color].nil?
    puts titre
  end
  puts "\n"
  #
  # Écriture des lignes
  # 
  lines.each do |lab, val, params|
    case lab
    when :titre then lab, val = [val,'']
    when :delimitor
      lab = delimitor_char * delimitor_size(val)
      val = nil
    else
      lab = "#{lab} ".ljust(label_width - 2, config[:separator])
    end
    str = lab + ' ' + formate_value(val, params)
    str = str.send(params[:color]) if params[:color]
    idt = indent(params)
    str = idt + str.split("\n").join("\n#{idt}")
    puts str
  end
  puts "\n\n"
  if selectable?
    wait_for_item_chosen
  end
  reset
end

#formate_value(val, params) ⇒ Object

Formater la valeur en fonction des paramètres



210
211
212
213
214
215
# File 'lib/clir/Labelizor.rb', line 210

def formate_value(val, params)
  return '' if val.nil?
  val = (val)            if params[:euros]
  val = formate_date(val) if params[:date]
  return val.to_s
end

#indent(params = {}) ⇒ Object



198
199
200
201
202
203
204
205
206
# File 'lib/clir/Labelizor.rb', line 198

def indent(params = {})
  @indent ||= ' ' * config[:indentation]
  case params[:indent]
  when 0        then ''
  when nil      then @indent
  when Integer  then @indent + ' ' * params[:indent]
  when String   then @indent + params[:indent]
  end
end

#label_widthObject

Calcul de la longueur du label



219
220
221
222
223
224
225
226
# File 'lib/clir/Labelizor.rb', line 219

def label_width
  @label_width ||= begin
    maxw = 0; @lines.each do |dline|
      labl = dline[0].length
      maxw = labl if labl > maxw
    end;maxw + config[:gutter]
  end
end

#resetObject



107
108
109
110
111
112
# File 'lib/clir/Labelizor.rb', line 107

def reset
  @label_width = nil
  @lines = [] # pour se servir encore de l'instance
  @indent = nil
  @values = [] # pour selectable
end

#selectable?Boolean

Returns:

  • (Boolean)


228
229
230
# File 'lib/clir/Labelizor.rb', line 228

def selectable?
  :TRUE == @isselectable ||= true_or_false(@config[:selectable] == true)
end

#w(label, value = nil, params = nil) ⇒ Object Also known as: <<

Pour écrire dans la table

Parameters:

  • label (String)

    Le label. Certaines valeurs spéciales peuvent être utilisées comme :delimitor (la longueur sera celle définie en second argument ou celle définie par défaut)

  • value (Any) (defaults to: nil)

    La valeur à afficher à droite du label.

  • params (Hash) (defaults to: nil)

    Les paramètres à appliquer. C’est là que la méthode prend tout son sens. Les valeurs définies peuvent être :

    :color    {Symbol} La méthode de couleur (p.e. :vert)
    :if       On n'affiche la ligne que si la valeur est true
    


88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/clir/Labelizor.rb', line 88

def w(label, value = nil, params = nil)
  params ||= {}
  return if params.key?(:if) && !params[:if]
  # 
  # Traitement de valeur de +label+ spéciales
  # 
  case label
  when :titre, :title
    value = "\n#{value}\n#{'-'*value.length}"
    add_line [:titre, value, params]
  when :delimitor
    params.merge!(color: delimitor_color) unless params.key?(:color)
    add_line([:delimitor, value, params])
  else
    add_line([label || '', value || '', params])
  end
end

#wait_for_item_chosenObject



168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
# File 'lib/clir/Labelizor.rb', line 168

def wait_for_item_chosen
  choix = nil
  nombre_choix = @values.count
  puts "\n"
  while choix.nil?
    STDOUT.write("\rMémoriser : ")
    choix = STDIN.getch.to_i
    if choix > 0 && choix <= nombre_choix
      break
    else
      STDOUT.write "\r                   #{choix} n'est pas compris entre 1 et #{nombre_choix}.".rouge
      choix = nil
    end
  end
  STDOUT.write("\r"+' '*80)
  clip @values[choix.to_i - 1]
  puts "\n\n"    
end