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