メタデータのデフォルト値を設定する
冒頭に以下のようなメタデータを書くのですが、往々にしてこれを忘れます。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 で表記する指示です。時差を省略できる分だけ、文字列が短くなります。