M.C.P.C.

―むり・くり―プラスコミュニケーション(更新終了)


| トップページ |

2007年7月28日 20:23

カレンダー表示CGIサンプル

このエントリーをはてなブックマークに追加 mixiチェック

友達の女の子が、日記風読み物を書いていて、これにカレンダーをつけたいんだよねーていうミッション。

最初は、

my $cal = `cal`;

とかしてお茶濁そうと思ったけれども、これ cal コマンド入っていないとだめで、Windows だとダメっぽげです。

つうわけで、

Calendar::Simple - シンプルなカレンダーを作る為のPerl拡張 [perldoc.jp]

をみて作ってみました。

#!/usr/bin/perl
use strict;
use warnings;
use CGI;
 
my $q = CGI->new();
 
my $year  = $q->param('year' ) || (localtime)[5] + 1900;
my $month = $q->param('month') || (localtime)[4] + 1;
 
print $q->header( -type    => 'text/html',
                  -charset => 'UTF-8',
      );
print $q->start_html(
        -lang     => 'ja_JP',
        -encoding => 'UTF-8',
      ),
      $q->start_pre,
      _calendar(
        { year     => $year,
          month    => $month,
          base_url => 'http://www.example.com/cgi-bin/foo.cgi',  
        }
      ),
      $q->end_pre,
      $q->end_html,
;
exit 1;
 
sub _calendar {
  require Calendar::Simple;
  my $param  = shift;
  my $year   = $param->{year    };
  my $month  = $param->{month   };
  my $url    = $param->{base_url};
  my $cal    = Calendar::Simple::calendar( $month, $year );
  my $tmp_cal;
  foreach (@$cal) {
    push @$tmp_cal,
         join( ' ',
               map {
                 $_ 
                 ? sprintf "<a href=\"%s?date=%4d%02d%02d\">%2d</a>",
                     $url, $year, $month, $_, $_
                 : '  ' 
               }
               @$_
         );
  }
  my $str_cal;
  $str_cal .= "Su Mo Tu We Th Fr Sa\n";
  $str_cal .= join("\n", @$tmp_cal);
  $str_cal =~ s{\s+$}{}xmgo;
  return $str_cal;
}

pre 要素で表示しているのは i-mode などで見ることを一応想定してみました。

Imodecarendar
▲僕の端末より画面が広いよ!

さて、作ってから判明したんですけれども、どうやら、彼女の作ってる日記風読み物、6月19日が2つあるんです。

どうしようw

投稿 大野 義貴 [Perl] | |

トラックバック(0)

トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/2157

コメント(1)

そういうのって、たまに特異日があったりするんですぅ。
有名なところでは、数年前のQuark社が出したおまけのカレンダー。
市販ものでも、次の月になってわかる前月の日数が一日多かったはずだ~とか。

ま、対応してあげてください(ww)

コメントする