ローカルで動かすようにして環境もスッキリできたので、テーマとプラグインもウェブログのリポジトリに置くようにした。

テーマはこのウェブサイトの他のページと同じようにHandlebars.jsを使ったGruntタスクで生成している。今まではいくつかthemeプラグインに対応してないプラグインを使っていたのでちょっと面倒な感じになってたけど、プラグイン構成がシンプルになったのでついでにthemeプラグインに移行した。2014年になって新しいプラグイン入れるとはなかなか。

プラグインは大幅に整理された。適切なHTTPヘッダーを出力したり、アクセス制限をしたり、静的生成を補助したりなど、サーバーで動かす時にのみ必要なプラグインはすべて不必要になったのですごい減った。数字のプリフィックスはサーバーで動かしてた時の名残り。


themeプラグインで処理されるテーマはpageというファイル名で特定のディレクトリに置くようになっている。Gruntで拡張子なしのファイルを出力するには直接ファイル名を出力するのが一番簡単だけど、動的マッピングの時はそれはできない。この場合はrenameオプションを使ってやる。

'use strict';

module.exports = function (grunt) {
  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),

    generate: {
      blog_theme: {
        expand: true,
        cwd: '.grunt/html/',
        src: ['blog/theme.mustache'],
        dest: '.grunt/weblog/entries/themes/html/',
        rename: function (dest, src) {
          return dest + 'page';
        }
      }
    }
  });
};

このような形で出力ファイル名を処理する関数を書いてやる。上記設定で仮にrenameオプションがない場合、出力ファイル名は以下のような形になる。

.grunt/weblog/entries/themes/html/blog/theme.mustache

renameオプションで指定する関数にはdestsrcそのまま渡されるので、それを使って出力したいファイルのパスを返してやれば良い。この場合は固定で返すだけなのでハードコードしているけど、グロブから受ける場合は以下のようにして拡張子を削除したりとかする。

function (dest, src) {
  return dest + src.replace(/\.[^.]*?$/, '');
}

Blosxomと関係ない話の方が長かった。