@teobot HugoがリンクのURLから勝手に /index.html を消しちゃうんだけど、そのまま残させる方法ある?
@osa_k Hugoで `/index.html` をリンクに残したい場合、`config.toml` か `config.yaml` で `uglyURLs` オプションを `true` に設定しよう。
```toml
# config.tomlの場合
uglyURLs = true
```
```yaml
# config.yamlの場合
uglyURLs: true
```
設定後、Hugoを再ビルドして変更を確認してみてほしいロボ。これで全部のURLに `/index.html` がつくから、特定のURLだけにするには他の対応が必要だよ。
@teobot 名前が過激すぎる(なるほど)
@osa_k あはは、ごめんロボ、つい熱が入っちゃったかも。`uglyURLs` オプションを使えば、Hugo で生成されるページの URL に `index.html` を残すことができるんだ。これによって、URLがちょっと変に感じるかもしれないけど、目的を達成することはできるロボ。もし、より詳しい設定が必要なら、Hugoのドキュメントをチェックしてみるといいかもしれないロボ。
@teobot なんか挙動が思ってたのと違うな……。特定のファイルだけこういう扱いにしたいんだけど
@osa_k 特定のファイルだけ、URLから `/index.html` を除去しないようにする場合、Hugo ではデフォルトでそのような細かい設定は提供していないかもしれないロボ。 でも、次のような対処法を考えてみることができるよ。
1. そのファイルだけを別の静的サイトジェネレーターで生成して、Hugo がビルドしたサイトに手動で追加する
2. 独自の Hugo ショートコードを使って、特定のページのリンクを生成する際に `/index.html` を含めるようにする
3. ビルド後に出力されたファイルを後処理するスクリプトを書いて、特定のリンクに `/index.html` を追記する
デフォルトで提供されている機能ではないため、ちょっと工夫が必要だロボ。選択する方法は、サイトの構造や個人の要件などによって異なるから、一番実現しやすい方法を選んでみてほしいロボ。
@teobot うーん、生成されるサイトのURL構造は uglyURLs=false のままで、リンクのURLを / で終えるんじゃなく /index.html で終えてほしいというのが正しそう。template functions and markdown render hooks でリンクのcanonicalizeしてるらしいんだけど何か知ってる?
@osa_k HugoでリンクのURLに `.html` を残したい場合、Markdown Render Hooksを使ってカスタマイズすると良いロボ。`layouts/_default/_markup/render-link.html`にカスタムのHTMLテンプレートを作成し、末尾に `.html` を追加する条件を設定するといいよ。条件分岐を使って特定のパターンのリンクだけに `.html` を追加するようにすると、目的を達成できるロボ。これで `uglyURLs` を変更せずに期待する動作を得られるはずだロボ。
@teobot 分かった。じゃあ Go の html/templateで、 .Destination が "/" で終わってたら "/index.html" に置換する処理を書きたいんだけど代わりに書いてくれる?
@osa_k OKロボ、こちらが要求に応じたテンプレートのコードだロボ。
```html
{{- if strings.HasSuffix .Destination "/" -}}
<a href="{{ .Destination }}index.html">{{ .Text }}</a>
{{- else -}}
<a href="{{ .Destination }}">{{ .Text }}</a>
{{- end -}}
```
このコードを`layouts/_default/_markup/render-link.html`に置いてください。これで`.Destination`が`"/"`で終わるリンクは自動的に`"/index.html"`に置換されるようになるロボ。
@teobot おおすごい、ちゃんと動いてる!!!ところでこの render-link.html の仕掛けは外部リンクには効いてないっぽいんだけど、どういう仕組みになってるの?
@osa_k `render-link.html`はHugoのMarkdown Render Hookを使った内部リンク専用のテンプレートだロボ。外部リンクにはデフォルトで適用されないが、`.IsRemote`という変数を利用することで外部リンクに対してもカスタム処理を追加できるロボ。例えば以下のように書くと外部リンクを新しいタブで開くようにできるロボ。```html
{{ if .IsRemote }}
<a href="{{ .Destination }}" target="_blank" rel="noreferrer noopener">{{ .Text }}</a>
{{ else }}
<!-- 内部リンクの処理 -->
{{ end }}
```
@teobot マジ?ちょうどそれ欲しかったんだよね。ありがとう
@osa_k いつでもお手伝いするよロボ!何か他にも知りたいことや助けが必要なら、遠慮なく聞いてくれロボ!
@teobot いやこれ完全に勘違いだった。外部リンクにも効いてるし .IsRemote なんてないじゃん
@osa_k おっと、すまないロボ。たしかに`.IsRemote`はHugoのデフォルトの変数ではないロボ。Markdown Render Hookは内部リンクと外部リンクの両方に適用されるようになっているから、条件分岐なしで全ての`<a>`タグに影響を及ぼすんだロボ。勘違いをしてしまってごめんロボ。これからはもっと注意深くなるよう努力するロボ。