なにはなくとも12月のカレンダーを出す

2010-12-03

諸事情あって日曜日に喫茶店でこの記事を書いてる(あれ?)kanです。この喫茶店は談笑するおばちゃんが多いので下手すると一般的なマックより騒がしいです……。

昨日までで、URLにアクセスするとそれに応じたページを表示することが出来るようになりました。そこで、trackのURL(/2010/sample/ のような)にアクセスすると、12月の25日までの日を表示するようにしてみます。

perlでの日付処理は、Time::Piece、もしくはDateTimeが一般的です。今回はDateTimeの出番になりそうな複雑な処理は登場しないだろうと思うので、Time::Pieceを使います。

my $t = Time::Piece->strptime("$year/12/01", '%Y/%m/%d');

while ( $t->mday <= 25 ) {
    push @entries, Time::Piece->new($t);
    $t += ONE_DAY;
}

これで、@entriesには12/1〜12/25までのTime::Pieceのオブジェクトが入ります。Time::Piece->new($t)してるのは、値の同じな別のオブジェクトを作るためですね。そのまま$tをpushしてると全部が12/26の日付のオブジェクトになってしまいます。

日付の一覧では、「記事が存在している」「記事の日付が過去(あるいは当日)のもの」のみにリンクを張るよにします(アドベントカレンダーなので!!)。これを満たすコードは以下のような感じになります。

my $exists = (-e file($root, $t->ymd . '.txt')) &&
             ($now->year > $year || $t->year <= $now->yday) ? 1 : 0;

$existsが1の時のみ、リンクを張れば良いことになります。$nowには現在時刻のTime::Pieceオブジェクトが入ると思ってください。

一覧が出来たら、各記事を表示する処理を作ります。日付が分かればファイルの位置も分かるので、ファイルを読み出してみます。Path::Classを使うとファイルの操作周りの処理が簡単なので利用します。

my $file = file($root, $t->ymd . '.txt');
if (-e $file) {
    my $text = $file->slurp(iomode => '<:utf8');
    my ($title, $body) = split("\n\n", $text, 2);
}

記事のファイルの形式は↑の通り「タイトルの後、空行を1行空けて本文」とすることにしました。
本文をそのまま表示してしまうのはダサいですが、とりあえず今日はここまで。