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 に飛ぶ.

日曜日から始まる28日のカレンダー
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
日曜日から始まる29日のカレンダー
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29
日曜日から始まる30日のカレンダー
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
日曜日から始まる31日のカレンダー
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
月曜日から始まる28日のカレンダー
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28
月曜日から始まる29日のカレンダー
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29
月曜日から始まる30日のカレンダー
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
月曜日から始まる31日のカレンダー
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
火曜日から始まる28日のカレンダー
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28
火曜日から始まる29日のカレンダー
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29
火曜日から始まる30日のカレンダー
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
火曜日から始まる31日のカレンダー
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
水曜日から始まる28日のカレンダー
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28
水曜日から始まる29日のカレンダー
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29
水曜日から始まる30日のカレンダー
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
水曜日から始まる31日のカレンダー
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
木曜日から始まる28日のカレンダー
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28
木曜日から始まる29日のカレンダー
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29
木曜日から始まる30日のカレンダー
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30
木曜日から始まる31日のカレンダー
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
金曜日から始まる28日のカレンダー
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28
金曜日から始まる29日のカレンダー
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29
金曜日から始まる30日のカレンダー
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
金曜日から始まる31日のカレンダー
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
土曜日から始まる28日のカレンダー
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
土曜日から始まる29日のカレンダー
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
土曜日から始まる30日のカレンダー
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
土曜日から始まる31日のカレンダー
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31


このテンプレートはもちろん手書きではない.以下のようなスクリプトでジェネった.

#!/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個のファイルが作成され,その中にテンプレートが出力される.