Front Matterのデフォルト

front matterの使用は、サイトのページやポストに特別な設定行う方法の一つです。デフォルトのレイアウトやタイトルのカスタマイズ、ポストの正確な日時の指定のような設定は、ページやポストのfront matterで追加することができます。

度々、多くのオプション設定を繰り返す場合が出てくるでしょう。各ファイルへの同じレイアウトの指定、ポストへの同じカテゴリの指定等です。著者名といったカスタム変数の追加も、ブログの多数のポストで同じです。

新しいポストやページを作成する度に設定を繰り返す代わりに、Jekyllはサイト設定でこれらのデフォルトを設定する方法を提供しています。これを行うには、プロジェクトのrootディレクトリの_config.ymldefaultsキーを使用してサイト全体のデフォルトを設定します。

defaultsキーはデフォルトを定義する特定のpathとscopeとvalueのペアの配列で指定します。オプションでパスのファイルの種類を指定することもできます。

サイトの全てのページとポストのデフォルトレイアウトを追加したい場合です。以下を_config.ymlファイルに追加します。

defaults:
  -
    scope:
      path: "" # an empty string here means all files in the project
    values:
      layout: "default"
一度止めて`jekyll serve`コマンドを再実行します

グローバル設定と変数定義が含まれているマスター設定ファイルの_config.ymlは、実行時に一度だけ読み込まれます。自動再生成をしている時に_config.ymlに変更を加えても、次の実行まで読み込まれません。

Dataファイルは自動再生成時も再読込されます。

ここでは、scopeパスの中に存在するファイルにvaluesに当てはめています。pathに空の文字列が指定されているので、プロジェクトの全ファイルに適用されます。例えばcssファイルのように、全てのファイルにはレイアウトを設定したくないでしょう。scopeキーにtypeを指定することができます。

defaults:
  -
    scope:
      path: "" # an empty string here means all files in the project
      type: "posts" # previously `post` in Jekyll 2.2.
    values:
      layout: "default"

これで、postsタイプのファイルにのみレイアウトが設定されます。pagespostsdrafts、サイトのコレクションをtypeで使用することができます。typeはオプションですが、scope/valuesペアを指定するときはpathを指定する必要があります。

前述のように、defaultsには複数のscope/valuesペアを指定することができます。

defaults:
  -
    scope:
      path: ""
      type: "pages"
    values:
      layout: "my-site"
  -
    scope:
      path: "projects"
      type: "pages" # previously `page` in Jekyll 2.2.
    values:
      layout: "project" # overrides previous default layout
      author: "Mr. Hyde"

このdefaultsで、全てのページはmy-siteレイアウトを使用します。projects/フォルダのhtmlファイルはprojectレイアウトを使用し、page.author liquid変数Mr. Hydeを指定します。

collections:
  my_collection:
    output: true

defaults:
  -
    scope:
      path: ""
      type: "my_collection" # a collection in your site, in plural form
    values:
      layout: "default"

この例では、my_collectionというコレクションlayoutdefaultだと設定します。

Front MatterデフォルトでのGlobパターン

デフォルトをマッチさせるために、Globpパターンを使用することもできます(現在は、*を含むパター限定です)。例えば、sectionフォルダのサブフォルダにある各special-page.htmlに特定のレイアウトを設定することができます。3.7.0

collections:
  my_collection:
    output: true

defaults:
  -
    scope:
      path: "section/*/special-page.html"
    values:
      layout: "specific-layout"
Globとパフォーマンス

パスをGlobで指定するとパフォーマンスへの悪影響があることが知られており、特にWindowsでは最適化されていません。パスをGlobで指定すると、コレクションディレクトリの大きさに応じて構築時間が長くなります。

優先順位

Jekyllは_config.ymldefaultsセクションで指定された設定を全て適用します。他の特定のパスへのscope/valuesペアを設定することで、上書きすることができます。

上に戻って下から3つ目の例を見てください。まず、my-siteへのデフォルトページレイアウトを設定しています。そして、project用のprojects/パスのページへのデフォルトを設定しています。ページやポストのfront matterに設定する任意の値で実行可能です。

最後に、_config.ymlファイルにdefaultsセクションを追加してサイト設定のデフォルトを設定した場合、それらの設定はページやポストで上書きできます。ページやポストのfront matterで設定を行うだけです。例えば、

# In _config.yml
...
defaults:
  -
    scope:
      path: "projects"
      type: "pages"
    values:
      layout: "project"
      author: "Mr. Hyde"
      category: "project"
...
# In projects/foo_project.md
---
author: "John Smith"
layout: "foobar"
---
The post text goes here...

projects/foo_project.mdは、layoutにはprojectの代わりにfoobarが、authorにはMr. Hydeの代わりにJohn Smithがサイト構築時に設定されます。