Skip to main content

データテンプレート

Hugo の組み込み変数に加えて、ローカルとダイナミック両方のソースから取得する、テンプレートやショートコードで独自のカスタムデータを指定できます。

Hugo は、Hugo プロジェクトのルートにある data ディレクトリにある YAML、JSON、XML、TOML ファイルからデータを読み込むことをサポートしています。

データフォルダー

data フォルダには、Hugo がサイトを生成する際に使用する追加データを保存しておく必要があります。

データファイルは独立したページを生成するためのものではありません。 データファイルは、以下のような方法でコンテンツファイルを補完する必要があります。

  • フロントマター・フィールドが制御不能になったときにコンテンツを拡張する。
  • テンプレートでより大きなデータセットを表示する (下の例を参照)。

どちらの場合も、(独自の) ファイル内のデータをアウトソースすることをお勧めします。

これらのファイルは、YAML、JSON、XML、または TOML ファイル (拡張子は .yml.yaml.json.xml.toml) である必要があります。データは .Site.Data 変数内の map としてアクセスできます。

.site.Data.filename 表記を使用してデータにアクセスする場合、ファイル名はアンダースコアまたは Unicode 文字で始まり、その後に 0 個以上のアンダースコア、Unicode 文字、または Unicode 数字が続く必要があります。 たとえば、以下のようになります。

  • 123.json - 無効
  • x123.json - 有効
  • _123.json - 有効

index 関数を使用してデータにアクセスする場合、ファイル名は関係ありません。 たとえば、以下のようになります。

データファイル テンプレート コード
123.json {{ index .Site.Data "123" }}
x123.json {{ index .Site.Data "x123" }}
_123.json {{ index .Site.Data "_123" }}
x-123.json {{ index .Site.Data "x-123" }}

テーマ内のデータファイル

データファイルは [Hugo テーマ][themes] でも使用できます。

ただし、テーマ データファイルはプロジェクト ディレクトリに優先してマージされることに注意してください。 つまり、同じ名前と相対パスを持つ 2 つのファイルがある場合、ルートプロジェクトの data ディレクトリにあるファイルのデータが、themes/<THEME>/data ディレクトリにあるファイルのデータよりも優先されます。

したがって、テーマの作成者は、ユーザーが テーマをカスタマイズする と決めたときに、簡単に上書きされてしまうようなデータファイルを含まないように注意する必要があります。オーバーライドされて困るテーマ固有のデータ項目については、フォルダー構造のプレフィックスに名前空間を付けるのが賢明です。たとえば mytheme/data/<THEME>/somekey/... といった具合です。このような重複があるかどうかを調べるには、-v フラグを付けて hugo を実行します。

データファイルからデータテンプレートを使って作成したマップ内のキーは、ファイル中の pathfilenamekey (該当する場合) のドット連結したセットになります。

これは、例を挙げて説明するのが一番わかりやすいです。

例: Jaco Pastorius のソロ ディスコグラフィー

Jaco Pastorius  は素晴らしいベーシストでしたが、彼のソロディスコグラフィーは例として挙げるには短いものです。 John Patitucci  もベースの巨人です。

以下の例は少し不自然ですが、データファイルの柔軟性を示しています。 この例では、ファイル形式として TOML を使用し、以下の 2 つのデータファイルを使用します。

  • data/jazz/bass/jacopastorius.toml
  • data/jazz/bass/johnpatitucci.toml

jacopastorius.toml には以下の内容が含まれています。 johnpatitucci.toml にも同様のリストが含まれています。

ベーシストのリストは .Site.Data.jazz.bass でアクセスでき、単一のベーシストはファイル名をサフィックスなしで (たとえば、.Site.Data.jazz.bass.jacopastorius) 追加します。

以下のテンプレート内で、すべてのベーシストの録音リストをレンダリングできるようになりました。

{{ range $.Site.Data.jazz.bass }}
   {{ partial "artist.html" . }}
{{ end }}

そして、partials/artist.html の中に、以下のコードがあるとします。

<ul>
{{ range .discography }}
  <li>{{ . }}</li>
{{ end }}
</ul>

新しいお気に入りのベーシストを発見しましたか? 同じディレクトリに別の .toml ファイルを追加するだけです。

例: データファイルの名前付き値にアクセスする

data/ に直接置かれている User0123.[yml|toml|xml|json] データファイルに、以下のデータ構造があると仮定します。

