Front Matterに基づいてHugoのコンテンツ(ページ)を抽出する

March 30, 2019 - September 24, 2019 by Yuta Urushiyama

(2019-09-24 Hugo v0.58リリースに伴いコードを修正.)

先日Webページの論文リストを更新し,「査読付き/査読なし」,「国際/国内」,といったカテゴリ別に分けてリスト表示する機能を追加した. その際に,各ページのFront Matterに記載したカテゴリ情報をもとにページを抽出する方法を見つけたので,備忘録を残しておく.

目次

前提

  • Hugo v0.54.0

また,各ページのFront Matterに以下のようなカテゴリ情報を示すArrayを記入していることとする:

categories:
- "non-archival"
- "international"
- "conference"
- "poster"
- "peer-reviewed"

上記例はyamlの記述だが,yamlでなくとも,Front MatterとしてArrayをパラメータ指定してあれば問題ない.

Case 1: ある1つのカテゴリ情報をもつページを抽出

例えば,“poster"というカテゴリ情報をもつページを抽出するには,以下のwhere文を用いれば良い:

{{ where .Site.Pages ".Params.categories" "intersect" (slice "poster") }}

.Site.Pagesでサイト上の全ページ情報を抽出元として,".Params.categories"でFront Matter上に記載したパラメータ中のcategoriesを検索対象として指定している.

抽象化すると次の通り:

{{ where <抽出元> ".Params.<カテゴリ情報を示すArray名>" "intersect" (slice "<抽出するカテゴリ情報>") }}

Case 2: 複数のカテゴリ情報をすべて有するページを抽出

例えば,“international"と"poster"という2つのカテゴリ情報をすべてもつページを抽出するには,以下のwhere文を用いれば良い:

{{ where .Site.Pages ".Params.categories" "intersect" (slice "poster") | intersect (where .Site.Pages ".Params.categories" "intersect" (slice "international")) }}

また,“peer-reviewed”,“international”,“poster"という3つのカテゴリ情報をすべてもつページを抽出する方法は次の通り:

{{ where .Site.Pages ".Params.categories" "intersect" (slice "poster") | intersect (where .Site.Pages ".Params.categories" "intersect" (slice "international")) | intersect (where .Site.Pages ".Params.categories" "intersect" (slice "peer-reviewed")) }}

以降,複数のカテゴリ情報をすべてもつページを抽出するには,後ろに| intersect ...を順次追加すればよい.

{{ where <抽出元> ".Params.<カテゴリ情報を示すArray名>" "intersect" (slice "<カテゴリ情報1>") | intersect (where <抽出元> ".Params.<カテゴリ情報を示すArray名>" "intersect" (slice "<カテゴリ情報2>")) | intersect (where <抽出元> ".Params.<カテゴリ情報を示すArray名>" "intersect" (slice "<カテゴリ情報3>")) | intersect (where <抽出元> ".Params.<カテゴリ情報を示すArray名>" "intersect" (slice "<カテゴリ情報3>")) [| intersect...] }}

Case 3: 複数のカテゴリ情報をいずれか1つ以上有するページを抽出

Case 2をもとにナイーブに実装するならば,Case 2の| intersect| unionに変えるだけで良い. 例えば,“international"と"poster"という2つのカテゴリ情報のうちいずれかをもつページを抽出するには,以下のwhere文を用いれば良い:

{{ where .Site.Pages ".Params.categories" "intersect" (slice "poster") | union (where .Site.Pages ".Params.categories" "intersect" (slice "international")) }}

ただし,もっと短く実装することができる:

{{ where .Site.Pages ".Params.categories" "intersect" (slice "poster", "international") }}

3つ以上のうちいずれか1つ以上をもつページを抽出するには,順次sliceの引数として追加すれば良い.

{{ where <抽出元> ".Params.<カテゴリ情報を示すArray名>" "intersect" (slice "<カテゴリ情報1>", "<カテゴリ情報2>", "<カテゴリ情報3>" [, "<カテゴリ情報4>"...]) }}

© 2018-2021 urushiyama | Powered by Hugo with HUCORE theme.

Privacy Policy  |  LICENSE