内部リンクの入れ方も色々とありますが、個人的に一番しっくり来ているものを紹介します。
カスタマイズ性が高いので、ショートコードがおすすめです。
Hugoで画像を入れるにはショートコードを使う
Hugo自体にも相対リンクを貼る機能があるのですが、個人的にこちらのほうが使いやすいかなって。
前提として、Hugoはローカル環境、ビルド時でそれぞれURLが変わります。
ローカルとビルド環境それぞれで画像を表示させるには、ショートコードを作成するのが効率的です
ショートコードを作成する
ショートコードフォルダにショートコードのHTMLを作成します。
├─archetypes ├─content ├─data ├─layouts │ └─shortcodes←このフォルダに作成 │ └─a.html ├─public
今回は「a.html」としました。
Hugoのショートコードは知ってのとおり、ファイル名を利用して呼び出します。
こうしておくと、VSCodeでHTMLタグと認識されて、色が着くので、非常に可読性が良くなるんです!
a.htmlの中身はこうです。
blog\layouts\shortcodes\a.html
<a {{ with .Get "href" }}href="{{ . | absURL }}" {{ end }} {{ with .Get "target" }}target="{{ . }}" {{ end }} {{ with .Get "rel" }}rel="{{ . }}" {{ end }} > {{ .Inner }} </a>
意味はショートコード上で“href”
があったら「絶対参照のURLにして」href=“この中に”
入れろってことです。
with
で条件式を書くと判定文に使った変数を{{ . }}
で描けるので、可読性が少し上がります。
なかったら、何も起こらないので安心ですよ。
内部リンクでも、本筋から外れるようなリンクは、別ウィンドウで開くものだと思っているので、
target
属性も追加です。
relは内部リンクならいらない気もしますが、とりあえず追加。
{{ .Inner }}
はショートコードで挟んだ中身を使用する変数です。
使い方は次の次を参照!
リンク先の構成
Hugoの記事の作成途中では以下のフォルダに入っています。
フォルダ構成
├─content
│ └─post ←投稿ページ入れる所
│ └─static-site-generator-writing.md ←記事。カテゴリやトップに分裂する
そして「hugo」や「hugo server」をしてサイト状態にするとこうなります
ビルド時
│──post │ └─static-site-generator-writing ←URLがフォルダ階層となる │ └─index.html
ここを意識してリンク先を指定します。
使用方法
使用方法はこんな感じですね。
{{<a href="/post/static-site-generator-writing" target="_blank">}}アンカーリンク{{</a>}}
「absURL」の変換で絶対パスにしています。
Hugoのローカル環境(テスト環境)とビルド(本番環境)に対応するにはこれが良いんじゃないかと。
「absURL」と書くことで、どちらにも対応できます
環境 | 画像のパス |
---|---|
ローカル環境 | src="http://localhost:1313/post/static-site-generator-writing/" |
ビルド | src="http://設定したドメイン/post/static-site-generator-writing/" |
これで、それぞれのビルド後のパスに変換できます。
フォルダ階層が変わることが一番むずかしいです。
アレンジ例
ショートコードを色々といじることで、ブログカード風にすることもできます。
ブログカード風内部リンク
hrefで囲んだURLからページを読み込んで、設定してあるアイキャッチ画像へのパスやタイトル、サマリーを取得しています。
{{ $href := .Get "href"}} {{ $target := .Get "target" | default "_self" }} <div class="box"> <div class="media"> {{ with .Site.GetPage $href }} <figure class="media-left"> <amp-img class="image is-128x128" src="{{ .Params.cover }}" width="16" height="9" layout="responsive"> </amp-img> </figure> <div class="media-content"> <a class="content kadlu-color4" href="{{ $href }}" target="{{ $target }}"> <p> <span class="bold">{{ .Title }}</span> </p> <p> {{ if .Params.Description }} {{ .Params.Description }} {{ end }} </p> </a> </div> {{ end }} </div> </div>
簡単に解説
{{ with .Site.GetPage $href }}
でhrefに指定されたURLからページを読み込み、
それぞれ{{ .Params.cover }}
(画像)や{{ .Title }}
(タイトル)を読み込んできます。
使用方法はこんなんですかね。
{{<a href="/post/static-site-generator-writing">}}