Generators(ジェネレータ)

あなた自身のルールに基づいた追加コンテンツがJekyllに必要なら、ジェネレータを作ることができます。

ジェネレータはgenerateメソッドを定義するJekyll::Generatorのサブクラスです。Jekyll::Siteのインスタンスを受け取ります。generateが返す値は無視されます。

ジェネレータは、Jekyllが既存のコンテンツのインベントリを作成した後、サイトが生成される前に実行されます。front matterのあるページはJekyll::Pageインスタンスとして保管され、site.pagesで使用可能です。静的ファイルはJekyll::StaticFileインスタンスになり、site.static_filesで使用可能です。詳細はドキュメンテーションの変数ページJekyll::Siteを見てください。

例えば、ジェネレータはテンプレート変数に構築時に計算された値を代入することができます。以下の例では、reading.htmlテンプレートにongoingdoneの2つの変数をジェネレータから書き込んでいます。

module Reading
  class Generator < Jekyll::Generator
    def generate(site)
      ongoing, done = Book.all.partition(&:ongoing?)

      reading = site.pages.detect {|page| page.name == 'reading.html'}
      reading.data['ongoing'] = ongoing
      reading.data['done'] = done
    end
  end
end

以下の例は新しいページを生成するより複雑なジェネレータです。この例は、categoriesディレクトリにそのカテゴリのポスト一覧のカテゴリページをcategory_index.htmlレイアウトを使用して作成します。

module Jekyll
  class CategoryPageGenerator < Generator
    safe true

    def generate(site)
      if site.layouts.key? 'category_index'
        dir = site.config['category_dir'] || 'categories'
        site.categories.each_key do |category|
          site.pages << CategoryPage.new(site, site.source, File.join(dir, category), category)
        end
      end
    end
  end

  # A Page subclass used in the `CategoryPageGenerator`
  class CategoryPage < Page
    def initialize(site, base, dir, category)
      @site = site
      @base = base
      @dir  = dir
      @name = 'index.html'

      self.process(@name)
      self.read_yaml(File.join(base, '_layouts'), 'category_index.html')
      self.data['category'] = category

      category_title_prefix = site.config['category_title_prefix'] || 'Category: '
      self.data['title'] = "#{category_title_prefix}#{category}"
    end
  end
end

ジェネレータには一つだけのメソッドの実装が必要です。

メソッド 説明

generate

サイドエフェクトとしてコンテンツを生成する。

ジェネレータが単一のファイル内に収まっている場合、任意の名前を付けることができますが、拡張子は .rbにする必要があります。ジェネレータが複数のファイルに分割されている場合は、https://rubygems.org/で公開するRubygemとしてパッケージ化する必要があります。この場合、2つのgemが同じ名前を持つことはできないため、gemの名前はそのサイトに基づく名前を設定する必要があります。

デフォルトでは、Jekyllは_pluginsディレクトリでジェネレータを探します。しかし、設定ファイルでplugins_dirキーでプラグインのディレクトリを指定できます。