web-dev-qa-db-fra.com

Comment sortir mon Ruby texte de ligne de commande en différentes couleurs

Comment puis-je faire les commandes put que je génère à partir d'une ligne de commande basée sur Ruby couleur du programme? J'apprécierais toute référence à la façon dont j'appelle chaque couleur différente également.

Disons que nous commençons par cela ..

puts "The following Word is blue.. Im Blue!"
puts "The following Word is green.. Im Green!"
puts "The following Word is red.. Im Red!"

Et je reçois un texte différent que je veux dans différentes couleurs que je veux, vous avez l'idée.

Im utilisant Ubuntu, aurais-je besoin de changer mon approche pour que le programme sorte correctement dans diff os?

40
Evolve

J'ai trouvé cet article décrivant un moyen très simple d'écrire des textes colorés sur la console. L'article décrit ce petit exemple qui semble faire l'affaire (j'ai pris la liberté de l'améliorer légèrement):

def colorize(text, color_code)
  "\e[#{color_code}m#{text}\e[0m"
end

def red(text); colorize(text, 31); end
def green(text); colorize(text, 32); end

# Actual example
puts 'Importing categories [ ' + green('DONE') + ' ]'
puts 'Importing tags       [' + red('FAILED') + ']'

Le mieux semble définir certaines des couleurs. Vous pouvez étendre l'exemple lorsque vous avez également besoin de différentes couleurs d'arrière-plan (voir en bas de l'article).

Lors de l'utilisation de Windows XP, l'auteur mentionne l'exigence d'une gemme appelée win32console .

57
Veger

Je trouve que le Gemme colorée est le plus simple et le plus propre à utiliser.

puts "this is red".red
puts "this is red with a blue background (read: ugly)".red_on_blue
puts "this is red with an underline".red.underline
puts "this is really bold and really blue".bold.blue
logger.debug "hey this is broken!".red_on_yellow 
38
Mark Carey

J'ai créé quelque chose comme ça:

begin
   require 'Win32/Console/ANSI' if PLATFORM =~ /win32/
rescue LoadError
   raise 'You must gem install win32console to use color on Windows'
end

class Colors
   COLOR1 = "\e[1;36;40m"
   COLOR2 = "\e[1;35;40m"
   NOCOLOR = "\e[0m"
   RED = "\e[1;31;40m"
   GREEN = "\e[1;32;40m"
   DARKGREEN = "\e[0;32;40m"
   YELLOW = "\e[1;33;40m"
   DARKCYAN = "\e[0;36;40m"
end

class String
   def color(color)
      return color + self + Colors::NOCOLOR
   end
end

Maintenant, vous pouvez simplement utiliser une autre méthode de String:

"Hello World".color(Colors::DARKGREEN)

Pour connaître toutes les couleurs, exécutez simplement ceci:

begin
  require 'Win32/Console/ANSI' if PLATFORM =~ /win32/
rescue LoadError
  raise 'You must gem install win32console to use color on Windows'
end

[0, 1, 4, 5, 7].each do |attr|
  puts '----------------------------------------------------------------'
  puts "ESC[#{attr};Foreground;Background"
  30.upto(37) do |fg|
    40.upto(47) do |bg|
      print "\033[#{attr};#{fg};#{bg}m #{fg};#{bg}  "
    end
  puts "\033[0m"
  end
end
6
darek129

utiliser la séquence d'échappement \033 au lieu de \e car il est 100% compatible posix et fonctionnera également sur les systèmes bsd-ish (par exemple osx). ce dernier est une extension gnu.

5
glasz

Je pensais ajouter une autre solution car elle fait les choses un peu différemment et comprend plus de codes de couleur:

D'abord quelques exemples ...

Utilisation du chaînage de méthodes:

String.include(AnsiTextStyles)

puts "How are you?".blue.bold + " " + 'I am good!'.red.bold
puts '%s %s' % ["How are you?".blue.bold, 'I am good!'.red.bold]

Utilisation de la méthode style et application de plusieurs attributs:

puts "How are you?".style(:red)
puts 'I am good!'.style(:blue, :underline)
puts 'Good to hear'.style([:bg_Magenta, :blink])

Cela peut être utilisé pour stocker les attributs de style d'une manière quelconque pour les appliquer plus tard:

text_styles = {
    red_bold:       [:red, :bold],
    blue_underline: [:blue, :underline],
    pretty:         [:bg_Magenta, :blink],
  }

text_styles.each do |name, style|
  styled_text = "Text styled multiple ways".style(style)
  puts "%s: %s" % [name, styled_text]
end

J'ai donné quelques exemples supplémentaires sur cet Gist que j'ai créé et développé le code pour inclure des améliorations afin que les modifications apportées à String soient limitées.

Voici le code de base:

module AnsiTextStyles

  TEXT_ATTRIBUTES = {
      # text properties
      none: 0, # turn off all attributes
      bold: 1, bright: 1, # these do the same thing really
      italic: 3, underline: 4, blink: 5,
      reverse: 7, # swap foreground and background colours
      hide: 8, # foreground color same as background

      # foreground colours
      black: 30, grey: 90, lt_grey: 37, :white => 97,
      red: 31, lt_red: 91, 
      green: 32, lt_green: 92,
      dk_yellow: 33, brown: 33, yellow: 93,
      blue: 34, lt_blue: 94,
      Magenta: 35, pink: 95, lt_Magenta: 95,
      cyan: 36, lt_cyan: 96,
      default: 39,

      # background colours
      bg_black: 40, bg_grey: 100, bg_lt_grey: 47, bg_white: 107,
      bg_red: 41, bg_lt_red: 101,
      bg_green: 42, bg_lt_green: 102,
      bg_dk_yellow: 43, bg_brown: 43, bg_yellow: 103,
      bg_blue: 44, bg_lt_blue: 104,
      bg_Magenta: 45, bg_pink: 105, bg_lt_Magenta: 105,
      bg_cyan: 46, bg_lt_cyan: 106,
    }

  def self.text_attributes
    TEXT_ATTRIBUTES.keys
  end

  # applies the text attributes to the current string
  def style(*text_attributes)
    codes = TEXT_ATTRIBUTES.values_at(*text_attributes.flatten).compact
    "\e[%sm%s\e[m" % [codes.join(';'), self.to_s]
  end

end
4
br3nt

Utilisez Colorize gem! Vérifiez-le:

https://github.com/fazibear/colorize

Installation:

Sudo gem install colorize

usage:

require 'colorize'

puts "I am now red.".red
puts "I am now blue.".green
puts "I am a super coder".yellow
1
mpz
1
St.Woland

Pour une solution rapide et sale, vous pouvez simplement incorporer ASCII codes couleur dans vos chaînes (\ e [XXm définit la couleur à utiliser désormais sur XX et\e [0m réinitialise la couleur sur Ordinaire):

puts "The following Word is blue.. \e[34mIm Blue!\e[0m"
puts "The following Word is green.. \e[32mIm Green!\e[0m"
puts "The following Word is red.. \e[31mIm Red!\e[0m"

Les codes ASCII prennent également en charge des éléments comme le soulignement, le clignotement et la mise en surbrillance du texte.

Il semble également y avoir une bibliothèque d'aide disponible qui traite les codes ASCII pour vous).

Edit : en ce qui concerne les différentes plates-formes: vous ne devriez avoir aucun problème à utiliser les codes ASCII sur les machines Unix, mais Windows , AFAIK, ne les prend pas en charge. Heureusement, il y a un win32console gem qui semble résoudre ce problème.

Vous pouvez utiliser l'extrait de code suivant (présent sur la page liée à Veger) pour charger la bibliothèque win32console uniquement sur Windows:

begin
  require 'Win32/Console/ANSI' if PLATFORM =~ /win32/
rescue LoadError
  raise 'You must gem install win32console to use color on Windows'
end
1
liwp
1
Chris

Ma suggestion: le Paint bijou. Il n'applique pas les extensions de chaîne et prend en charge 256 couleurs (avec mode de repli pour les terminaux non 256 couleurs).

Usage:

puts Paint["I'm blue!", :blue]
puts Paint["I'm dark blue if your terminal supports it!", "#000044"]
1
J-_-L