¿Cómo puedo usar Ruby para colorear la salida de texto a una terminal?
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?
¡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
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
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:
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