Kolorowane wyjście Ruby [zamknięte]
Czy istnieje gem do wykonywania kolorowania tła i tekstu pierwszoplanowego dla wyjścia w terminalu?
Pamiętam, że podczas programowania Pascala wszyscy bawiliśmy się textcolor(...)
procedurami, aby nasze małe programy edukacyjne wyglądały ładniej i prezentacyjnie.
Czy jest coś podobnego w Ruby?
11 answers
Colorize to mój ulubiony klejnot! :-)
Zobacz:
Https://github.com/fazibear/colorize
Instalacja:
gem install colorize
Użycie:
require 'colorize'
puts "I am now red".red
puts "I am now blue".blue
puts "Testing".yellow
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-30 17:12:04
Łącząc powyższe odpowiedzi, możesz zaimplementować coś, co działa jak gem colorize bez potrzeby kolejnej zależności.
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-08 00:51:27
Jako metody klasy String (tylko 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
I użycie:
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
Na mojej konsoli:
Dodatkowy:
def no_colors
self.gsub /\e\[\d+m/, ""
end
Usuwa znaki formatujące
Uwaga
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-23 02:56:30
Możesz użyć sekwencji escape ANSI, aby to zrobić na konsoli. Wiem, że to działa na Linuksie i OSX, nie jestem pewien, czy konsola Windows (cmd) obsługuje ANSI.
Zrobiłem to w Javie, ale pomysły są takie same.
//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";}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-28 20:35:18
Napisałem małą metodę testowania podstawowych trybów kolorów, opartą na odpowiedziach Erika Skoglunda i innych.
#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
Przykładowe wyjście:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-16 18:46:16
Podczas gdy inne odpowiedzi będą dobre dla większości ludzi, należy wspomnieć o "poprawnym" uniksowym sposobie działania. Ponieważ wszystkie typy terminali tekstowych nie obsługują tych sekwencji, możesz odpytywać bazę danych terminfo , abstrakcję nad możliwościami różnych terminali tekstowych. Może się to wydawać interesujące głównie z punktu widzenia historii-używane dziś terminale programowe zazwyczaj obsługują sekwencje ANSI – ale ma to (przynajmniej) jeden praktyczny efekt: czasami jest przydatny aby móc ustawić zmienną środowiskową TERM
na dumb
, aby uniknąć takich stylów, na przykład podczas zapisywania danych wyjściowych do pliku tekstowego. Ponadto, dobrze jest robić rzeczy dobrze . :-)
Możesz użyć klejnotu ruby-terminfo. Do instalacji potrzebny jest kompilator C; udało mi się go zainstalować pod moim systemem Ubuntu 14.10 z:
$ sudo apt-get install libncurses5-dev
$ gem install ruby-terminfo --user-install
Następnie możesz odpytywać bazę danych w następujący sposób (zobacz stronę man terminfo , aby uzyskać listę kodów dostępne):
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."
Oto małe zajęcia z pakowania, które zebrałem, aby uczynić rzeczy prostszymi w użyciu.
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
Użycie:
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}"
(edit) na koniec, jeśli wolisz nie wymagać klejnotu, możesz polegać na programie tput
, , jak opisano tutaj – przykład Ruby:
puts "Hi! " + `tput setaf 1` + "This is red!" + `tput sgr0`
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-13 12:36:31
Znalazłem kilka:
Http://github.com/ssoroka/ansi/tree/master
Przykłady:
puts ANSI.color(:red) { "hello there" }
puts ANSI.color(:green) + "Everything is green now" + ANSI.no_color
Http://flori.github.com/term-ansicolor/
Przykłady:
print red, bold, "red bold", reset, "\n"
print red(bold("red bold")), "\n"
print red { bold { "red bold" } }, "\n"
Http://github.com/sickill/rainbow
Przykład:
puts "this is red".foreground(:red) + " and " + "this on yellow bg".background(:yellow) + " and " + "even bright underlined!".underline.bright
Jeśli używasz systemu Windows, może być konieczne wykonanie "gem install win32console", aby włączyć obsługę kolorów.
Również Artykuł kolorowanie konsoli Ruby-script output jest przydatny, jeśli potrzebujesz aby stworzyć swój własny klejnot. Wyjaśnia, jak dodać kolorowanie ANSI do ciągów. Możesz użyć tej wiedzy, aby owinąć ją w jakąś klasę, która rozszerza string lub coś w tym stylu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-28 20:44:01
Oto, co zrobiłem, aby to działało bez potrzeby żadnych klejnotów:
def red(mytext) ; "\e[31m#{mytext}\e[0m" ; end
puts red("hello world")
Wtedy tylko tekst w cudzysłowach jest kolorowany, a Ty wracasz do regularnie zaplanowanego programu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-02 10:56:36
Zrobiłem tę metodę, która może pomóc. To nic wielkiego, ale działa:
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
Oto jak go używać:
puts "#{colorize("Hello World")}"
puts "#{colorize("Hello World", "yellow")}"
puts "#{colorize("Hello World", "white","light red")}"
Możliwe ulepszenia mogą być:
-
colors
ibgColors
są definiowane za każdym razem, gdy metoda jest wywoływana i nie ulegają zmianie. - Dodaj inne opcje jak
bold
,underline
,dim
, itd.
Ta metoda nie działa dla p
, ponieważ p
wykonuje inspect
do swojego argumentu. Na przykład:
p "#{colorize("Hello World")}"
Pokaże "\e[0;38mhello World\e[0m "
Przetestowałem go z puts
, print
, i klejnot Loggera, i działa dobrze.
Poprawiłem to i zrobiłem klasę tak colors
i bgColors
są stałymi klasami, a colorize
jest metodą klasową:
EDIT: lepszy styl kodu, definiowanie stałych zamiast zmiennych klasowych, używanie symboli zamiast ciągów znaków, dodawanie więcej opcji takich jak, pogrubienie, kursywa itp.
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
Możesz go użyć wykonując:
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-06 13:38:25
To może Ci pomóc: colorized ruby output
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-28 20:29:50
Powyższe odpowiedzi okazały się przydatne, jednak nie pasowały do rachunku, jeśli chciałem pokolorować coś takiego jak wyjście dziennika Bez przy użyciu jakichkolwiek bibliotek stron trzecich. Poniższy problem rozwiązał dla mnie:
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" }
Mam nadzieję, że to pomoże!Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-13 10:31:11