Jekyll のカテゴリーとタグの指定方法 3 パターン

Jekyll で記事にカテゴリーやタグを設定するには YAML の部分に書けばいいんだけど、指定方法が 3 通りもあって複雑だったのでまとめておく。

Jekyll 0.12.0 を前提に書いてるけど、将来的に大きな変更が入るとは思いにくい。

(1) 単数形を使う

単数形 (categorytag) で指定したときは 1 つだけしか指定できない。

---
category: Foo
tag: Bar

上の例では、Foo というカテゴリー、Bar というタグを設定したことになる。

1 つしか指定できないので、

---
category: Foo Bar
tag: Bar, Baz

のようにカンマやスペースで区切ったとしても、Foo Bar という名前のカテゴリー、Bar, Baz という名前のタグが指定されたものと解釈される。

(2) 複数形に文字列を指定する

複数形 (categoriestags) に文字列を与えると、スペース区切りで複数指定できる。

---
categories: Foo Bar
tags: Bar Baz

この例では、カテゴリーは FooBar、タグは BarBaz の 2 つずつ指定されたものとみなされる。

つまり、この書き方ではスペースを含むカテゴリー名やタグ名は指定できない。スペースを含めたいなら、次で紹介する「複数形+配列」で指定する方法を使うのがよい。前述の「単数形」の指定を使ってもよいけど、個数を増やしたときに無駄にハマりそうなので、複数形で統一したほうが分かりやすいと思う。

(3) 複数形に配列を指定する

複数形 (categories・`tags) に文字列の配列を渡すこともできる。

---
categories:
- Foo Bar
- AA,BBB
tags:
- Bar
- Baz, AAA

上の指定では、カテゴリーは Foo BarAA,BBB、タグは Bar BazAAA の 2 つずつが指定されたものと解釈される。名前にスペースやカンマを含めることが可能。

次のようにも書けるけど、この場合は YAML の制限でカンマを含む名前は指定できない。

---
categories: [Foo Bar, AABBB]
tags: [Bar Baz, AAA]

該当箇所のソースを読んでみる

ソースを読んだほうが早いかもしれない。

lib/jekyll/core_ext.rbHash#pluralized_array を見ればよい。

この関数が self.data.pluralized_array("tag", "tags") のように呼ばれる。

class Hash

  # Read array from the supplied hash favouring the singular key
  # and then the plural key, and handling any nil entries.
  #   +hash+ the hash to read from
  #   +singular_key+ the singular key
  #   +plural_key+ the singular key
  #
  # Returns an array
  def pluralized_array(singular_key, plural_key)
    hash = self
    if hash.has_key?(singular_key)
      array = [hash[singular_key]] if hash[singular_key]
    elsif hash.has_key?(plural_key)
      case hash[plural_key]
      when String
        array = hash[plural_key].split
      when Array
        array = hash[plural_key].compact
      end
    end
    array || []
  end

singular が単数形、plural が複数形。

ビルトインの Hash にメソッドを追加するあたりがなんともアグレッシブ。

まとめ

親切な計らいのおかげで、かえって悩むことが増えそうにも思える不思議な仕様・・・。