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

こちらは新しいページを生成するより複雑なジェネレータです。

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

この例では、ジェネレータは一連のファイルをcategoriesディレクトリに各カテゴリの作成します。category_index.htmlレイアウトを使用し、各カテゴリのポストの一覧を作成します。

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

メソッド 説明

generate

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