以下のコードを使用して、レイアウトに Short Description をレンダリングできます。

<div>Short Description of {{ .Site.Data.User0123.Name }}: <p>{{ index .Site.Data.User0123 "Short Description" | markdownify }}</p></div>

markdownify テンプレート関数 を使用していることに注意してください。これは Markdown レンダリングエンジンを通して説明を送信します。

リモートデータを取得する

リモートデータを取得するには、以下のように getJSON または getCSV を使用します。

{{ $dataJ := getJSON "url" }}
{{ $dataC := getCSV "separator" "url" }}

URL にプレフィックスまたはポストフィックスを使用した場合、関数は 可変長引数  を受け付けます。

{{ $dataJ := getJSON "url prefix" "arg1" "arg2" "arg n" }}
{{ $dataC := getCSV  "separator" "url prefix" "arg1" "arg2" "arg n" }}

getCSV のセパレーターは最初の位置に配置する必要があり、1 文字の長さにする必要があります。

渡されたすべての引数は、以下のように、最終的な URL に結合されます。

{{ $urlPre := "https://api.github.com" }}
{{ $gistJ := getJSON $urlPre "/users/GITHUB_USERNAME/gists" }}

上記は、内部的には以下のように解決されます。

{{ $gistJ := getJSON "https://api.github.com/users/GITHUB_USERNAME/gists" }}

HTTP ヘッダーを追加する

getJSONgetCSV のどちらも、最後の引数としてオプションのマップを受け取ります。たとえば、以下のようになります。

{{ $data := getJSON "https://example.org/api" (dict "Authorization" "Bearer abcd") }}

同じヘッダーキーに複数の値が必要な場合は、以下のようにスライスを使用します。

{{ $data := getJSON "https://example.org/api" (dict "X-List" (slice "a" "b" "c")) }}

CSV ファイルの例

getCSV の場合、最初の位置に 1 文字長のセパレーターを配置し、その後に URL を配置する必要があります。 以下は、公開された CSV から パーシャル で HTML テーブルを作成する例です。

layouts/partials/get-csv.html
  <table>
    <thead>
      <tr>
      <th>Name</th>
      <th>Position</th>
      <th>Salary</th>
      </tr>
    </thead>
    <tbody>
    {{ $url := "https://example.com/finance/employee-salaries.csv" }}
    {{ $sep := "," }}
    {{ range $i, $r := getCSV $sep $url }}
      <tr>
        <td>{{ index $r 0 }}</td>
        <td>{{ index $r 1 }}</td>
        <td>{{ index $r 2 }}</td>
      </tr>
    {{ end }}
    </tbody>
  </table>

現在の行から n 番目の列を出力するには、式 {{ index $r number }} を使用する必要があります。

キャッシュ URL

ダウンロードされた各 URL は、デフォルトフォルダー $TMPDIR/hugo_cache_$USER/ にキャッシュされます。 変数 $TMPDIR は、システム依存の一時ディレクトリに解決されます。

コマンドラインフラグ --cacheDir を使用すると、システム上の任意のフォルダをキャッシュ ディレクトリとして指定することができます。

また、メイン設定ファイルcacheDir を設定することができます。

キャッシュがまったく気に入らない場合は、コマンドラインフラグ --ignoreCache を使用してキャッシュを完全に無効にできます。

REST URL 使用時の認証

現状では、URL に入れることができる認証方法のみ使用可能です。 OAuth  などの認証方式は実装されていません。

ローカルファイルをロードする

getJSONgetCSV でローカルファイルをロードするには、ソースファイルが Hugo の作業ディレクトリ内に存在する必要があります。ファイルの拡張子は関係ありませんが、コンテンツは重要です。

上記の 「リモートデータを取得する」 と同じ出力ロジックを適用します。

getCSV を使用してロードされるローカル CSV ファイルは、data ディレクトリの に配置する必要があります。

データファイルを使用した LiveReload

URL のコンテンツが変更されたときに LiveReload をトリガーする機会はありません。しかし、ローカル ファイル (すなわち、data/*themes/<THEME>/data/*) が変更されると、LiveReload がトリガーされることになります。シンボリックリンクはサポートされていません。また、データのダウンロードには時間がかかるため、Hugo はデータのダウンロードが完了するまで Markdown ファイルの処理を停止することにも注意してください。

データ駆動型コンテンツの例

データフォーマットの仕様