2005年2月10日

休日は赤なんだってば。わかってくださいよ。

nlog(n) - 休日表示カレンダープラグインというプラグインを利用させていただいていたがサーバーをお引越ししたらDate::Japanese::Holidaysがインストールされてなくて困った、困った。しかし、無いなら作る、修正する!ですよね。というのが前回までのおさらいです。今回はどのように修正したかです。(っていうかくだらん説明に興味ないという場合はここに下記修正を入れたファイルを置いておきますのでどうぞ!)

まず、休日表示カレンダープラグインをゲットします。Date::Japanese::Holidayがインストールされてる、インストールできるならばnLog(n)さんのページどおりで以上おしまい!完全なる車輪の再発明ですのでモジュールをインストールできない人以外はnlog(n)さんのプラグインご利用ください。

で、本題のDate::Japanese::Holidayがインストールされていない、インストールできない場合ですが、私のHackではTime::Localモジュールを利用しますのでTime::Localモジュールを準備してください。(これも無いとなると…)で、実際の修正ですが、jcalendarcolor.plの27行目と28行目をコメントアウト。これでDate::Japanese::Holidayモジュールを使用しなくします。そしてTime::Localを利用するようにします。

#use Date::Japanese::Holiday qw(is_japanese_holiday);
#use Date::Calc qw(Day_of_Week);
use Time::Local;

次に、本来ならばこのモジュールにて提供されていた関数2つと同じ機能を作る必要があります。

まずは簡単な土曜日の判定のほうですが。
オリジナルはDay_of_Weekと言う関数ですが、この関数は引数として日付を渡すと戻り値としてその日は何曜日ですと返す関数なわけです。
ということで、Day_of_Weekという同じ事をやる関数を作成します。実際のコードは

sub day_of_week{
my($year,$month,$day)=@_;
my ($t) = timelocal(0, 0, 0, $day, $month - 1, $year);
return (localtime($t))[6];
}

で、jcalendarcolor.plの64行目でDay_of_Weekを呼んでる所をこの新しいday_of_weekを呼ぶように修正します。

さて、次が本命の休日判定です。
Date::Japanese::Holidayで提供されているis_japanesse_holidayと言う関数は引数として日付を渡すと戻り値としてその日は祝日が否かを返す関数です。
ということでis_holidayという同じ動きをする関数を作成します。実際のコードはAddinBoxさんのサイトの祝日判定ロジックPerl版というコードを参考に微調整しました。微調整の内容は、

1. 引数を年、月、日に変更
2. 戻り値を日曜日、祝日、振り替え休日、休日だったら1、平日は0に変更
3. 曜日の算出に作成したday_of_week利用に変更

の3点です。

で、jcalendacolor.plの62行目でis_japanese_holidayを呼んでる所をこの新しいis_holidayを呼ぶように修正します。

そして作成したday_of_weekとis_holidayの二つの関数をjcalendarcolor.plに追加。
あとはpluginディレクトリに修正版jcalendarcolor.plコピーしておしまいです。ここに上記修正をいれたファイルを置いておきます。(ソースかなり汚いですけどとりあえずは御容赦ください…)

使い方はnlog(n)さんのページを参照ください。
nlog(n)さんはこのプラグインのVersion2公開してるみたいですけど、私はまだそちらには移行してません。多分似たような修正が必要かと思います。

最後にとても有益なコードを公開してくださっているnlog(n)さんとAddinBoxさん、どうもありがとうございます!!!