Rubyでcalをカラフルに

ブログを下記に移転しました。デザイン変更により移転先では記事が一層読みやすくなっていますので、よろしければ移動をお願い致します。

Rubyでcalをカラフルに : melborne.github.com

                                                                                                            • -

世界はすっかりGUIに支配されました
コンピュータといったらWindowシステムのことです
人々を魅了したのはその操作性だけではありません
人々はそのカラフルな世界に魅了されたのです


確かにCUIの世界には色はありません
辛うじて環境変数LSCOLORSをセットして
色の付いたファイル名を眺めるだけの
暗くて地味な
そしてそれを使う人を孤独にさせる世界です


しかしそんな世界にTermtterが登場しました
TermtterはANSIカラーを引き連れて
CUIの世界に一条の光を差しました
まるでGB末期に登場したポケモンの如くに!*1


それ以来 僕の中ちまたでは
ターミナルのカラー化が流行しています


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


どこかで誰かが叫ぶ声が聞こえます
ターミナルにもっと色を!
ターミナルにもっと色を!



そんなわけで..


calを色付けして出力するCalourを作りました
多分Reinventing the Wheelでしょうけれども..


Ruby1.9にのみ対応しています
色付けにはTermColorライブラリを使っています

使い方

添付ファイルをダウンロードして
そのなかの/bin/cal.rbを実行します

% ruby cal.rb


引数無しで当月のカレンダーを表示します
今日の日付には反転した色が付きます



月と年でその年月のものを
月のみで本年のその月を
年のみで年間カレンダーを表示します

% ruby cal.rb 3 2011
% ruby cal.rb 2050 9
% ruby cal.rb 5
% ruby cal.rb 1600



cal.rbの中身は以下のようになっています

#!/usr/bin/env ruby
#-*-encoding: utf-8-*-
require_relative "../lib/calour"

puts Calour.new.cal *ARGV.map(&:to_i)


Calourクラスのオブジェクトを生成して
唯一のパブリックメソッドcalを呼ぶことで
色付きカレンダーの文字列を出力します

色の指定

オブジェクトの生成時に引数でカラーを指定できます

Calour.new( title: [:magenta, :yellow],
            today: :cyan,
            saturday: :blue,
            sunday: :red )



titleの2つの引数はそれぞれ
タイトルにおける月と年のカラーです
デフォルトのカラーは以下の通りです

  :title =>  [:green,:yellow]
  :today =>  :green
  :saturday =>  :cyan
  :sunday =>  :magenta
  :holiday =>  :red

祭日の色付け

holiday_optオプションを指定することで
祭日の色付けをすることができます

Calour.new(holiday_opt: {country: :ja_ja})



祭日データはGoogle Calendar Data APIから取得しています


verboseオプションをtrueにすれば祭日名を同時に表示します

Calour.new(holiday_opt {country: :ja_ja, verbose:true})



countryオプションは現在 ja_ja(日本語表記) ja(英語表記) us
au(australian) cn(china) fr(french) de(german) it(italian)
kr(south_korea) tw(taiwan) gb(uk) に対応しています
holiday_optはデフォルトではoffになっています

irbやTermtterで使う

irbやTermtterで使う場合は以下の記事の中で紹介した
bosonライブラリを介すると便利です


IRB それはRubyistの魔法のランプ - hp12c


~/.boson/commandsディレクトリに
以下のようなRubyモジュールを作ります

 vi .boson/commands/mysystem.rb
autoload :Calour, 'calour'

module MySystem

  # colorized calendar
  def cal(*args)
    puts Calour.new(holiday_opt: {country: :ja_ja, verbose:true}).cal(*args.map(&:to_i))
    puts
  end
end


そうすればirb上でcalコマンドで使えます


shell上ではbosonコマンドを前置します

% boson cal


Termtterで使う場合はこのaliasを作れば便利です
aliasの作成は~/.termtter/configで以下のようにします

config.plugins.alias.aliases = {
    :cal => '! boson cal'
}


制限

Ruby1.9のみの対応です
内部でシステムのcalコマンドを呼んでいます
それが無いシステムでは動作しません
OSX Tigerでしか動作確認していません
他のシステムで動作するかわかりません
無責任無保証です


使ってくれる人がいたらうれしいです


melborne's calour at master - GitHub

*1:よく知りませんけど