Hugoでサイトをカスタマイズしながら、Notionで記事の管理ができる
Notionはスマホから使えるので、寝転びながらブログが書ける
以下のリポジトリを使うのが良さそう
みなさん、ブログ書いてますか。
自分は最近以下の記事に影響を受けて、久々にブログを再開しました。
https://qiita.com/HiromuMasuda0228/items/a71dea7ef4d77a30b118
ブログを書く場合、色々と選択肢はあると思います。
自分が思いつく範囲だと以下が有力です。
自分も色々試してきましたが、
という利点から、静的サイトジェネレータであるHUGOを利用していました。
さて、エンジニアの皆さん、こんなふうに思ったことはないですか?
自分はめっちゃあります笑
この問題を
を組み合わせることで解決できないかと、方法を模索したのが本記事になります。
Notion Hugo
で検索すると、以下のリポジトリが出てくるので利用させていただきました。
https://github.com/HEIGE-PCloud/Notion-Hugo
これは、以下のことを行ってくれるリポジトリになっています。
このリポジトリの「Get Started」の手順を進めることで、Github Pages上でサイトを公開できます。
私のサイトの最終的な設定がどうなったかは、以下のgithubを見ていただければと思います。
https://github.com/hakomori64/hakomori64.github.io
基本的な手順は「Get Started」に沿って進めていただければいいので省略します。本記事では、
などをQ&A形式で説明していきます。
「Get Started」で以下のようなNotionのページを複製して自分のNotionのワークスペースに持ってきたと思います。
上の画像であれば、以下のようにページが構成されます。
つまり、インテグレーションに共有したページの
が、サイトからアクセスできる形になります。
新規で投稿を作成する場合は、Postsデータベースに投稿を追加していくか、ページ直下に子ページを追加していくことになります。
次に、実際に投稿をどのように作っていくかを説明します。
例えば、本記事は以下のようなページを作成することで公開しています。
データベースの「新規」ボタンから、このページを作成しました。
いろいろなプロパティが設定されていますが、これがHUGOのフロントマターに変換されます。フロントマターはページのメタ情報を設定する項目になります。
https://gohugo.io/content-management/front-matter/
例えば上の例だと、以下のような設定になってます。
また「プロパティを追加」するから、自分の好きなようにフロントマターを追加できます。
omit_header_text
プロパティは私が勝手に追加した項目です。
あとは自由に記事を書いていき、書き終わったらdraftプロパティのチェックを外します。
このリポジトリはNotionの要素のマークダウンへの変換に以下のライブラリを使っています。
https://github.com/HEIGE-PCloud/Notion-To-Markdown
2023/1/1時点で以下の要素に対応しているみたいです。
「Get Started」でテンプレートのリポジトリを複製してきたと思いますが、このリポジトリにはGithub Actionsの設定がされています。
https://github.com/HEIGE-PCloud/Notion-Hugo/blob/main/.github/workflows/cd.yml
mainにプッシュするか、1時間経過がトリガーとなってビルド&デプロイが実行されます。
トリガーが発生する
Notionからページを取得してマークダウンに変換する
以下が実行される
https://github.com/HEIGE-PCloud/Notion-Hugo/blob/main/src/index.ts
hugoコマンドでサイトをビルドする
github pagesにデプロイする
このような流れになっています。
「Get Started」の設定に加えて、リポジトリのSettings → Pages → Build and Deploymentで以下のように設定する必要があります。
「Get Started」にNotionのページをインテグレーションに共有するように書いている箇所があります。(以下の画像のような感じ)
2023/1/1時点で、この操作ができなくなっています。
インテグレーションにページを共有するには、
という手順になります。
以下のような表示になれば、コネクトが正常に追加されています。
Notionのテンプレートの「Markdown」という記事で、Notionの各ブロックがどんな感じで表示されているのかが確認できますが、Video要素やAudio要素が以下のようになってると思います。
これをサイト内でプレビューするためには少し工夫が必要です。
src/render.ts
にrenderPage
という関数があり、これに手を加えて以下のようにします。
renderPageはNotionのページをMarkdown文字列に変換する関数です。
具体的に変更を加えたのは以下の箇所です。
|
|
このn2m
というオブジェクトがNotionのブロックのマークダウンへの変換を担っています。
このオブジェクトのsetCustomTransformerというメソッドを呼び出すことで、ブロックをどのように変換するかを指定することができます。video要素をvideoタグに、audio要素をaudioタグに変換しているのがなんとなく伝わるかなと思います。styleの指定などはここをいじれば良いです。
Notionのページには以下のようにカバー画像が設定できます。(宇宙の部分)
適切な設定をすることで、この画像をサイトの記事のアイキャッチ部分にすることができます。(以下の画像のような感じ)
HUGOのドキュメントを見ると、各記事のフロントマターでfeatured_image
という項目を入れてやればいいみたいです。以下の解説記事がわかりやすかったので載せておきます。
https://jam.bchari.com/posts/featured-image/
この項目を設定するためには、またコードを少しいじる必要があります。これもrenderPage
を少しいじる必要があります。
キモは以下の箇所です。この部分でページのカバー画像を取得してfeatured_imageに設定しています。
|
|
元々のリポジトリでは
|
|
というふうに、フロントマターの名前が異なっていたので、カバー画像がページに表示されていなかったようです。
元々メモアプリとしてNotionを利用していたこともあり、記事を書く心理的なハードルが大きく下がりました。
ブログサイトを作ることは好きですが、ブログを書くこと自体は面倒に感じてしまう性格なので、これまでブログを作っては放置することを繰り返してきました。
これからはNotionを使ってバリバリブログを書けたらいいなと思います。