Goでブログを作ってみた
今年から本格的にGolangの勉強をはじめました。勉強の一環としてgoでブログを作ってみたので紹介します。
技術スタック
- go 1.25.1
- github.com/a-h/templ v0.3.1001
templはgoでUIコンポーネントを作るライブラリです。Reactみたいにかけていい感じでした
デプロイ
Cloudflare Registarでドメインを取得してCloudflare Pagesにデプロイしています。
publicに配置したものが配信されるというのを知らず何故かページが表示されない。。。cssも反映されない。。。とちょっと詰まるところはありました、それ以外はめっちゃ簡単でした。お金も全然かからないしサイコー。ドメインは1200円くらいでした。
マークダウンパーサー
パーサーを今回自作しています。以下をサポートしています。
- フロントマター
- h1,h2,h3
- 順序なしリスト
- 順序付きリスト
- 太字
今後は入れ子の順序リストやコードブロック、リンクをサポートする予定です。
マークダウンパーサーはcloud codeにマークダウンパーサーを自作したいです。答えは絶対に言わずに実装を助けてくださいとお願いして実装してみました。初めての実装でしたが思ったより簡単にできました。流れは以下の通りです。
- ファイルの内容を読み取る
- 改行(\n)単位でsplit(lines := strings.Split(content, "\n"))
- forでループしてprefixを確認。例えば"# "で開始している場合は"# "を空文字に置換したあとでh1でラップする
- ループが終わったら全てを結合
マークダウンパーサーでちょっと面倒だったこと
順序リスト
めんどうな理由は入れ子です。li要素はolもしくはul要素でラップする必要があるのですが、liが連続する場合があるためすぐにol要素でラップすることができません。liが終わったことを確認したあとにol要素でラップする必要があります。
したがって"- "がprefixの文を見つけた場合、処理が3つに分岐します。
- 次も順序リスト
- 順序リスト以外
- ループが終了(つまり文章の最後が順序リストで終わるパターン。エッジケース)
この分岐を解決するためにループの外側にinBulletPointというフラグを持たせました。ループの頭でチェックすることで1と2を解決します。3の場合も同様にループを脱出したらinBulletPointをチェックすることで解決します。
太字(strong)
他の要素と異なり文の中に含まれるかつ1文のなかに複数登場します。
最初これは面倒だ。。。と思ったのですが閃いてしまえば実装は楽でした。パースを2段階に分けます。例えばliのパースを行ったあとに太字のパースを行います
実は全然簡単ではない
簡単とか書きましたが、全然まだ課題があります。例えば今文章中にアスタリスクを2つ並べると太字になってしまいます。エスケープを実装する必要があります。
さいごに
AIを使うと色々できてやっぱり楽しい。