Ibotenic by t-sin


自分用の静的サイトジェネレータをつくりました

プログラミング 静的サイトジェネレータ Common Lisp Lisp 自作

2021-04-10T22:45:03.392272+09:00

t-sin.github.ioを刷新するため静的サイトジェネレータを自作してみた話。

t-sin.github.ioが新しくなりました

こんにちは。t-sinです。

これまではてなブログでOctahedronというブログをやっていました。OSS活動をはじめたころにつくったので、もうけっこう長いこと使っていました。ですが投稿画面が若干つかいにくかったのと、なにより手元のテキストエディタで記事を書くほうが楽だったりということもあり、GitHub Pagesへの移行を数年前から考えていました。

また、ブログって記事投稿以外で更新することってないし、Twitterがあるしコメントでやりとりすることもないので、サーバーサイドのプログラムとして運用されなくてもいよなあと思っていました。あるいは単に静的サイトとしてつくられたブログに憧れがあったりもしました。

なのでこのたび、静的サイトとしてブログをお引越ししました。

Ibotenic

ウェブサイトの名前はなんとなくイボテン酸 (ibotenic acid) のイボテン部分としてみました。ご存知のとおりキノコがすきですので。

t-sin.github.ioは最初ポートフォリオサイトとして Octahedronic という名前をしていました。名前が形容詞だったのは、グレッグ・イーガンの短編SF小説『祈りの海』がすごくすきなのでその原題"Oceanic"をリスペクトしてそうなっていました。

今回はその名前もほんのり継承していてカッコよいのでIbotenicとしました。Ibotenic。ぜひ覚えて帰ってくださいね。

静的サイトジェネレータは自作

さて、この記事の本題はここからです。

静的サイトにするにあたってはもちろん静的サイトジェネレータを利用することになります。ですが既存の静的サイトジェネレータ、そこそこ高機能で、使い方を覚えるのがとてもめんどくさくて移行に及び腰でした。既存というとHugoとかJekyllとかいろいろありますが、よく調べてないけど普段つかわない言語処理系を入れるのが嫌で除外しました。ぼくがいちばん手慣れた言語はCommon LispなのでCommon Lisp製のものというとColeslawがあります。いいなと思ったんですが、やはり高機能そうで覚えられる気がしませんでした。

そうするともう、自作するしかないですよね。

むしろ上で述べた「覚えられる気がしない」ことを言い訳につくってみたかった説すらあります。

そんなわけでここ2週間くらいで絶賛開発中なのがこのウェブサイトおよびブログをつくるのに利用されている、Ashaというわけです。

静的サイトジェネレータ: Asha

Ashaは自分が考える最低限のシンプルな機能を持つだけの静的サイトジェネレータです。以下のような機能をもっています:

これだけです。もちろんCommon Lisp製で、テンプレートエンジンなど外部ライブラリに依存しているためか現在のAsha本体のコードは415行しかありません。

依存ライブラリ

Ashaを構成するのに用いたライブラリを挙げておきます。以下はasha.asdの依存ライブラリを書いておく部分の抜粋です。

  :depends-on ("uiop"
               "alexandria"
               "local-time"
               "cl-markdown"
               "djula"
               "closure-html"
               "rosa")

ちなみにこれはコードブロックなのですが、Markdownのレンダリング結果にスタイルを当てていないためたぶんまっしろなはずです。

uiopはASDF付属のプラットフォーム依存の処理を抽象化したユーティリティ集で、パス関連の操作をするのにちょっとだけ使っています。alexandriaはCommon Lispのユーティリティ集ですが、これもちょっとした用途に使っています。

local-timeは時刻のライブラリです。記事の作成日時とかの処理につかっています。cl-markdownはMarkdownのレンダリングにとりあえず用いています。Common Markがいいなあ…と思いつつ。

Djulaはテンプレートエンジンです。PythonのWebアプリケーションフレームワークDjangoのテンプレートエンジンを意識した構文になっていて、むかし仕事でDjango使ってたのでこれにしました。

closure-htmlは、HTMLのパーサです。いまはまだ表示していませんが、Markdownのレンダリング結果 (HTML文字列) から目次情報 (h1などの見出し情報) を取り出すのに用いています。

rosaは拙作のライブラリで、テキストデータにメタデータを書くためのミニ言語です。2017年ごろにつくりました (そのときの記事がこちら)。何かに使うためにつくったけど長らく使ってませんでしたが、今回ブログ記事の元となるMarkdownファイルにメタデータを付与したくて掘り返してきました。この記事のMarkdownファイルの冒頭部分を引用するとこんなかんじです:

:title 自分用の静的サイトジェネレータをつくりました
:tags>
- プログラミング
- 静的サイトジェネレータ
- Lisp
- Common Lisp
- 自作

:description

t-sin.github.ioを刷新するため静的サイトジェネレータを自作してみた話。

:content

## `t-sin.github.io`が新しくなりました

...

実装

Ashaのウェブサイトはウェブサイトの状態を.asha/というディレクトリに持ちます。ウェブサイトの状態とはたとえば、ウェブサイトのメタデータや、各ページの更新日時、タグ情報、などなどのことです。Ashaのインターフェースとなる関数を呼ぶとこれらが操作されたり、あるいはこれらを元にウェブサイトを出力したりします。

やってることはまあ泥臭いパス操作やファイル操作だったりしてあまり面白くないので書きません。

Ashaの現状と今後

現在絶賛開発中なので、誰も使うことができません。

まず、Ashaのパッケージからインターフェースとなる関数をエクスポートしていない体たらくです。開発しながらIbotenicもつくっていたのでbreaking changesがぼこぼこと雨後のキノコのように入っていたからです。あと、つくってみないとどんな形になるかわからかったからというのもあります。

今後に向けて、まだごちゃっとしているコードを整理してAPIを確定させ、その後使い方ドキュメントの整備をやっていくつもりです。なんといってもつくった本人がコードを見ながら使っている現状なので今後忘れたとき困りそうですからね。

余談

ところでcl-markdownがこの記事を正しくレンダリングしてくれないような……?? と思ったらコードブロックのバッククォート3つ記法って素のMarkdownにはないんですね……。ううう……。

Markdownレンダリング結果に対するスタイルシートは今後の課題とさせてください……。

t-sin.github.ioを刷新するため静的サイトジェネレータを自作してみた話。

タグ: プログラミング , 静的サイトジェネレータ , Common Lisp , Lisp , 自作

作成日時: 2021-04-10T22:45:03.392272+09:00

更新日時: -