ruby - Coloreado Rubí de salida
colors console-application (11)
Colorear es mi gema favorita! :-)
Echale 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
¿Existe una gema para realizar la colorización del texto de fondo y de primer plano para la salida en el terminal?
Recuerdo que cuando programábamos a Pascal, todos solíamos jugar con los textcolor(...)
para hacer que nuestros pequeños programas educativos se vieran más bonitos y representativos.
¿Hay algo similar en Ruby?
Combinando las respuestas anteriores, puede implementar algo que funcione como el color de la 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:
adicional:
def no_colors
self.gsub //e/[/d+m/, ""
end
elimina 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
Encontré que las respuestas anteriores son útiles, sin embargo, no encajaban a la perfección si quería colorear algo así como la salida del registro sin usar bibliotecas de terceros. Lo siguiente resolvió el problema para mí:
red = 31
green = 32
blue = 34
def color (color=blue)
printf "/033[#{color}m";
yield
printf "/033[0m"
end
color { puts "this is blue" }
color(red) { logger.info "and this is red" }
¡Espero que ayude!
Escribí un pequeño método para probar los modos de color básicos, según las respuestas de Erik Skoglund y otros.
#outputs color table to console, regular and bold modes
def colortable
names = %w(black red green yellow blue pink cyan white default)
fgcodes = (30..39).to_a - [38]
s = ''''
reg = "/e[%d;%dm%s/e[0m"
bold = "/e[1;%d;%dm%s/e[0m"
puts '' color table with these background codes:''
puts '' 40 41 42 43 44 45 46 47 49''
names.zip(fgcodes).each {|name,fg|
s = "#{fg}"
puts "%7s "%name + "#{reg} #{bold} "*9 % [fg,40,s,fg,40,s, fg,41,s,fg,41,s, fg,42,s,fg,42,s, fg,43,s,fg,43,s,
fg,44,s,fg,44,s, fg,45,s,fg,45,s, fg,46,s,fg,46,s, fg,47,s,fg,47,s, fg,49,s,fg,49,s ]
}
end
salida de ejemplo:
Esto es lo que hice para que funcione sin necesidad de gemas:
def red(mytext) ; "/e[31m#{mytext}/e[0m" ; end
puts red("hello world")
Entonces, solo el color de las comillas allí aparece en color, y volverá a su programa programado regularmente.
Esto puede ayudarte: Salida rubí coloreada.
He encontrado algunos:
http://github.com/ssoroka/ansi/tree/master
Ejemplos:
puts ANSI.color(:red) { "hello there" }
puts ANSI.color(:green) + "Everything is green now" + ANSI.no_color
http://flori.github.com/term-ansicolor/
Ejemplos:
print red, bold, "red bold", reset, "/n"
print red(bold("red bold")), "/n"
print red { bold { "red bold" } }, "/n"
http://github.com/sickill/rainbow
Ejemplo:
puts "this is red".foreground(:red) + " and " + "this on yellow bg".background(:yellow) + " and " + "even bright underlined!".underline.bright
Si está en Windows, es posible que deba hacer una "gema de instalación win32console" para habilitar la compatibilidad con los colores.
También el artículo Coloring console Ruby-script output es útil si necesitas crear tu propia gema. Explica cómo agregar coloración ANSI a las cuerdas. Puedes usar este conocimiento para envolverlo en alguna clase que extienda la cadena o algo.
Hice este método que podría ayudar. No es un gran problema pero funciona:
def colorize(text, color = "default", bgColor = "default")
colors = {"default" => "38","black" => "30","red" => "31","green" => "32","brown" => "33", "blue" => "34", "purple" => "35",
"cyan" => "36", "gray" => "37", "dark gray" => "1;30", "light red" => "1;31", "light green" => "1;32", "yellow" => "1;33",
"light blue" => "1;34", "light purple" => "1;35", "light cyan" => "1;36", "white" => "1;37"}
bgColors = {"default" => "0", "black" => "40", "red" => "41", "green" => "42", "brown" => "43", "blue" => "44",
"purple" => "45", "cyan" => "46", "gray" => "47", "dark gray" => "100", "light red" => "101", "light green" => "102",
"yellow" => "103", "light blue" => "104", "light purple" => "105", "light cyan" => "106", "white" => "107"}
color_code = colors[color]
bgColor_code = bgColors[bgColor]
return "/033[#{bgColor_code};#{color_code}m#{text}/033[0m"
end
Aquí está cómo usarlo:
puts "#{colorize("Hello World")}"
puts "#{colorize("Hello World", "yellow")}"
puts "#{colorize("Hello World", "white","light red")}"
Las posibles mejoras podrían ser:
-
colors
ybgColors
se definen cada vez que se llama al método y no cambian. - Agregue otras opciones como
bold
,underline
,dim
, etc.
Este método no funciona para p
, como p
hace una inspect
a su argumento. Por ejemplo:
p "#{colorize("Hello World")}"
mostrará "/ e [0; 38mHello World / e [0m"
Lo probé con puts
, print
, y la gema Logger, y funciona bien.
bgColors
esto e hice una clase para que los colors
y bgColors
sean constantes de clase y colorize
sea un método de clase:
EDITAR: Mejor estilo de código, constantes definidas en lugar de variables de clase, usar símbolos en lugar de cadenas, agregar más opciones como, negrita, cursiva, etc.
class Colorizator
COLOURS = { default: ''38'', black: ''30'', red: ''31'', green: ''32'', brown: ''33'', blue: ''34'', purple: ''35'',
cyan: ''36'', gray: ''37'', dark_gray: ''1;30'', light_red: ''1;31'', light_green: ''1;32'', yellow: ''1;33'',
light_blue: ''1;34'', light_purple: ''1;35'', light_cyan: ''1;36'', white: ''1;37'' }.freeze
BG_COLOURS = { default: ''0'', black: ''40'', red: ''41'', green: ''42'', brown: ''43'', blue: ''44'',
purple: ''45'', cyan: ''46'', gray: ''47'', dark_gray: ''100'', light_red: ''101'', light_green: ''102'',
yellow: ''103'', light_blue: ''104'', light_purple: ''105'', light_cyan: ''106'', white: ''107'' }.freeze
FONT_OPTIONS = { bold: ''1'', dim: ''2'', italic: ''3'', underline: ''4'', reverse: ''7'', hidden: ''8'' }.freeze
def self.colorize(text, colour = :default, bg_colour = :default, **options)
colour_code = COLOURS[colour]
bg_colour_code = BG_COLOURS[bg_colour]
font_options = options.select { |k, v| v && FONT_OPTIONS.key?(k) }.keys
font_options = font_options.map { |e| FONT_OPTIONS[e] }.join('';'').squeeze
return "/e[#{bg_colour_code};#{font_options};#{colour_code}m#{text}/e[0m".squeeze('';'')
end
end
Puedes usarlo haciendo:
Colorizator.colorize "Hello World", :gray, :white
Colorizator.colorize "Hello World", :light_blue, bold: true
Colorizator.colorize "Hello World", :light_blue, :white, bold: true, underline: true
Mientras que las otras respuestas harán bien el trabajo para la mayoría de las personas, debe mencionarse la forma "correcta" de Unix de hacer esto. Dado que todos los tipos de terminales de texto no admiten estas secuencias, puede consultar la base de datos de terminfo , una abstracción sobre las capacidades de varios terminales de texto. Esto puede parecer de interés histórico, ya que los terminales de software que se usan en la actualidad generalmente son compatibles con las secuencias ANSI, pero tiene (al menos) un efecto práctico: a veces es útil poder configurar la variable de entorno TERM
para que evite todas esas situaciones. estilo, por ejemplo, al guardar la salida en un archivo de texto. Además, se siente bien hacer las cosas bien . :-)
Puedes usar la gema ruby-terminfo . Necesita algo de compilación de C para instalar; Pude instalarlo bajo mi sistema Ubuntu 14.10 con:
$ sudo apt-get install libncurses5-dev
$ gem install ruby-terminfo --user-install
Luego, puede consultar la base de datos de esta manera (consulte la página del manual de terminfo para obtener una lista de los códigos disponibles):
require ''terminfo''
TermInfo.control("bold")
puts "Bold text"
TermInfo.control("sgr0")
puts "Back to normal."
puts "And now some " + TermInfo.control_string("setaf", 1) +
"red" + TermInfo.control_string("sgr0") + " text."
Aquí hay una pequeña clase de envoltura que armé para hacer las cosas un poco más fáciles de usar
require ''terminfo''
class Style
def self.style()
@@singleton ||= Style.new
end
colors = %w{black red green yellow blue magenta cyan white}
colors.each_with_index do |color, index|
define_method(color) { get("setaf", index) }
define_method("bg_" + color) { get("setab", index) }
end
def bold() get("bold") end
def under() get("smul") end
def dim() get("dim") end
def clear() get("sgr0") end
def get(*args)
begin
TermInfo.control_string(*args)
rescue TermInfo::TermInfoError
""
end
end
end
Uso:
c = Style.style
C = c.clear
puts "#{c.red}Warning:#{C} this is #{c.bold}way#{C} #{c.bg_red}too much #{c.cyan + c.under}styling#{C}!"
puts "#{c.dim}(Don''t you think?)#{C}"
(editar) Finalmente, si prefieres no requerir una gema, puedes confiar en el programa tput
, como se describe aquí - Ejemplo de Ruby:
puts "Hi! " + `tput setaf 1` + "This is red!" + `tput sgr0`
Puede usar secuencias de escape ANSI para hacer esto en la consola. Sé que esto funciona en Linux y OSX, no estoy seguro de si la consola de Windows (cmd) es compatible con ANSI.
Lo hice en Java, pero las ideas son las mismas.
//foreground color
public static final String BLACK_TEXT() { return "/033[30m";}
public static final String RED_TEXT() { return "/033[31m";}
public static final String GREEN_TEXT() { return "/033[32m";}
public static final String BROWN_TEXT() { return "/033[33m";}
public static final String BLUE_TEXT() { return "/033[34m";}
public static final String MAGENTA_TEXT() { return "/033[35m";}
public static final String CYAN_TEXT() { return "/033[36m";}
public static final String GRAY_TEXT() { return "/033[37m";}
//background color
public static final String BLACK_BACK() { return "/033[40m";}
public static final String RED_BACK() { return "/033[41m";}
public static final String GREEN_BACK() { return "/033[42m";}
public static final String BROWN_BACK() { return "/033[43m";}
public static final String BLUE_BACK() { return "/033[44m";}
public static final String MAGENTA_BACK() { return "/033[45m";}
public static final String CYAN_BACK() { return "/033[46m";}
public static final String WHITE_BACK() { return "/033[47m";}
//ANSI control chars
public static final String RESET_COLORS() { return "/033[0m";}
public static final String BOLD_ON() { return "/033[1m";}
public static final String BLINK_ON() { return "/033[5m";}
public static final String REVERSE_ON() { return "/033[7m";}
public static final String BOLD_OFF() { return "/033[22m";}
public static final String BLINK_OFF() { return "/033[25m";}
public static final String REVERSE_OFF() { return "/033[27m";}