コマンドラインベースのRubyプログラムの色から出力するputsコマンドを作成するにはどうすればよいですか?さまざまな色を呼び出す方法への参照があれば幸いです。
これから始めましょう。
puts "The following Word is blue.. Im Blue!"
puts "The following Word is green.. Im Green!"
puts "The following Word is red.. Im Red!"
そして、私は私が望む異なる色で私が望む異なるテキストを得ます、あなたはアイデアを得ます。
Ubuntuを使用している場合、プログラムがdiff osで正しく出力されるようにアプローチを変更する必要がありますか?
私は この記事 を見つけて、コンソールに色付きのテキストを書き込む非常に簡単な方法を説明しました。記事は、トリックを実行しているように見えるこの小さな例について説明しています(私はそれを少し改善するために自由を取りました):
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') + ']'
ベストはいくつかの色を定義するようです。異なる背景色も必要な場合は、例を拡張できます(記事の下部を参照)。
Window XPを使用する場合、著者は win32console と呼ばれるgemの要件に言及しています。
私は Colored gem を使用するのが最も簡単でクリーンだと思います。
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
私はこのようなものを作成しました:
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
これで、Stringの別のメソッドを使用できます。
"Hello World".color(Colors::DARKGREEN)
すべての色を知るには、これを実行します。
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
エスケープシーケンスを使用する\033
の代わりに \e
それは100%posix互換であり、bsd-ish(例えばosx)システムでも動作します。後者はGNU拡張です。
少し異なる動作をし、より多くのカラーコードが含まれるため、別のソリューションを追加すると思います。
最初にいくつかの例...
メソッドチェーンの使用:
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]
style
メソッドを使用して複数の属性を適用する:
puts "How are you?".style(:red)
puts 'I am good!'.style(:blue, :underline)
puts 'Good to hear'.style([:bg_Magenta, :blink])
これは、後で適用するために何らかの方法でスタイル属性を格納するために使用できます。
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
この作成した要点 の例をさらにいくつか示し、コードを拡張して改良を加え、Stringへの変更がスコープされるようにしました。
これは基本的なコードです:
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
Colorize gemを使用してください!見てみな:
https://github.com/fazibear/colorize
インストール:
Sudo gem install colorize
使用法:
require 'colorize'
puts "I am now red.".red
puts "I am now blue.".green
puts "I am a super coder".yellow
すばやく簡単な解決策として、ASCIIカラーコードを文字列に埋め込むことができます(\ e [XXmは、今後使用する色をXXに設定し、\ e [0mは、色を正常):
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"
ASCIIコードは、テキストの下線、点滅、強調表示などもサポートします。
実際のASCIIコードを処理する ヘルパーライブラリ も利用できるようです。
Edit:異なるプラットフォームに関して:UNIXマシンではASCIIコードを使用しても問題はありませんが、ウィンドウ、AFAIKは、そのままではそれらをサポートしていません。幸いなことに win32console gem があり、これを修正しているようです。
次のスニペット(リンクされているVegerのページにあります)を使用して、Windowsでのみwin32consoleライブラリをロードできます。
begin
require 'Win32/Console/ANSI' if PLATFORM =~ /win32/
rescue LoadError
raise 'You must gem install win32console to use color on Windows'
end
Cli-colorize gemを確認してください: http://github.com/stjohncj/cli-colorize/blob/master/README.rdoc
私の提案: Paint gem。文字列拡張を強制せず、256色をサポートします(256色以外の端末のフォールバックモードを使用)。
使用法:
puts Paint["I'm blue!", :blue]
puts Paint["I'm dark blue if your terminal supports it!", "#000044"]