フック

フックを使用すると、プラグインはビルドプロセスのさまざまな側面をきめ細かく制御できます。プラグインがフックを定義している場合、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イベントの場合、ペイロードにはサイト全体のレンダリング後の最終値が含まれています(サイトマップ、フィードなどに役立ちます)。

組み込みのフック所有者とイベント

利用可能なフックの完全なリスト

所有者 イベント トリガーされるタイミング

:site

サイト全体を網羅

:after_init

サイトの初期化直後。サイトの設定を変更するのに適しています。ビルド/サーバーセッションごとに1回トリガーされます。

:after_reset

再生成中にサイトがリセットされた直後。

:post_read

すべてのソースファイルがディスクから読み込まれた後

:pre_render

サイト全体をレンダリングする直前

:post_render

サイト全体のレンダリング後、ファイルを書き込む前

:post_write

レンダリングされたすべてのファイルがディスクに書き込まれた後

:pages

サイト内のすべてのページをきめ細かく制御できます

:post_init

ページが初期化されるたび

:pre_render

:pre_render

ページをレンダリングする直前

:post_convert

:post_render

ページコンテンツの変換後、ページレイアウトのレンダリング前

:post_write

:post_render

ページをレンダリングした後、ディスクに書き込む前

:post_write

:post_init

ページをディスクに書き込んだ後

:pre_render

:documents

ページをレンダリングする直前

投稿やユーザー定義のコレクションのドキュメントを含む、サイト内のすべてのドキュメントをきめ細かく制御できます

:post_render

:post_init

:post_write

ドキュメントが初期化されるたび

:pre_render

ドキュメントをレンダリングする直前

:post_init

:post_convert

:pre_render

ドキュメントコンテンツの変換後、ドキュメントレイアウトのレンダリング前

ページをレンダリングする直前

:post_render

ドキュメントをレンダリングした後、ディスクに書き込む前

:post_render

:post_write

:post_write

ドキュメントをディスクに書き込んだ後

:posts

ユーザー定義コレクションのドキュメントに影響を与えることなく、サイト内のすべての投稿をきめ細かく制御できます

:post_init

投稿が初期化されるたび

: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