メインインデックスの月別アーカイブへのリンク表示を「もっと」 nDialy 風にする。
■ ■ ■
ブログを続けていると,メインインデックス(トップページ)に表示している月別アーカイブへのリンクが長くなってくる。先日のカスタマイズでは,リンクを nDialy 風にした(nlog(n): 月別アーカイブへのリンクを nDialy 風に)。投稿のある月だけを表示する場合は,その方法でOK。ここでは,投稿があってもなくても月名を表示し,投稿がある月へはリンクを張るようにする。nDiary では,日記もどき さん風の表示になる。
環境は Movable Type 2.661+日本語化パッチで,使用プラグインは ArchiveYear plugin,Archive Date Header Plugin,PerlScript Plugin,MTTagInvoke である(多いな)。ArchiveYear プラグイン配布元の Lummox JR 氏のサイトが消えていて入手できないというピンチは,Junkline - MT の過去ログリンク表示を nDiary (ごにょり済み)風に さんのページで回避される。
さて,投稿がない場合でも月名を表示するには,MTArchiveYear プラグインを利用する。一番基本となるコードは次の通り。
<MTArchiveYear>
<MTArchiveYearIfEntries>
<a href="<$MTBlogArchiveURL$><$MTArchiveDate format="%Y_%m.html"$>"><$MTArchiveDate format="%b"$></a>
</MTArchiveYearIfEntries>
<MTArchiveYearIfNoEntries>
<$MTArchiveDate format="%b"$>
</MTArchiveYearIfNoEntries>
</MTArchiveYear>
再構築すると,次のようになる。
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
現在は6月で,今年は毎月投稿しているので1月から6月まではリンクがあり,7月以降は記事がないのでリンクが生成されていない。月の名前は,Jan, Feb ではなく 01, 02 のようにもできる。日付タグのフォーマットに関してはマニュアルを参照(Movable Typeユーザー・マニュアル: テンプレート・ タグ)。
MTArchiveYear プラグインは,年別のアーカイブを作成する目的で作られているため,現在の1年間分の月しか表示しない。上の再構築結果は2006年分のみということになる。MTArchiveYear タグには year 属性が設定でき,<MTArchiveYear year="2005"> とすれば,2005年分の月が全て表示されるようにできる。そこで,MTArchiveDateHeader プラグインを使って,年を求める。
<MTArchiveList archive_type="Monthly">
<MTArchiveDateHeader>
<$MTArchiveDate format="%Y"$>
</MTArchiveDateHeader>
</MTArchiveList>
再構築すると,次が得られる。
2006 2005 2004
これを使って <MTArchiveYear year="<$MTArchiveDate format="%Y"$>"> のようにしたいのだが,タグの中にタグは書くことができない。そこで,MTTagInvoke プラグインを使って,擬似的に「タグ中タグ」を実装する(nlog(n): MTTagInvoke を MTBlogTimes に使う)。少し複雑になるが,がんばってコーディングすると次のようになる。
<MTArchiveList archive_type="Monthly">
<MTArchiveDateHeader>
<$MTArchiveDate format="%Y"$>:
<MTTagInvoke tag_name="MTArchiveYear">
<MTTagAttribute name="year">
<$MTArchiveDate format="%Y"$>
</MTTagAttribute>
<MTTagContent>
<MTArchiveYearIfEntries>
<a href="<$MTBlogArchiveURL$><$MTArchiveDate format="%Y_%m.html"$>"><$MTArchiveDate format="%B"$></a>
</MTArchiveYearIfEntries>
<MTArchiveYearIfNoEntries>
<$MTArchiveDate format="%B"$>
</MTArchiveYearIfNoEntries>
<MTPerlScript>
$m = '<$MTArchiveDate format="%m"$>';
if ($m eq "12") {
print "<br />";
}
</MTPerlScript>
</MTTagContent>
</MTTagInvoke>
</MTArchiveDateHeader>
</MTArchiveList>
投稿があってもなくても年の最後は12月になるので,改行は12月終了時点で入れるようにしている。先の方法(nlog(n): 月別アーカイブへのリンクを nDialy 風に)とは異なっているので注意。再構築すると,次のようになる。
2006: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2005: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2004: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
このサイトで実際に使っているコードは次の通り(くわわっ)。かなりパズル的でゲンナリするが,人間辛抱が肝心だ。
<MTArchiveList archive_type="Monthly">
<MTArchiveDateHeader>
<a href="<$MTBlogArchiveURL$><$MTArchiveDate format="%Y.html"$>" title="<$MTArchiveDate format="%Y年"$>"><$MTArchiveDate format="%Y"$></a>:
(<$MTArchiveYearCount$>)<br />
<MTTagInvoke tag_name="MTArchiveYear">
<MTTagAttribute name="year">
<$MTArchiveDate format="%Y"$>
</MTTagAttribute>
<MTTagContent>
<MTArchiveYearIfEntries>
<MTPerlScript>
$m = <$MTArchiveDate format="%b"$>;
$m = substr($m, 0, 1);
print '<a href="<$MTBlogArchiveURL$><$MTArchiveDate format="%Y_%m.html"$>" title="<$MTArchiveDate format="%b %Y" language="jp"$>">' . lc($m) . '</a>.';
</MTPerlScript>
</MTArchiveYearIfEntries>
<MTArchiveYearIfNoEntries>
<MTPerlScript>
$m = <$MTArchiveDate format="%b"$>;
$m = substr($m, 0, 1);
print lc($m) . '.';
</MTPerlScript>
</MTArchiveYearIfNoEntries>
<MTPerlScript>
$m = '<$MTArchiveDate format="%m"$>';
if ($m eq "12") {
print "<br />";
}
</MTPerlScript>
</MTTagContent>
</MTTagInvoke>
</MTArchiveDateHeader>
</MTArchiveList>
再構築すると次のようになる。
2006: (102)
j.f.m.a.m.j.j.a.s.o.n.d.
2005: (239)
j.f.m.a.m.j.j.a.s.o.n.d.
2004: (366)
j.f.m.a.m.j.j.a.s.o.n.d.
月名を英字1文字にしている。こんなマニアックな表示をしたい人はいないだろうが,参考まで。The Neurotic Fishbowl That Is My Life... 風になる(実装コードは不明)。
年のリストを作成する方法としては,SomeDays プラグインを使う方法もある。
<MTSomeDays group="year" reverse="1" yearly="1" select="until">
<$MTSDWorkDate format="%Y"$>
</MTSomeDays>
再構築すると次のように投稿年の一覧が得られる。
2006 2005 2004
逆順にすることも簡単である(reverse="1" を削除すればよい)。ただし,日付の設定が独自なため,MTSomeDays の中では MTArchiveDate タグや MTArchiveYearCount タグが使えないという欠点がある。
MTTagInvoke で擬似的にタグの入れ子を実装する関連記事:
2007年7月3日追記:
各月の投稿数を正しく表示したい場合は,ArchiveLoad プラグインを使い,<$MTArchiveCount$> を包んでやる必要があります (MT の過去ログリンク表示を nDiary (ごにょり済み)風に < Junkline)。
<MTArchiveList archive_type="Monthly">
<MTArchiveDateHeader>
<span class="calendarhead"><a href="<$MTBlogArchiveURL$><$MTArchiveDate format="%Y.html"$>" title="<$MTArchiveDate format="%Y年" language="jp"$> (<$MTArchiveYearCount$>)"><$MTArchiveDate format="%Y"$></a></span>:
<MTTagInvoke tag_name="MTArchiveYear">
<MTTagAttribute name="year"><$MTArchiveDate format="%Y"$></MTTagAttribute>
<MTTagContent>
<MTArchiveYearIfEntries>
<MTArchiveLoad>
<MTPerlScript>
$m = <$MTArchiveDate format="%b"$>; $m = substr($m, 0, 1);
print '<a href="<$MTBlogArchiveURL$><$MTArchiveDate format="%Y_%m.html"$>" title="<$MTArchiveDate format="%B %Y" language="jp"$> (<$MTArchiveCount$>)">' . lc($m) . '</a>.';
</MTPerlScript>]
</MTArchiveLoad>
</MTArchiveYearIfEntries>
<MTArchiveYearIfNoEntries>
<MTPerlScript>
$m = <$MTArchiveDate format="%b"$>; $m = substr($m, 0, 1); print lc($m) . '.';
</MTPerlScript>
</MTArchiveYearIfNoEntries>
<MTPerlScript>
$m = '<$MTArchiveDate format="%m"$>';
if ($m eq "12") { print "<br />"; }
</MTPerlScript>
</MTTagContent>
</MTTagInvoke>
</MTArchiveDateHeader>
</MTArchiveList>
Posted by n at 2006-06-26 23:54 | Edit | Comments (2) | Trackback(0)
アクセスログをたどって来ました。「日記もどき」のTmasです。nDiary 使いのなかでも極めてマイナーな私のサイトが例にあげられていてびっくりしました。単に標準のプラグインを使っているだけなのですが……
Posted by: Tmas at June 29, 2006 21:48これはこれは。「日記もどき」は長年続けていらっしゃる日記が見やすく並んでいて素敵です。
Posted by: n at June 29, 2006 22:28