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キーでプラグインのディレクトリを指定できます。