Pelican から Hugo への移行検討
hugoのインストール
https://github.com/gohugoio/hugo/releases から最新のファイルをダウンロード。
C:\dev\bin
に hugo.exe
を設置。
試しにサイトを作ってみる。
|
|
Theme(hugo-theme-stack)のインストール
今回は見た目で https://themes.gohugo.io/themes/hugo-theme-stack/ が気に入ったので、これが使えないか検討していきます。
Pelicanで使っているFlexテーマとも似てますしね。
|
|
補足
テーマのインストールには hugo mod
が利用できると便利です。
このコマンドはGo Modulesに依存しているので、利用したい場合はGoをインストールしておきます。
以下はWindowsでGo 1.18をインストールするコマンド例。
|
|
Themeの適用
次に、基本ページのファイルをテーマのサンプルディレクトリからコピーします。
|
|
元から置いてあった config.toml
は削除します。
(将来的にはconfig.tomlに移行するようなので、v4のリリースを待ちましょう)
Hugoの起動
hugo serve
コマンドで起動して、サンプルページを確認してみます。
|
|
使用するテーマにもよりますが、今回のように hugo-theme-stack
と hugo_0.105.0_windows-amd64.zip の組み合わせで使用した場合、以下のエラーが出る場合があります。
|
|
https://themes.gohugo.io/themes/hugo-theme-stack/ を使用する場合は、代わりに hugo_extended_0.105.0_windows-amd64.zip を使用しましょう。
記事の追加
起動が確認出来たら、記事を追加してみます。
hugoでは、記事を追加するコマンドと、それに対応したテンプレートが適用される便利な機能があります。
まずは共通テンプレートとして archetypes/default.md
を編集します。
archetypes/default.md
自体は hugo new site
した際に、自動生成されています。
|
|
記事を追加する場合は hugo new post/article_name.md
のように実行します。
hugo-theme-stack では 記事と画像をセットにしたディレクトリで管理する ことを推奨しています。
ディレクトリの整理を簡単にするために hugo new post/$(date +%Y-%m-%d)_migrate_blog_pelican_to_hugo/index.md
のようなコマンドをaliasに登録しておくと良いでしょう。
デプロイ
hugo
コマンドを実行すると public
というディレクトリにHTMLが生成されるようです。
これをWebサーバーに置くだけ。
Hugo標準で問題なさそうなもの
Sitemap対応
どうやら Hugoデフォルトで対応 しているようです。
以下のように書くと /sitemap.xml が一覧を返してくれるようになります。
|
|
RSS対応
特に何もしなくても /index.xml
がRSSになりそうです。
Vivaldiで登録してみたところ、ひとまず読めたのでそのままにしました。
hugo-theme-stackの機能確認
Profileの画像
assets/img/profile.jpg
みたいに設置して、以下のように書けば良いみたいです。
|
|
Profile下のアイコン
menu.social
を書くと、よくあるリンクが並びます。
name
のアルファベット順に左から並ぶようだったので01_
のようなプレフィックスを付けていますnewTab: false
とすると同じタブで開くリンクになりますicon:
に書けるのがデフォルトだと hugo-theme-stack の準備したアイコン用SVGだけみたいなので、メールアイコンは https://feathericons.com から拝借してassets/icons/
に置きました。
|
|
検索機能
インクリメンタルサーチ機能が搭載されています。中々処理が速くて良い感触でした。
Pelicanのtique_searchでは日本語の検索が上手くいかなくなっていたので、移行とセットで解決出来そうです。
フォントの問題
中国向けフォントがデフォルトで使用されるので assets/scss/custom.scss
を以下のように作成しました。
|
|
Hugoがサイトをbuildすると、rootディレクトリとTheme内のディレクトリは統合されます。 そのためrootディレクトリに、Theme内と同じディレクトリ名でファイルを追加するとThemeのファイルに影響を与えずに読み込めるようになります。
https://aakira.app/blog/2018/08/share/
なるほどーーー、それならテーマに直接手を加えなくて良さそうです。
404ページ
hugo-theme-stack は割ときれいな404ページが出ます。
記事下部に関連ページを表示
hugo-theme-stack にデフォルトて搭載されています。
カテゴリはいまいち役立っていないので削除して、タグで主たる関連を出すようにします。dateは並び順を調整するのに入れているくらいです。
|
|
Pelicanからの記事の移行
Markdownで書いてあるものについては、一部修正するだけで移行できそうです。
問題はreStructuredTextで書かれたもの…
記事と画像をセットにしたディレクトリで管理する方式が今までと違うので、ファイルの移動は少し骨が折れそうですが…
PelicanもHugoもslugが使えるので、一貫性のあるURLを作ってあればリダイレクトできそうなところは助かります。
Wordpressの頃の検索やタグリンクも、一応リダイレクトできそうです。
hugo-theme-stackに足りないもの
Admonition対応
所謂、以下のように書くやつのことです。
|
|
HugoのMarkdownではどうもこの記法が無いようです。
https://gohugo.io/contribute/documentation/#admonitions によると、shortcodesを追加すると独自の記法で対応できるらしいです。
hugo-theme-stackの場合は、以下で対応できました。
assets/scss/custom.scss
にAdmonition SCSSを書くlayouts/shortcodes
にAdmonition HTMLを書く
中身は https://github.com/dillonzq/LoveIt のコードを参考にしました。
アイコン表示に関してはFont Awesomeを使用するので、以下の対応を追加しました。
- Font Awesome v6のCSSを
static/fontawesome6/css/all.min.css
に格納 - Font Awesome v6のWebfontsを
static/fontawesome6/webfonts/fa-brands-400.woff2
に格納 - Font Awesome v6のWebfontsを
static/fontawesome6/webfonts/fa-solid-900.woff2
に格納 layouts/partials/head/custom.html
を作成して<link rel="stylesheet" href="{{ .Site.BaseURL }}fontawesome6/css/all.min.css">
とだけ記載
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.2/css/all.min.css">
と書くだけでも良いです。ただ、対応したのは良いのですが、一般的なMarkdownの記法からは外れてしまうので積極的には使わないだろうなと思います。
そう考えるとfont-awesomeみたいな重たいファイルをロードするのも考え直した方が良いかもしれませんね。
Admonitionお試し
通常時のコードハイライト
|
|
A note banner
日本語文章だとこうなります。
Admonition内部のコードハイライトは微調整した方が良いかもしれません。
|
|
記事の共有ボタン
無いので自分で足します。
hugo-theme-stack では以下のように設定を書くと layouts/partials/widget/{{ type }}.html
なwidgetを読み込んでくれます。
|
|
そして layouts/partials/widget/sharebutton.html
を追加します。
|
|
assets/scss/custom.scss
には以下のように追加しました。
|
|
これで、個別の記事を表示しているときは右サイドバーの上部にシェアボタンが表示されます。
CSS/LESSをSCSSに変換した時に使ったサイト:
- https://css2sass.herokuapp.com: CSS to SCSS converter
- https://less2scss.awk5.com: LESS to SCSS converter
外部リンクに対する target="_blank"
の調整
外部サイトのリンクの場合は新しいタブで開く動作をデフォルトにしておきたいところです。
元々 hugo-theme-stack には http
から始まるリンクを新しいタブで開くようになっているのですが、追加で以下の条件の場合も target="_blank" rel="noopener"
を付与するようにします。
- リンク先アドレスが
BaseURL
で始まらない(≒自サイトは絶対URLで書いても新しいタブで開いて欲しくない)
以下のような layouts\_default\_markup\render-link.html
を作成します。
|
|
お試し:
|
|
.Page.Site.BaseURL
はconfig.yamlのbaseurlを参照しているわけではないらしく、ローカルで動かした時は http://localhost:1313
になっていました。
canonifyurls
を設定するという方法もあるらしいのですが、今回はテーマ側が render-link.html
を持っていたため、これを上書きする方法で解消しました。
PlantUMLの代替(Mermaid)
Pelican(Flex)時代はPlantUMLを使ってシーケンス図を表示するようにしていたので、Hugoでの方法を探してみます。
hugo-theme-stack Issue#220 でも話題になっていましたが、公式ドキュメント CONTENT MANAGEMENT - Diagrams に方法が書かれていました。
scriptのロードは layouts/partials/footer/custom.html
に記載しました。
こう書くと
|
|
こうなります。
prevail! John-->>Alice: Great! John->>Bob: How about you? Bob-->>John: Jolly good!
[許容] 記事中のToC
記事の上部に目次を出して記事の横幅を広く取りたかったんだけど、右サイドバーに出る目次一覧しか無いらしい。
まぁそれで良いか。という気分になったので許容しました。
[廃止] Matomo(Piwik)対応
自前のアクセス解析サーバー(Matomo)を立てているので、この対応もしようと思ったのですが、
思い返すとMatomoは運用が面倒な割に特段得るものも無いので、この機会に自前のMatomo(Piwik)を捨てることにしました。
なんたる怠惰。
終わり
Go言語で作られているだけあって、WindowsでHugoを使うのは想像以上にハードルが低くて助かりました。
テーマの周辺もある程度は折り合いが付きそうなので記事を書くだけなら問題なさそうです。
ついでにPelicanで抱えていら日本語の検索周りの問題とか、ビルドが遅い問題とか、その他諸々も解決できそうです。
ReSTで書かれたやつをどうするのかは…未来の自分が何とかするとして。
あとは、サーバーにデプロイするための準備をするということで、この話はひとまずここまで。
参考文献
- https://maku77.github.io/hugo/basic/create-site.html
- https://miiitomi.github.io/p/hugo/
- https://kasu-kasu.ga/post/add-share-button-to-hugo/
- https://blog.johtani.info/blog/2020/01/24/setting-hugo/
- https://stack.jimmycai.com/guide/getting-started
- https://themes.gohugo.io/themes/hugo-theme-stack/
- https://blog.zhixuan.dev/posts/ac760353/
- https://github.com/dillonzq/LoveIt/blob/master/layouts/shortcodes/admonition.html