プラグインの構造

最小構成と独自プラグイン

var Metalsmith = require('metalsmith');

function hello(arg) {
  console.log(arg.hoge); // fuga
  return function(files, metalsmith, done) {
    done();
  }
}

Metalsmith(__dirname)
  .use(
    hello({ hoge: "fuga" })
  )
  .build(function(err){
    if (err) throw err;
  });

プラグインの使用は .use() を連結することで実現します。その引数に渡すのは、 Metalsmith プラグインとして定められた関数 である必要があります。 プラグインによっては require したオブジェクトをそのまま渡すものや、 実行結果として関数を返すものがあります。このあたりは JavaScript の基礎なので Metalsmith の範疇外なのですが、抑えておくとよいでしょう。

  return function(files, metalsmith, done) {
    done();
  }

プラグインの構造

次のコードは、プラグインのよくある構造です。リターンする関数の中でプラグイン内に流れてきた ファイル群すべてをループし、中身を取り出してタイトルを読み取ったり、 Markdown を HTML に変換したりします。 そして、次のプラグインに処理を渡すために、最後に done() を呼びます。プラグインとしての役割が 他と競合しない、独立している場合は初めに done() を呼んでさっさと次にバトンを渡す場合もあるようです。

function printFileTitle(arg) {
  return function(files, metalsmith, done) {
    Object.keys(files).forEach(function(file){
      var data = files[file];
      // print front-matter title
      console.log(data.title);
    });
    done();
  }
}