NKSSG
NakaKen Static Site Generator

テーマで使えるデータ

💽

ここでは、テーマで使用できるデータについて説明していきます。

テーマで使えるデータ

テーマには、HTML の構造や見た目などを決めるテンプレートを使います。このテンプレート内では、サイトに関するいろんなデータを使うことができます。

どのテンプレートにも、次の4種類のデータが渡されます。

  • サイトの設定情報(nkssg.yml 内の情報など)
  • すべての個別ページの情報
  • すべてのアーカイブの情報
  • テーマの設定情報(テーマ内の yml ファイル内の情報など)

テーマで使いそうな主なものを以下に挙げていきます。

サイトの設定情報

サイトの設定情報は、config.mode などのように config から始めると取得できます。

  • config.site
    • nkssg.yml 内で設定した site の情報。
    • config.site.site_name などと書いて使う。
    • config.site.site_url の最後の「/」は削除されている。
  • config.mode
    • どのモードでサイトが作成されているか。
    • nkssg xxx を実行したときの xxx が入る。
    • 例えば if config.mode != "build" とすれば、ビルド時以外に何かを実行するのに使える。

すべての個別ページの情報

すべての個別ページの情報は、singles から始めると取得できます。普通は、次のようにして各個別ページに対して何かを行うことが多いでしょう。

{% for single in singles %}
{% endfor %}

このように個別ページ single を取得したときに使えるデータのうち、主なものを以下に挙げていきます。

  • single.status
    • ステータス。
    • publish, draft など。
    • フロントマターで設定したもの。
  • single.date, single.modified
    • 公開日時と修正日時。
    • {{ single.date.strftime('%Y/%m/%d') }} などとして表示できる。
  • single.is_draft
    • ドラフトかどうか。
    • if 文で使える。
  • single.title, single.slug, single.file_id, single.summary
    • タイトル、スラッグ、file_id、要約。
  • single.content
    • 本文。
    • Markdown は HTML に変換済み。
  • single.image
    • サムネイル。
    • URL は、single.image.url で取得できる。
  • single.url
    • URL。
  • single.meta
    • フロントマター全体の辞書。
  • single.post_typesingle.archive_type
    • 投稿タイプ、アーカイブタイプ。
    • アーカイブタイプは、datesectionnone のどれか。
  • single.prev_pagesingle.next_page
    • 前後の記事。
  • single.archive_list
    • その個別ページが属するアーカイブの一覧。

また、singles には、file_id から個別ページを取得できる get_single_by_file_id というメソッドがあります。

{% set page = singles.get_single_by_file_id(file_id) %}

例えば、サイドバーに特定の記事のリンクを載せたい場合などで使えます。

すべてのアーカイブの情報

すべてのアーカイブの情報は、archives から始めると取得できます。

  • archives.root_archives
    • ルートアーカイブの一覧。以下の3種類が入っている。
    • 日付アーカイブの場合は date
    • タクソノミーアーカイブの場合は、タクソノミー。
    • セクションアーカイブの場合は、post_type の名前。
  • archives.pages
    • アーカイブページの一覧。
    • ページネーションを加味した、すべてのページが入っている。

また、次のようにして各アーカイブに対して、何かを行うこともできます。

{% for archive in archives %}
{% endfor %}

このように各アーカイブ archive を取得したときに使えるデータのうち、主なものを以下に挙げていきます。

  • archive.name
    • アーカイブの名前。
  • archive.title
    • タイトル。
    • name と同じ。
  • archive.slug
    • スラッグ。
    • URL に使うことを想定。
  • archive.url
    • URL。
    • 複数ページに分かれている場合は、1ページ目へのリンク。
  • archive.archive_type
    • アーカイブタープ。
    • 日付、タクソノミー、セクションのうちのどれか1つ。
  • archive.is_root
    • ルートアーカイブかどうか。
  • archive.parent
    • 親アーカイブ。
  • archive.parents
    • 先祖アーカイブ。
    • 親、親の親、その親、など、自分より上の親がリストになっている。
    • ルートアーカイブから順番に入っている。
    • パンくずリストなどで使うことができる。
  • archive.children
    • 子アーカイブ。
    • 日付アーカイブの場合、dateの子は年、年の子は月。
    • タクソノミーアーカイブは、nkssg.yml で設定した親子関係を反映。
    • セクションアーカイブは、フォルダ階層を親子関係とみなす。
  • archive.root_name
    • そのアーカイブのルートアーカイブ。
  • archive.singles
    • アーカイブに属する個別ページ一覧。
  • archive.singles_all
    • アーカイブとその子孫に属する個別ページ一覧。
  • archive.singles_all_count
    • アーカイブとその子孫に属する個別ページの数。
  • archive.singles_index
    • アーカイブの情報が含まれている個別ページ。
    • セクションアーカイブのみで有効。

テーマの設定情報

テーマの設定ファイル(「テーマ名.yml」のこと)の情報も使うことができます。theme でアクセスできます。

例えば、テーマの設定ファイルで以下のように書いていたとします。

xxx: yyy

このとき、テンプレート内で theme.xxx と呼べば、yyy となります。

なお、親テーマと子テーマで同じ設定項目があると、子テーマで設定した値が優先されます。

特別なテンプレート内で使えるデータ

テンプレートによっては、サイトのデータ以外にも使えるデータがあります。

対象ページの情報

個別ページやアーカイブページのテンプレートでは、mypage を使って、対象ページの情報を取得することができます。

例えば、single.html 内で mypage.title と書いたとします。各記事ファイルから HTML を作る際に、mypage.title と書いた部分はその記事のタイトルに置き換わります。

mypage で扱えるデータ項目は、singlearchive のところで見たものと同じです。

ページネーションの情報

アーカイブページのテンプレートでは、ページネーションに関する情報を使うことができます。そのアーカイブページに属する個別ページの一覧が入った pages と、ページネーションの情報 paginator が使えます。

例えば、2021年の記事が300個あったとしましょう。この300個の記事を一覧にして載せると、量が多くて見づらいですね。10個ずつくらいに区切って表示したほうが見やすくなります。

もし10個ずつ区切って表示するなら、pages は、10個の個別ページが入ったリストとなります。通常は、for 文を用いて、各個別ページのタイトル、リンク、サムネイルを表示することになるでしょう。

paginator を使うと、次のような情報を取得できます。

  • paginator.total_pages
    • すべてのページ数。
    • 先ほどの例であれば、30。
  • paginator.pages
    • すべてのページ。
    • 先ほどの例であれば、30ページのアーカイブページのリストになる。
  • paginator.paged
    • 現在ページのページ数。
    • スタートは1から始まり、最後は paginator.total_pages と等しい値。
  • paginator.has_prev, paginator.has_next
    • 前のページがあるかどうか、次のページがあるかどうか。
  • paginator.prev, paginator.next
    • 前のページ、次のページ。
    • ない場合は、None が入る。
  • paginator.first, paginator.last
    • 最初のページと最後のページ。

中には、jinjaloop を使って取得できるものもあります。