巷にはターミナル文字のカラー化を楽にするライブラリが溢れています。僕も以前にその幾つかを紹介した記事を書きました。

RubyでANSIカラーシーケンスを学ぼう!

にも拘わらずみんな、人の作ったライブラリが自分のテイストに合わないのか、自分用に、しかし他と似たようなものをまた作って、このリストを更に長くしていくという傾向があるようです。RubyGems.orgcolorを検索してみてください。僕が言っていることが冗談ではないということが分かるでしょう。

これだけ大量のカラー化ライブラリがあるとどれを選ぶべきか皆目わからず、人気どころを2、3試してみてそれらが合わなかったら、他を探すより自分で作ったほうが早い、となるのも頷けます。

え〜、それで、ちょっと言いづらいのですが…。

ご多分に漏れず…。


「Colcolor」というgemを作りましたよ!> まじか。

colcolor

melborne/colcolor

Colcolorの特徴

殆どのカラーライブラリは、Stringにカラー用のメソッドを挿して、そのメソッドで文字列の前後にエスケープシーケンスを挿入します。

"Charlie".red # => "\e[31mChalie\e[0m"

colcolorもその点は他のライブラリと同じで、Stringにcolcoというインスタンスメソッドを追加します。

"Charlie".colco(:red) # => "\e[31mChalie\e[0m"

colcolorが特徴的なのは、他のライブラリが行指向のものであるのに対して、列(カラム)指向である点です。つまり一行におけるホワイトスペースで区切られたカラムを認識し、それ毎に異なるカラーを適用できるのです。

"Charlie 21 programmer".colco(:red, :yellow, :cyan) # => "\e[31mCharlie\e[0m \e[33m21\e[0m \e[36mprogrammer\e[0m"

例えば、タブ区切りのリストにおいて、そのカラムごとに色を変えたい場合は、次のように簡単にできます。

require "colcolor"

list = <<-EOS
Charlie\t21\tprogrammer
Bill\t43\tdoctor
Liz\t18\tstudent
EOS

list.each_line do |line|
  puts line.colco(:green, :yellow, :blue)
end

出力です。

Alt title noshadow

背景色を作りたいときは、:bg_greenなどとします。

複数属性の適用

一つのカラムに対して、前景色と背景色など複数の属性を適用したい場合は、アンダースコア(_)で属性をつなぎます。

list.each_line do |line|
  puts line.colco(:green, :red_yellow, :blue_underline)
end

最初の色が前景色、2つ目以降が背景色になります。出力です。

Alt title noshadow

緑背景に赤文字を点滅させたいときは、:red_green_blinkなどとします。

カスタムカラムパターン

デフォルトではホワイトスペースをカラムの区切りと認識して各色を適用しますが、regexpオプションでこれをカスタマイズできます。

例えば、リストにスペースで区切られた名前と苗字が含まれていて、そこは連続した背景色にしたい場合、次のようにします。

list = <<-EOS
Charlie Brown\t21\tprogrammer
Bill Clinton\t43\tdoctor
Liz Taylor\t18\tstudent
EOS

# 不適切な例:

list.each_line do |line|
  puts line.colco(:bg_green, :bg_green, :yellow, :blue_underline)
end

puts

# regexpオプションを使った例:

re = /^.*?(?=\t)|\S+/ # 最初のタブの前、または空白以外にマッチ

list.each_line do |line|
  puts line.colco(:bg_green, :yellow, :blue_underline, regexp:re)
end

出力です。

Alt title noshadow

良かったら試してみてください。

以上、Yet Another Terminal Color for Rubyのお話でしたm(__)m


colcolor

melborne/colcolor


(追記:2014-7-28)

colcolorにcycleオプションを付けました。

カラム指向ターミナルカラーライブラリ「colcolor」にcycleオプションを付けました!



blog comments powered by Disqus
ruby_pack8

100円〜で好評発売中!
M'ELBORNE BOOKS