メタデータのデフォルト値を設定する
冒頭に以下のようなメタデータを書くのですが、往々にしてこれを忘れます。title は仕方ないとしても、他のものはよろしく設定してほしい、といのが人情です。
--- title: 記事のタイトル date: 2018-06-26 layout: post.html --- ...
metalsmith-default-values はこれらのメタデータのデフォルト値を設定します。
const default_values = require('metalsmith-default-values');
...
.use(default_values([
{
pattern: 'posts/**/*.html',
defaults: {
layout: 'post.html',
date: function (post) {
return post.stats.ctime;
}
}
}
]))
...
posts/**/*.html 以下のファイルに対して、メタデータのデフォルト値を設定します。post.html をデフォルトのテンプレートとし、投稿日付はファイルの作成日(ctime)をデフォルト値とします。もちろんこれらのメタデータの値を特別に設定したい場合は、そのように書けばいいわけです。
日付の扱い
date は Metalsmith 内部では JavaScript の Date オブジェクトとして保持されているようです。date は投稿日の逆順にソートしたりするのに使うので、そのまま処理を進め、日付のフォーマットはテンプレートエンジン側で処理した方が良いでしょう。
あいにく、Handlebars はそのような処理を一切持ち合わせていないので、ヘルパー関数を各自が追加する必要があります。そのためのプラグイン metalsmith-discover-helpers の紹介です。
const discoverHelpers = require('metalsmith-discover-helpers');
...
.use(discoverHelpers({
directory: 'helpers',
pattern: /\.js$/
}))
...
日付のフォーマットを組み立てる関数は、さすがによく使うので、npm に転がっています。handlebars-dateformat をインストールし、helpers/dateFormat.js として、次のようなファイルを作ります。
module.exports = require('handlebars-dateformat');
拡張子を除いたファイル名が、Handlebars の関数名として登録されます。テンプレート内では、以下のように使います。
<dl>
<dt>日付</dt>
<dd><time>{{dateFormat date "YYYY/MM/DD"}}</time></dd>
</dl>
フォーマットを指定できる利点として、クローラー向けにメタデータを付ける場合の例を示します。メタデータで要求されているタイムスタンプ文字列は ISO 8601 形式ですから、次のように指定します。
<dl>
<dt>日付</dt>
<dd><time datetime="{{dateFormat date moment.ISO_8601 true}}" itemprop="datePublished">{{dateFormat date "YYYY/MM/DD"}}</time></dd>
</dl>
最後の true は UTC で表記する指示です。時差を省略できる分だけ、文字列が短くなります。