2019年12月26日
日付のテンプレートタグから元号を取得する
令和元年も8か月経ち残り数日です。令和ネタも気温も冷え込んだこの期に及んで、テンプレートで日時の情報から元号を得ることについて書きます。
まず、基本に忠実に、このような課題を解決するには、テンプレートでごちゃごちゃせずに、プラグインを書けということになります。 スタティックパブリッシングのみ対応ですが、日付に関するテンプレートタグの format モディファイアで、和暦表示を可能にする「JPEraFormats プラグイン」があります。
テンプレート
テンプレートならこのような解が考えられます。
<$MTSetVar name="undef(_japanese_eras)"$> <$MTVar name="_japanese_eras" key="明治" value="18681023"$> <$MTVar name="_japanese_eras" key="大正" value="19120731"$> <$MTVar name="_japanese_eras" key="昭和" value="19261226"$> <$MTVar name="_japanese_eras" key="平成" value="19890108"$> <$MTVar name="_japanese_eras" key="令和" value="20190501"$> <MTSetVarTemplate name="_tmpl{yyyymmdd_to_japanese_era}" ><$MTVar name="_result" value="" $><MTIf name="_with_year" ><$MTVar name="_yyyymmdd" regex_replace="/^(\d{4}).*/","$1" setvar="_yyyy" $></MTIf ><MTLoop name="_japanese_eras" sort_by="value numeric reverse" ><MTUnless name="_result" ><MTIf name="_yyyymmdd" ge="$__value__" ><MTSetVarBlock name="_result" ><$MTVar name="__key__" $><MTIf name="_with_year" ><$MTVar name="__value__" regex_replace="/^(\d{4}).*/","$1" setvar="_val" $><$MTSetVar name="_yyyy" op="-" value="$_val" $><MTIf name="_yyyy" ><$MTSetVar name="_yyyy" op="++" $><MTElse ><$MTVar name="_yyyy" value="元" $></MTIf ><$MTVar name="_yyyy"$>年</MTIf ></MTSetVarBlock ></MTIf ></MTUnless ></MTLoop ><$MTVar name="_result" $></MTSetVarTemplate>
出力結果から空白文字をなくすため、行頭が「>」で始まる変則的なテンプレートにしています。社内から「わかりにくい、誤解を招く」といった意見がありましたので、別版も後述します。
使い方
-
まずは元号を得たい箇所でこのテンプレートを書くか、このテンプレートをテンプレートモジュール化して
MTInclude
タグで読み込むなどしておきます。 -
次に「
<$MTDate format="%Y%m%d"$>
」や「<$MTEntryDate format="%Y%m%d"$>
」で、「20191226
」のような8桁の日付情報を得ます。 -
そして、
-
8桁の日付をテンプレート変数「_yyyymmdd」に代入し、テンプレート変数「_tmpl」のキー「
yyyymmdd_to_japanese_era
」(_tmpl{yyyymmdd_to_japanese_era}
) でテンプレート片を呼び出します。 -
あるいは呼び出すときに、「
<$MTVar name="_tmpl{yyyymmdd_to_japanese_era}" _yyyymmdd="20181226"$>
」や「<$MTVar name="_tmpl{yyyymmdd_to_japanese_era}" _yyyymmdd="$foo"$>
」のようにして日付を渡します。
-
8桁の日付をテンプレート変数「_yyyymmdd」に代入し、テンプレート変数「_tmpl」のキー「
-
モディファイア「
_with_year
」で、「平成31年」や「令和元年」のように年も取得できます。
記述例です。
<$MTDate format="%Y%m%d" setvar="_yyyymmdd"$> <$MTVar name="_tmpl{yyyymmdd_to_japanese_era}"$> <$MTVar name="_tmpl{yyyymmdd_to_japanese_era}" _with_year="1"$>
出力結果です。
令和 令和元年
テスト
<$MTSetVar name="undef(test_dates)"$> <$MTVar name="push(test_dates)" value="18681022"$> <$MTVar name="push(test_dates)" value="18681023"$> <$MTVar name="push(test_dates)" value="19120730"$> <$MTVar name="push(test_dates)" value="19120731"$> <$MTVar name="push(test_dates)" value="19261225"$> <$MTVar name="push(test_dates)" value="19261226"$> <$MTVar name="push(test_dates)" value="19700101"$> <$MTVar name="push(test_dates)" value="19890107"$> <$MTVar name="push(test_dates)" value="19890108"$> <$MTVar name="push(test_dates)" value="20190430"$> <$MTVar name="push(test_dates)" value="20190501"$> <$MTVar name="push(test_dates)" value="20200101"$> <$MTVar name="push(test_dates)" value="21171231"$> <MTLoop name="test_dates"><MTIf __first__><ol></MTIf> <$MTVar name="__value__" cat="090000" setvar="ts"$> <$MTDate ts="$ts" format="%Y%m%d" setvar="_yyyymmdd"$> <li><$MTDate ts="$ts" format_name="iso8601"$><ul> <li><$MTVar name="_tmpl{yyyymmdd_to_japanese_era}" _with_year="1"$><$MTDate ts="$ts" format="%b月%e" strip=""$>日 <li><$MTVar name="_tmpl{yyyymmdd_to_japanese_era}"$>時代です。 </ul> <MTIf __last__></ol></MTIf></MTLoop>
テスト結果です。
- 1868-10-22T09:00:00+09:00
- 10月22日
- 時代です。
- 1868-10-23T09:00:00+09:00
- 明治元年10月23日
- 明治時代です。
- 1912-07-30T09:00:00+09:00
- 明治45年7月30日
- 明治時代です。
- 1912-07-31T09:00:00+09:00
- 大正元年7月31日
- 大正時代です。
- 1926-12-25T09:00:00+09:00
- 大正15年12月25日
- 大正時代です。
- 1926-12-26T09:00:00+09:00
- 昭和元年12月26日
- 昭和時代です。
- 1970-01-01T09:00:00+09:00
- 昭和45年1月1日
- 昭和時代です。
- 1989-01-07T09:00:00+09:00
- 昭和64年1月7日
- 昭和時代です。
- 1989-01-08T09:00:00+09:00
- 平成元年1月8日
- 平成時代です。
- 2019-04-30T09:00:00+09:00
- 平成31年4月30日
- 平成時代です。
- 2019-05-01T09:00:00+09:00
- 令和元年5月1日
- 令和時代です。
- 2020-01-01T09:00:00+09:00
- 令和2年1月1日
- 令和時代です。
- 2117-12-31T09:00:00+09:00
- 令和99年12月31日
- 令和時代です。
テンプレートの異版
<$MTSetVar name="undef(_japanese_eras)"$> <$MTVar name="_japanese_eras" key="明治" value="18681023"$> <$MTVar name="_japanese_eras" key="大正" value="19120731"$> <$MTVar name="_japanese_eras" key="昭和" value="19261226"$> <$MTVar name="_japanese_eras" key="平成" value="19890108"$> <$MTVar name="_japanese_eras" key="令和" value="20190501"$> <MTSetVarTemplate name="_tmpl{yyyymmdd_to_japanese_era}"><MTFor strip=""> <$MTVar name="_result" value=""$> <MTIf name="_with_year"> <$MTVar name="_yyyymmdd" regex_replace="/^(\d{4}).*/","$1" setvar="_yyyy"$> </MTIf> <MTLoop name="_japanese_eras" sort_by="value numeric reverse"> <MTUnless name="_result"> <MTIf name="_yyyymmdd" ge="$__value__"> <$MTVar name="__key__" setvar="_result"$> <MTIf name="_with_year"> <$MTVar name="__value__" regex_replace="/^(\d{4}).*/","$1" setvar="_val"$> <$MTSetVar name="_yyyy" op="-" value="$_val"$> <MTIf name="_yyyy"> <$MTSetVar name="_yyyy" op="++"$> <MTElse> <$MTVar name="_yyyy" value="元"$> </MTIf> <MTSetVarBlock name="_result" append="1"><$MTVar name="_yyyy"$>年</MTSetVarBlock> </MTIf> </MTIf> </MTUnless> </MTLoop> <$MTVar name="_result"$> </MTFor></MTSetVarTemplate>
さあ帰ろう。
コメントを投稿する