Name: Calender FullName: Simple Calender Generator URI: IW:SuikaWiki:WikiForm { Name: wikiform_input/calender FullName: Calender of specified year and month Format: require Time::Local; my @dayname = qw/sun mon tue wed thr fri sat/; my ($year, $month) = ($p->{year} || (gmtime)[5]+1900, $p->{month} || (gmtime)[4]+1); if (!$p->{year}) { my ($y, $m) = iso8601date_to_parts (long_name_to_date ($p->{page} || $o->{page})); if ($y) { $year = $y; $month = $m if $m; } } my $dow = 0; eval q($dow = (gmtime (Time::Local::timegm_nocheck (0,0,0,1, $month-1, $year)))[6]); my $lom = 0; eval q($lom = (gmtime (Time::Local::timegm_nocheck (0,0,0,0, $month==12?0:$month, $year)))[3]); $r .= q(); $r .= qq() unless $p->{nocaption}; $r .= q(); unless ($p->{noheader}) { $r .= q(); my @wname = split /\s+/, ($p->{dayname} || q/日 月 火 水 木 金 土/); for my $dow (0..6) { $r .= qq(); } $r .= ""; } $r .= ""; $r .= ''. ('' x $dow) unless $dow == 0; for my $day (1..$lom) { $r .= "" if $dow == 0; $r .= qq(); $dow++; ($dow = 0, $r .= "\n") if $dow == 7; } $r .= <
@{[$o->escape($p->{caption} || "$year年$month月")]}
@{[$o->escape ($wname[$dow])]}
); my $page = short_name_to_full_name ($p->{page}||$o->{page}=>sprintf ('%04d-%02d-%02d', $year, $month, $day)); #if ($o->_database_exist ($page)) { $r .= $o->_html_wikilink ($page, label => $day); #} else { # $r .= $day; #} $r .= qq(
EOH } { Name: wikiview/link-calender-date FullName: Link element whose destination anchor is the prev/next/.. year/month/day Format: my $page = long_name_to_date ($p->{page} || $o->{page}); if ($page =~ /^([0-9]{4,})(?:-([0-9]{1,2})(?:-([0-9]{1,2}))?)?$/) { my ($year, $month, $day) = ($1, $2, $3); my ($Year, $Month, $Day) = (0, 0, 0); my ($yeaR, $montH, $daY) = (0, 0, 0); my %page; $page{_base} = $p->{page} || $o->{page}; if ($day) { ## 2003-04-01 require Time::Local; (undef, undef, undef, $Day, $Month, $Year) = gmtime (Time::Local::timegm_nocheck (0,0,0,$day, $month - 1, $year) - 24 * 3600); $Month++; $Year += 1900; $page{prev} = sprintf '%04d-%02d-%02d', $Year, $Month, $Day; (undef, undef, undef, $daY, $montH, $yeaR) = gmtime (Time::Local::timegm_nocheck (0,0,0,$day, $month - 1, $year) + 25 * 3600); $montH++; $yeaR += 1900; $page{next} = sprintf '%04d-%02d-%02d', $yeaR, $montH, $daY; $page{up} = sprintf '%04d-%02d', $year, $month; } elsif ($month) { ## 2003-04 ($Year, $Month) = ($year, $month - 1); (($Month = 12) && $Year--) if $Month == 0; $page{prev} = sprintf '%04d-%02d', $Year, $Month; ($yeaR, $montH) = ($year, $month + 1); (($montH = 1) && $yeaR++) if $montH == 13; $page{next} = sprintf '%04d-%02d', $yeaR, $montH; $page{up} = sprintf '%04d', $year; } else { ## 2003 $Year = $year - 1; $page{prev} = sprintf '%04d', $Year; $yeaR = $year + 1; $page{next} = sprintf '%04d', $yeaR; } for my $rel ('prev', 'next', 'up') { next unless length $page{$rel}; $p->{rel} = $rel; $page{$rel} = short_name_to_full_name ($page{_base} => $page{$rel}); $p->{href} = $o->_uri_wiki_page ($page{$rel}, %$o); $p->{title} = $page{$rel}; ## TO DO: support custom title $r .= qq({$attr}; } for my $attr (qw/title/) { $r .= qq( $attr="@{[$o->formatter('view')->replace($p->{$attr},$o)]}") if $p->{$attr}; } $r .= '/' if $o->{media}->{type} =~ /xml/; $r .= '>'; } } } { Name: wikiview/if-calender FullName: Check whether the WikiPage is part of calender or not Format: my $tf = 0; my ($y, $m, $d) = iso8601date_to_parts (long_name_to_date ($p->{page} || $o->{page})); if ($y && !(($p->{month} && !$m) || ($p->{day} && !$d))) { $tf = 1; } $r = $o->formatter ('view')->replace (($tf ? $p->{true} : $p->{false}), $o); } { Name: wikiform_input/calender-months FullName: Months' list Format: my ($year) = $p->{year} || (gmtime)[5]+1900; if (!$p->{year}) { my ($y, $m) = iso8601date_to_parts (long_name_to_date ($p->{page} || $o->{page})); $year = $y if $y; } $r = '
    '; for my $month (1..12) { $r .= '
  1. '; my $page = short_name_to_full_name (($p->{page} || $o->{page}) => sprintf ('%04d-%02d', $year, $month)); #if ($o->_database_exist ($page)) { $r .= $o->_html_wikilink ($page, label => $month); #} else { # $r .= $month; #} $r .= qq(
  2. ); } $r .= '
'; } MODULE: sub iso8601date_to_parts ($) { my $date = shift; if ($date =~ /^([0-9]{4,})(?:-([0-9]{1,2})(?:-([0-9]{1,2}))?)?$/) { return ($1, $2, $3); } (0, 0, 0); } sub long_name_to_date ($) { if ($SuikaWiki::Name::Space::VERSION) { SuikaWiki::Name::Space::get_short_name (shift); } else { shift; } } sub short_name_to_full_name ($$) { if ($SuikaWiki::Name::Space::VERSION) { SuikaWiki::Name::Space::resolve_relative_name ($_[0] => '..//'.$_[1]); } else { $_[1]; } } SuikaWiki::View->template ('links')->add_line (q(%link-calender-date(class=>wiki);)); POD:LICENSE: Copyright 2002 Wakaba %%GNUGPL2%%