Hugo Render hooksでimageとlinkをカスタマイズ

Render Hooks allow custom templates to override markdown rendering functionality

* 本ページはプロモーションが含まれています

Hugoで画像を挿入するには、標準のMarkdownで![Text](Link-URL)を書くと、<img src "~">にレンダリングされますが、ネイティブ Lazy-loadをimgタグに組み込みたいと思ってました。
ちなみに、ネイティブLazy-loadは、

Javascriptを必要とせず、HTMLのloading属性を追加するだけで画像の遅延読み込みを簡単に構成できます

最初は、figureタグやショートカットを利用しないと挿入出来ないと思い、試行錯誤していましたが、調べてみると、HugoのRender hooksを利用すると可能になることを知りました。
Render hooksを詳しく知りたい方は、公式を参照してください。

ネイティブLazy load組込 

  • loading=“lazy’属性を追加
  • decoding=“async"属性を追加

当初、lazyを組み込んだのですが、
decoding="async"loading="lazy"は、併記しても両立しないため、decoding="async"を採用しました。
併記した場合は、lazyが優先されます

Hugo/layouts/_defaults/_markup/render-image.html

{{ $link := string .Destination }}
{{ if hasPrefix $link "http" }}
<img decoding="async" src="{{ .Destination | safeURL }}" alt="{{ .Text }}" {{ with .Title}} title="{{ . }}"{{ end }} />
{{ else }}
<img decoding="async" src="{{ .Page.Permalink }}{{ .Destination | safeURL }}" alt="{{ .Text }}" {{ with .Title}} title="{{ . }}"{{ end }} />
{{ end }}

aリンクカスタマイズ 

  • 外部URLのリンクはtarget="_blank"で別タブで開く
    セキュリティ的に、noreferrer noopener も追加
  • 内部リンクでは別タブを開かない

Hugo/layouts/_defaults/_markup/render-link.html

<a href="{{ .Destination | safeURL }}"{{ with .Title}} title="{{ . }}"{{ end }}{{ if strings.HasPrefix .Destination "http" }} target="_blank" rel="noopener"{{ end }}>{{ .Text | safeHTML }}</a>

Gist 

これらカスタマイズしたものをGistにも明記しておきました