フック
フックを使用すると、プラグインはビルドプロセスのさまざまな側面をきめ細かく制御できます。プラグインがフックを定義している場合、Jekyllは定義済みの時点でそれらを呼び出します。
フックは、所有者とイベント名に登録されます。登録するには、Jekyll::Hooks.register
を呼び出し、フックの所有者、イベント名、およびフックがトリガーされるたびに呼び出すコードを渡します。たとえば、Jekyllがページをレンダリングするたびにカスタム機能を実行する場合は、次のようにフックを登録できます。
Jekyll::Hooks.register :pages, :post_render do |page|
# code to call after Jekyll renders a page
end
注:後述する:post_convert
イベントは、v4.2.0で導入された機能です。
Jekyllには、標準で:site
、:pages
、:documents
、および:clean
の所有者のための定義済みのフックポイントがあります。さらに、:documents
に定義されているフックポイントは、コレクションタイプを呼び出すことによってのみ、個々のコレクションに対して利用できます。つまり、コレクション_posts
のドキュメントの場合は:posts
、コレクション_movies
のドキュメントの場合は:movies
です。いずれの場合も、Jekyllは最初のコールバックパラメータとして所有者オブジェクトを渡してフックを呼び出します。
登録されたすべてのフック所有者は、次のイベントをサポートします::post_init
、:pre_render
、:post_convert
、:post_render
、:post_write
。ただし、:site
所有者は、特別なイベント名に応答するように設定されています。詳細については、次のセクションを参照してください。
すべての:pre_render
フックと:site, :post_render
フックは、2番目のパラメータとしてpayload
ハッシュも提供します。:pre_render
イベントの場合、ペイロードはレンダリング中に使用できる変数を完全に制御できますが、:site, :post_render
イベントの場合、ペイロードにはサイト全体のレンダリング後の最終値が含まれています(サイトマップ、フィードなどに役立ちます)。
組み込みのフック所有者とイベント
利用可能なフックの完全なリスト
所有者 | イベント | トリガーされるタイミング |
---|---|---|
サイト全体を網羅 |
|
サイトの初期化直後。サイトの設定を変更するのに適しています。ビルド/サーバーセッションごとに1回トリガーされます。 |
|
再生成中にサイトがリセットされた直後。 |
|
|
すべてのソースファイルがディスクから読み込まれた後 |
|
|
サイト全体をレンダリングする直前 |
|
|
サイト全体のレンダリング後、ファイルを書き込む前 |
|
|
レンダリングされたすべてのファイルがディスクに書き込まれた後 |
|
サイト内のすべてのページをきめ細かく制御できます |
|
ページが初期化されるたび |
|
:pre_render |
|
|
:post_convert |
|
|
ページコンテンツの変換後、ページレイアウトのレンダリング前 |
|
|
:post_render |
|
:post_write |
|
ページをディスクに書き込んだ後 |
|
:documents |
|
|
投稿やユーザー定義のコレクションのドキュメントを含む、サイト内のすべてのドキュメントをきめ細かく制御できます |
|
|
:post_init |
|
|
ドキュメントが初期化されるたび |
|
ドキュメントをレンダリングする直前 |
|
:post_convert |
|
ドキュメントコンテンツの変換後、ドキュメントレイアウトのレンダリング前 |
|
|
:post_render ドキュメントをレンダリングした後、ディスクに書き込む前 |
|
|
:post_write |
|
|
ドキュメントをディスクに書き込んだ後 |
|
ユーザー定義コレクションのドキュメントに影響を与えることなく、サイト内のすべての投稿をきめ細かく制御できます |
|
投稿が初期化されるたび |
:pre_render
投稿をレンダリングする直前
:post_convert
module Foobar
class HookedExcerpt < Jekyll::Excerpt
def initialize(doc)
super
trigger_hooks(:post_init)
end
def output
@output ||= trigger_hooks(:post_render, renderer.run)
end
def renderer
@renderer ||= Jekyll::Renderer.new(
doc.site, self, site.site_payload
)
end
def trigger_hooks(hook_name, *args)
Jekyll::Hooks.trigger :excerpts, hook_name, self, *args
end
end
end
Jekyll::Hooks.register :excerpts, :post_init do |excerpt|
Jekyll.logger.debug "Initialized:",
"Hooked Excerpt for #{excerpt.doc.inspect}"
end
Jekyll::Hooks.register :excerpts, :post_render do |excerpt, output|
return output unless excerpt.doc.type == :posts
Foobar.transform(output)
end