HUGOのscriptタグ内のURLがエスケープされないようにする方法

Hugo で JSON-LD を実装していたのですが、script タグ内の URL がエスケープされ、正常な値が設定されていませんでした。script タグ内の URL がエスケープされないようにする方法をメモします。

““を除外する

出力する値を"“で囲っている場合、それを除外することで、URL がエスケープされずに出力されます。

 1<script type="application/ld+json">
 2  {
 3    "@context": "http://schema.org/",
 4    "@type": "Blog",
 5    "name": "{{ .Site.Title }}",
 6    "creator": {
 7      "@type": "Person",
 8      "name": "{{ .Site.Params.Author }}"
 9    },
10    "image": {{ $logoURL }}, // ←""で囲まない
11    "url": {{ .Site.BaseURL }}, // ←""で囲まない
12    "description": "{{ with .Description }}{{ . }}{{ else }}{{ with .Site.Params.description }}{{ . }}{{ end }}{{ end }}",
13    "license": "https://creativecommons.org/licenses/by-nc-sa/3.0/us/deed.en_US"
14  }
15</script>

注意点

Hugo のウェブサイトを本番環境にビルドする際、--minifyオプションを付与して圧縮するケースがあると思います。

1hugo --gc --minify

その場合、with や if などを直接 JSON-LD の設定値に用いるとエラーが発生し、ビルドに失敗します。

↓ 例: エラーになるパターン

 1<script type="application/ld+json">
 2  {
 3    "@context": "http://schema.org/",
 4    "@type": "Blog",
 5    "name": "{{ .Site.Title }}",
 6    "creator": {
 7      "@type": "Person",
 8      "name": "{{ .Site.Params.Author }}"
 9    },
10    "image": {{ with hogehgoe }}{{ . }}{{ end }}, // ←""で囲まないとエラーになってしまう。
11    "url": {{ .Site.BaseURL }},
12    "description": "{{ with .Description }}{{ . }}{{ else }}{{ with .Site.Params.description }}{{ . }}{{ end }}{{ end }}",
13    "license": "https://creativecommons.org/licenses/by-nc-sa/3.0/us/deed.en_US"
14  }
15</script>

このエラーを回避するには、変数に代入したあとにその変数を JSON-LD に設定します。

参考