日本の祝日を判定/表示するプラグイン

Movable Typeでカレンダー等を作るときに、祝日かどうかを判定したい場合があります。
過去にいくつかの方法が紹介されていますが、内容が古かったり、汎用的でなかったりと、個人的に「これ」と言えるものがありませんでした。

そこで、日本の祝日を判定したり、祝日名を表示したりするプラグインを作りました。
スタティック/ダイナミックの両方に対応しています。

1.インストール

プラグインは以下からダウンロードします。

JapaneseHoliday_1_00.zip

ダウンロードしたZipファイルを解凍すると、「plugins」フォルダができます。
このフォルダを、Movable Typeのインストール先ディレクトリにアップロードします。

2.使い方

このプラグインをインストールすると、以下の2つのテンプレートタグが追加されます。

2-1.MTIfJPHolidayタグ

ある日付が祝日であるかどうかを判断するブロックタグです。
日付は「ts」か「tag」のモディファイアで指定するか、後述するMTJPHolidayDefaultTagタグで指定します。

tsモディファイアでは、「ts="20130620123456"」のように、年/月/日/時/分/秒を連結した14桁の数値を指定します。
また、tagモディファイアでは「tag="EntryDate"」のように、判断対象のテンプレートタグの名前を指定します(ただし、先頭の「MT」はつけません)。

ts/tagの両方のモディファイアを指定した場合は、tsモディファイアが優先されます。
ts/tagの両方のモディファイアを省略し、かつMTJPHolidayDefaultTagタグでテンプレートタグを指定している場合は、そのタグの日付が使われます。
それ以外の場合は、スタティックパブリッシングでは、再構築時点の日付が判断対象になります。また、ダイナミックパブリッシングでは、ページにアクセスがあった時点の日付が判断対象になります。

2-2.MTJPHolidayNameタグ

ある日付が祝日である場合、その祝日の名前を出力するファンクションタグです。
振替休日の場合は「振替」と出力します。
平日であれば何も出力しません。

日付は「ts」か「tag」のモディファイアで指定するか、後述するMTJPHolidayDefaultTagタグで指定します。

2-3.MTJPHolidayDefaultTagタグ

MTIfJPHoliday/MTJPHolidayNameタグのtagモディファイアの規定値を指定するブロックタグです。
例えば、以下のように書くと、MTJPHolidayDefaultTagタグのブロック内では、MTIfJPHoliday/MTJPHolidayNameタグでtagモディファイアを省略しても、「tag="CalendarDate"」のモディファイアを指定したのと同じ動作になります。

<mt:JPHolidayDefaultTag tag="CalendarDate">
・
・
・
</mt:JPHolidayDefaultTag>

3.事例

以下のようにしてカレンダーを出力する例です。

  • 個々の日付のtd要素には、祝日なら「holiday」、日曜日なら「sunday」、土曜日なら「saturday」のclass属性を付けます。
  • 個々の日付のtd要素のtitle属性に、日付を出力します。ただし、祝日の場合は、日付の後に祝日名も付けます。
<mt:JPHolidayDefaultTag tag="CalendarDate">
<mt:Calendar>
  <mt:CalendarWeekHeader><tr></mt:CalendarWeekHeader>
  <mt:CalendarIfBlank>
    <td>&nbsp;</td>
  <mt:Else>
    <mt:IfJPHoliday>
      <mt:SetVarBlock name="class"> class="holiday"</mt:SetVarBlock>
      <mt:SetVarBlock name="title"><$mt:CalendarDate format="%Y年%m月%d日"$>(<$mt:JPHolidayName$>)</mt:SetVarBlock>
    <mt:Else>
      <mt:SetVarBlock name="title"><$mt:CalendarDate format="%Y年%m月%d日"$></mt:SetVarBlock>
      <mt:If tag="CalendarDate" format="%w" eq="0">
        <mt:SetVarblock name="class"> class="sunday"</mt:SetVarBlock>
      <mt:ElseIf tag="CalendarDate" format="%w" eq="6">
        <mt:SetVarBlock name="class"> class="saturday"</mt:SetVarBlock>
      <mt:Else>
        <$mt:SetVar name="class" value=""$>
      </mt:If>
    </mt:IfJPHoliday>
    <td title="<$mt:GetVar name="title"$>"<$mt:GetVar name="class"$>>
    <mt:CalendarIfEntries>
      <a href="<mt:Entries lastn="1"><$mt:EntryPermalink$></mt:Entries>"><$mt:CalendarDay$></a>
    </mt:CalendarIfEntries>
    <mt:CalendarIfNoEntries>
      <$mt:CalendarDay$>
    </mt:CalendarIfNoEntries>
    </td>
  </mt:CalendarIfBlank>
  <mt:CalendarWeekFooter></tr></mt:CalendarWeekFooter>
</mt:Calendar>
</mt:JPHolidayDefaultTag>

テンプレートの内容は以下の通りです。

1/31行目

カレンダーの個々の日付(MTCalendarDateタグ)を扱うので、MTIfJPHoliday/MTJPHolidayNameのタグモディファイアの規定値を「CalendarDate」にします。

2/30行目

カレンダーを出力します。

3行目

各行の先頭の<tr>タグを出力します。

4~5行目

1日の前/月末の日の後の空白のセルの場合は、スペースのみのtd要素を出力します。

7~9行目

出力する日が祝日なら、変数classに「class="holiday"」を代入します。
また、変数titleに、日付と祝日名を代入します。

11行目

出力する日が祝日でないなら、変数titleに日付を代入します。

12~13行目

出力する日が日曜日なら、変数classに「class="sunday"」を代入します。

14~15行目

出力する日が土曜日なら、変数classに「class="saturday"」を代入します。

16~17行目

出力する日が平日なら、変数classの値を空文字列にします。

20行目

<td>タグを出力します(title/class属性を含む)。

21~23行目

ブログ記事がある日なら、日を出力し、かつその日の最新の記事にリンクします。

24~26行目

ブログ記事がない日なら、日だけを出力します。

29行目

各行の最後の</tr>タグを出力します。