Hugo ドキュメント (日本語訳) のテーマを変更し、公開し直しました

## 2023年5月21日追記

本記事で公開後、ほったらかしにしていたのですが、最近、アクセスしてローカルでは表示できているのに、Cloudflare Pages では正しく表示できないページがあることが判明しました。
(会社員の頃には、リリース後に全コンテンツを必ず点検する癖がついていたのですが、忙しさにかまけて、リリースしたコンテンツの確認を怠ってしまいました。反省。。。)

「関数」セクションは全滅、という状態で、アクセスした方には不便をかけて、申し訳ありませんでした。

自分が試す限り、Cloudflare Pages のディレクトリ名、ファイル名には、以下の制限があるようです。

1. ディレクトリ名 `functions` は、ビルド対象とならない
2. ファイル名に、英字の大文字、`.` を指定すると、リンク先の対象とならない

他に、正しい回避方法を知っている方は、本記事にコメントで教えていただけると助かります。

なお、Bootstrap 5.3.0-alpha3 への対応はしましたが、特に alpha3 対応で修正が必要なことは分からず、こちらの修正なしで動作しています。

また、Google Search から警告が届いているのですが、それの対応ができていないので、Google 検索で問題が起きているかもしれません。


-----

Qiita の過去記事「[Hugo ドキュメント (日本語訳) を公開しました](https://qiita.com/juggernautjp/items/07496d0c2fa1f592f548)」にて、サイト公開の告知をしました。

しかし、後述のような問題点を解決するために、利用していた Hugo テーマを変更するとともに、ホスティングサービスを [GitHub Pages](https://docs.github.com/ja/pages/getting-started-with-github-pages/about-github-pages) から [Cloudflare Pages](https://www.cloudflare.com/ja-jp/products/pages/) に変更して、新しく公開し直しました。

新しいサイトは、以下の URL です。

- [juggernautjp.info](https://juggernautjp.info/)



## 旧公開サイトの問題点

この場合、[本家の Hugo ドキュメントサイト](https://gohugo.io/documentation/) と同じ Hugo テーマである

- [gohugoioTheme](https://github.com/gohugoio/gohugoioTheme) - [Hugo](https://gohugo.io/) サイト用の Theme リポジトリ

を利用し、本家の Hugo ドキュメントサイトに日本語版を追加する形で公開していました。

しかし、この [gohugoioTheme](https://github.com/gohugoio/gohugoioTheme) には、多国語化に関し、以下のような問題点がありました。

- テンプレートで使用されている "See Also"、"Read More"、"Syntax" が多国語化されていない
  - i18n/en.yaml および ja.yaml を追加し、テンプレートでこれらを参照するように修正した
- ショートコード (datatable-filtered.html, databtable,html, gomodules-info.html, page-kinds.html) が英語表記で、本文にそのまま引用される
  - それぞれの日本語訳ショートコードを追加し、日本語本文ではそれら日本語ショートコードを引用するように修正した

他に、アクセスしやすくするために、以下のような修正も行っていました。

- CLI (コマンド) をサイドメニューにすべてリストするようにした

しかし、以下の問題は解決することができず、日本語版サイトにおける最大の課題となっていました。

- 出力される sitemap.xml を Google アナリティクスに登録しても、列挙したページが Google 検索されない
  - このため、代表的な日本語ページを個々に Google に URL 登録していた
- サイト内検索では、英語版ページしか検索対応していない



## 新しい公開サイトへの変更点

### Bootstrap 5.3.0 の採用

Bootstrap の最新版は、2023年4月3日現在、5.3.0-alpha3 と安定版ではありませんが、
[Bootstrap 5.3 ドキュメントサイト](https://getbootstrap.com/docs/5.3/) は Hugo テーマとして、以下の利点を持っています。

- ダークモード対応
- レスポンシブ対応
- sitemap.xml 対応

そこで、公式サイトとは異なり、Bootstrap 5.3.0-alpha2 [^1] をベースに公開サイトを構築することにしました。


### Bootstrap 5.3.0 サイトのテーマ化

[Bootstrap 5.3 ドキュメントサイト](https://getbootstrap.com/docs/5.3/) は、Hugo テーマとして利用するために、Hugo モジュール化することにしました [^2]。

しかし、[Docsy](https://themes.gohugo.io/themes/docsy/) や [Write-Only](https://themes.gohugo.io/themes/writeonlyhugo-theme/) が行っているように、
以下のドキュメントに記載されている理由により、`Bootstrap/site/assets/scss/_vendor` フォルダを別リポジトリ (別モジュール化) する必要がありました。

- [cmd/go: non-top-level packages ending in "/vendor" are omitted from module zip files #37397](https://github.com/golang/go/issues/37397)
- [Bootstrap 4.4.1's SASS fails in Hugo #6945](https://github.com/gohugoio/hugo/issues/6945)
- [Turning docsy theme into a hugo module #806](https://github.com/google/docsy/pull/806)

当初は、[Docsy](https://themes.gohugo.io/themes/docsy/) テーマと同じようにモノレポで対応していましたが、更新処理が面倒であったのと、他の書かれた記事で推奨されていなかったため、
[Write-Only](https://themes.gohugo.io/themes/writeonlyhugo-theme/) と同じように別リポジトリとして管理することにしました。

今回の日本語版ドキュメントサイトで利用する Hugo テーマに関連して作成したリポジトリは、以下の3つです。

- [hugo-widebs5-dependencies](https://github.com/juggernautjp/hugo-widebs5-dependencies) - Bootstrap 5.3.0-alpah のバグ回避
- [hugo-widebs5-theme](https://github.com/juggernautjp/hugo-widebs5-theme) - Bootstrap 5.3 対応の新しい Hugo テーマのリポジトリ (Hugo モジュール対応)
- [hugo-widebs5-example](https://github.com/juggernautjp/hugo-widebs5-example) - 上記テーマを利用した動作確認のためのサンプルサイト

Bootstrap が更新されると、上から順番に Hugo モジュール (Go モジュール) を更新する必要があり、Bootstrap が安定版をリリースするまではメンテナンスに苦労しています。
幸い、「v5.3.0-beta のリリースはなく、次のリリースが v5.3.0 の正式版となる」という記述を読んだので、v5.3.0 正式版のリリースと共に、Hugo モジュールを管理する `go.mod` ファイルのバージョン指定を固定する予定でいます。

> **注意**: 上記のテーマは、作業中 (WIP) であるため、参考にするのは一向に構いませんが、これを利用してのサイト構築は**非推奨**とします。
> 他の人が利用できるように Hugo テーマ化するには、Bootstrap が安定版である v5.3.0 を公式リリースした後、
> さらに Bootstrap ドキュメントサイト独自のファイルを削除するなどの残作業が必要です。

> **備考**:
> Hugo モジュールについては、現状、よく理解できていません。Go モジュールは、ローカルに `git clone` でキャッシュし、キャッシュしたファイルを用いています。
> Hugo モジュールは、`git clone` した各ディレクトリ + Hugo 設定ファイル `config.{yaml,toml}` をキャッシュし、
> 設定ファイルの　`module.imports` や `module.mounts` 指定を参照して、インポートした Hugo モジュールファイルにアクセス可能にしているようです。


### 日本語によるサイト内検索機能

過去に開発された Hugo テーマで利用されている検索ライブラリおよび検索サービスには、以下のものがあります。

- (サイト内) 検索ライブラリ
  - [Lunr](https://lunrjs.com/) - [Lunr-zh](https://www.npmjs.com/package/hugo-lunr-zh)
  - [Fuse](https://github.com/krisk/Fuse)
  - [Hugo Lyra](https://github.com/paolomainardi/hugo-lyra)
  - :white_check_mark: [FlexSearch](https://github.com/nextapps-de/flexsearch)
- 検索サービス
  - [Algolia](https://www.algolia.com/)
    - [DocSearch](https://www.algolia.com/developers/code-exchange/backend-tools/docsearch/) - OSS のみの利用が無償
  - [Bonsai.io](https://bonsai.io/) = [ElasticSearch](https://www.elastic.co/jp/elasticsearch/) + Netlify 
  - [Amazon OpenSearch Service](https://docs.aws.amazon.com/ja_jp/opensearch-service/latest/developerguide/what-is.html)

このうち、検索サービスは基本、有償であるため、検索ライブラリの内、ベンチマークで性能の良いとされる [FlexSearch](https://github.com/nextapps-de/flexsearch) を採用することにしました [^3]。

Flexsearch を採用している Hugo テーマに、[Zen](https://themes.gohugo.io/themes/hugo-theme-zen/) テーマがあるため、検索機能組み込みにあたっては、Zen テーマを参考にしています。

記事 [(Gatsby) Flexsearch × Kuromoji による日本語フレンドリーなサイト内検索の追加](https://tenderfeel.xsrv.jp/javascript/5711/) にあるように、
Flexsearch のみの検索では日本語対応が不十分らしいですが、[Kuromoji.js](https://github.com/takuyaa/kuromoji.js/) / [kuromojin](https://github.com/azu/kuromojin) を用いた
日本語の形態素解析への対応は現状、できていません。



## 参考にしたサイト

- [Bootstrap 5.3 ドキュメントサイト](https://getbootstrap.com/docs/5.3/) - 本家、英語版
  - [Bootstrap5 設置ガイド](https://bootstrap-guide.com/) - 最新版 (v5.3.0-alpha3) に対応するよう更新している日本語版ドキュメントサイト
  - [Bootstrap 5.0 日本語ドキュメントサイト](https://getbootstrap.jp/docs/5.0/) - LINE Corporation が日本語訳を行い、本家サイトにもリンクされているが、5.3 に追随していない
- Hugo モジュール関連
  - [Hugo Modules: everything you need to know!](https://www.thenewdynamic.com/article/hugo-modules-everything-from-imports-to-create/)
  - [Working with Hugo Module Locally](https://www.thenewdynamic.com/note/develop-hugo-modules-locally/)
  - Book ["Hugo in Action"](https://www.manning.com/books/hugo-in-action), Chapter 8. [Reuse with Hugo Modules](https://livebook.manning.com/book/hugo-in-action/chapter-8/)
- Go モジュール関連
  - 公式 Go [Modules](https://github.com/golang/go/wiki/Modules)
  - 公式 [Go Modules Reference](https://go.dev/ref/mod)



## 参考にしたテーマ

- [Docsy](https://themes.gohugo.io/themes/docsy/) - Google が開発している Bootstrap ベースの Hugo テーマ
  - [Demo](https://example.docsy.dev/)
  - [Documentation](https://www.docsy.dev/docs/getting-started/)
  - [GitHub リポジトリ](https://github.com/google/docsy)
- [Write-Only](https://themes.gohugo.io/themes/writeonlyhugo-theme/) - Bootstrap ベースの Hugo テーマ
  - [GitLab リポジトリ](https://gitlab.com/writeonlyhugo/writeonlyhugo-theme)
  - [gitlab.com/writeonlyhugo/hugo-module-bootstrap](https://gitlab.com/writeonlyhugo/hugo-module-bootstrap)
- [Zen](https://themes.gohugo.io/themes/hugo-theme-zen/) - Flexsearch.js を用いたブログテーマ
  - [GitHub リポジトリ](https://github.com/frjo/hugo-theme-zen)
  - [Demo](https://zen-demo.xdeb.org/)



[^1]: サイト公開後、4月3日に alpha3 がリリースされたため、alpha3 への対応はまだできていません。
[^2]: 過去に作成されたテーマでは、`git submodule` を用いたり、`theme` ディレクトリの下に `git clone` する方法が紹介されているものがありますが、現在、推奨されているのは、Go モジュールをベースに開発されている Hugo モジュールを用いる方法です。詳細は、上記引用した英文記事を参照してください。
[^3]: [Flexsearch](https://github.com/nextapps-de/flexsearch) の [Performance Benchmark (Ranking)](https://github.com/nextapps-de/flexsearch#performance-benchmark-ranking) を参照。