Calendar
出典: Fukudat.com
MediaWiki で簡単にダイナミックにカレンダーをジェネる方法はないものかと考えていたが, 下のようなテンプレートを作れば良いことがわかった. テンプレートとして存在しうるカレンダーすべて(何曜日から始まるか x 何日間あるか)を列挙しておき,つきの名前やリンク先をパラメータで渡してカスタマイズできるようにしている. 曜日は7個,1ヶ月の日数は4個(28日,29日,30日,31日)なので全部で28種類である.
以下のパラメータがある(カッコ内はデフォルト値).
- header: カレンダーのヘッダー (カレンダー)
- footer: カレンダーのフッター ()
- color1: ヘッダー部分の背景色 (#ccccff)
- color2: 曜日見出し部分の背景色 (#eeeeff)
- color3: フッター部分の背景色 (#eeeeff)
- color4: 日曜日の背景色 (#ffeeee)
- color5: 土曜日の背景色 (#eeeeff)
- width: 幅 (150px)
- float: 配置 (right)
- prefix: 日付につけるリンクのプレフィックス (/)
- suffix: 日付につけるリンクのプレフィックス ()
- s[1-31]: 各日付につけるスタイル (inherit)
- c[1-31]: 各日付の色 (inherit)
prefix="abc", suffix="xyz" と指定すると,15日は [[abc15xyz]] にリンクすることになる.デフォルトでは prefix="/", suffix="" なので [[/15]],つまり,サブページ /15 に飛ぶ.
このテンプレートはもちろん手書きではない.以下のようなスクリプトでジェネった.
#!/usr/bin/perl
@edays = ('Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa');
@jdays = ('日', '月', '火', '水', '木', '金', '土');
@numdays = ( 28, 29, 30, 31 );
print "{| class=\"toccolours\"\n";
for ($day = 0; $day < 7; $day++) {
for $numday (@numdays) {
&generate($day, $numday);
}
print "|- \n";
}
print "|}\n";
sub generate {
my ($startday, $numday) = @_;
my $eday = $edays[$startday];
my $jday = $jdays[$startday];
print "| {{Calendar/$jday/$numday|header=$jday曜日から始まる$numday日のカレンダー}}\n";
open(OUT, ">$eday$numday.wiki");
print OUT '{| class="toccolours" style="float:{{{float|right}}}; width:{{{width|150px}}}; margin-left:1em; text-align:center;"
|- style="background:{{{color1|#ccccff}}};"
|colspan="7"|{{{header|カレンダー}}}
|-
|- style="background:{{{color2|#eeeeee}}};"
|style="background:{{{color4|#ffeeee}}};" width="14%"|<span style="color:red;">日</span>
|width="14%"|月
|width="14%"|火
|width="14%"|水
|width="14%"|木
|width="14%"|金
|style="background:{{{color5|#eeeeff}}};" width="14%"|<span style="color:deepskyblue;">土</span>
|-
'; # header
print OUT "|colspan=\"$startday\"|\n";
for ($dom = 1; $dom <= $numday; $dom++) {
$dow = ($startday + $dom - 1) % 7;
print OUT "|-\n" if ($dow == 0);
$color = "inherit";
$bg = "";
$bg = "|style=\"background:{{{color4|#ffeeee}}}\"" if ($dow == 0);
$bg = "|style=\"background:{{{color5|#eeeeff}}}\"" if ($dow == 6);
print OUT "$bg|[[{{{prefix|/}}}${dom}{{{suffix|}}}|<span style={{{s$dom|\"color:{{{c$dom|$color}}};\"}}}>$dom</span>]]\n";
}
$rest = 7 - ($startday + $numday) % 7;
print OUT "|colspan=\"$rest\"|\n" if ($rest != 7);
print OUT '|- style="background:{{{color3|#eeeeff}}};"
|colspan="7"|{{{footer|}}}
|}
';
print OUT ''; # footer
close(OUT);
}
このスクリプトを実行するとカレントディレクトリに Su28.wiki, Su29.wiki, ..., Sa31.wiki の28個のファイルが作成され,その中にテンプレートが出力される.
