¿Cómo puedo usar Ruby para colorear la salida de texto a una terminal?

Resuelto oldhomemovie asked hace 14 años • 11 respuestas

Usando Ruby, ¿cómo puedo realizar la coloración del texto de fondo y de primer plano para la salida en la terminal?

Recuerdo que cuando programábamos en Pascal todos solíamos escribir nuestros propios textcolor(…)procedimientos para hacer que nuestros pequeños programas educativos parecieran más bonitos y presentativos.

¿Cómo haría para codificar un equivalente de eso en Ruby? ¿Existe algún soporte integrado en la biblioteca principal que se preste a esto? Si no, ¿cuál sería una forma idiomática de agregarlo?

oldhomemovie avatar Sep 29 '09 03:09 oldhomemovie
Aceptado

¡Colorize es mi joya favorita! :-)

Échale un vistazo:

https://github.com/fazibear/colorize

Instalación:

gem install colorize

Uso:

require 'colorize'

puts "I am now red".red
puts "I am now blue".blue
puts "Testing".yellow
jaredmdobson avatar Sep 28 '2009 20:09 jaredmdobson

Combinando las respuestas anteriores, puedes implementar algo que funcione como el color de gema sin necesidad de otra dependencia.

class String
  # colorization
  def colorize(color_code)
    "\e[#{color_code}m#{self}\e[0m"
  end

  def red
    colorize(31)
  end

  def green
    colorize(32)
  end

  def yellow
    colorize(33)
  end

  def blue
    colorize(34)
  end

  def pink
    colorize(35)
  end

  def light_blue
    colorize(36)
  end
end
Erik Skoglund avatar Jul 14 '2012 09:07 Erik Skoglund

Como métodos de clase String (solo Unix):

class String
def black;          "\e[30m#{self}\e[0m" end
def red;            "\e[31m#{self}\e[0m" end
def green;          "\e[32m#{self}\e[0m" end
def brown;          "\e[33m#{self}\e[0m" end
def blue;           "\e[34m#{self}\e[0m" end
def magenta;        "\e[35m#{self}\e[0m" end
def cyan;           "\e[36m#{self}\e[0m" end
def gray;           "\e[37m#{self}\e[0m" end

def bg_black;       "\e[40m#{self}\e[0m" end
def bg_red;         "\e[41m#{self}\e[0m" end
def bg_green;       "\e[42m#{self}\e[0m" end
def bg_brown;       "\e[43m#{self}\e[0m" end
def bg_blue;        "\e[44m#{self}\e[0m" end
def bg_magenta;     "\e[45m#{self}\e[0m" end
def bg_cyan;        "\e[46m#{self}\e[0m" end
def bg_gray;        "\e[47m#{self}\e[0m" end

def bold;           "\e[1m#{self}\e[22m" end
def italic;         "\e[3m#{self}\e[23m" end
def underline;      "\e[4m#{self}\e[24m" end
def blink;          "\e[5m#{self}\e[25m" end
def reverse_color;  "\e[7m#{self}\e[27m" end
end

Y uso:

puts "I'm back green".bg_green
puts "I'm red and back cyan".red.bg_cyan
puts "I'm bold and green and backround red".bold.green.bg_red

En mi consola:

Ingrese la descripción de la imagen aquí

Además,

def no_colors
  self.gsub /\e\[\d+m/, ""
end

elimina los caracteres de formato.

Nota

puts "\e[31m" # set format (red foreground)
puts "\e[0m"   # clear format
puts "green-#{"red".red}-green".green # will be green-red-normal, because of \e[0
Ivan Black avatar May 03 '2013 16:05 Ivan Black