Generators(ジェネレータ)
あなた自身のルールに基づいた追加コンテンツがJekyllに必要なら、ジェネレータを作ることができます。
ジェネレータはgenerate
メソッドを定義するJekyll::Generator
のサブクラスです。Jekyll::Site
のインスタンスを受け取ります。generate
が返す値は無視されます。
ジェネレータは、Jekyllが既存のコンテンツのインベントリを作成した後、サイトが生成される前に実行されます。front matterのあるページはJekyll::Page
インスタンスとして保管され、site.pages
で使用可能です。静的ファイルはJekyll::StaticFile
インスタンスになり、site.static_files
で使用可能です。詳細はドキュメンテーションの変数ページとJekyll::Site
を見てください。
例えば、ジェネレータはテンプレート変数に構築時に計算された値を代入することができます。以下の例では、reading.html
テンプレートにongoing
とdone
の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
ジェネレータには一つだけのメソッドの実装が必要です。
メソッド | 説明 |
---|---|
|
サイドエフェクトとしてコンテンツを生成する。 |
ジェネレータが単一のファイル内に収まっている場合、任意の名前を付けることができますが、拡張子は .rb
にする必要があります。ジェネレータが複数のファイルに分割されている場合は、https://rubygems.org/で公開するRubygemとしてパッケージ化する必要があります。この場合、2つのgemが同じ名前を持つことはできないため、gemの名前はそのサイトに基づく名前を設定する必要があります。
デフォルトでは、Jekyllは_plugins
ディレクトリでジェネレータを探します。しかし、設定ファイルでplugins_dir
キーでプラグインのディレクトリを指定できます。