miton-wiki

2026-01-13

←プログラミング系の情報

miton-wikiとは

Haskellで書かれたwikiエンジン。現在作成中。

GitHubのリポジトリはこちら: miton-wiki - GitHub

どういうモチベーションで制作しているのか?

元々Jekyllを使用して静的サイトを作っていた(このサイトとか)。
そしてTRPGのシナリオはmarkdownをphpに変換してまとめていた。
なんでphpにしていたかというと、1陣とか2陣とかによって導入を変えたいとき、phpだと表示を分けられるから。
また、それ以外のあらゆるものはObsidianにまとめていた。

そしてそろそろそれらを統合したいという気持ちになった。また、できればブラウザから直接ファイルを編集・作成したい。
そういった動的なことは静的サイトジェネレータではできないし、phpで書いてもいいのだがちょうどいい機会なのでHaskellで書こうという気になった。

ちなみに、Obsidianにまとめていたものは引き続きObsidianで管理したほうが都合がよい(プラグインの恩恵を受けることができるため)。そのため、これは統合しないことにした。

設計思想

デフォルトの状態ではほとんど何もできないが、プラグインを書いていくことで機能を増やしていくという設計。
似た設計のプロダクトの例としては、dpp.vimが挙げられる。他には、そこまで極端ではないが、mikutterなど。

どこまでできているか

コア部分

Main.hsはなんらかのpageSourceを使用してページを読み込み、なんらかのrenderを使用して読み込んだページの内容をtemplateに埋め込んでhtmlを生成する。
生成したhtmlをrunServer関数に渡し、サーバに配信する。runServer関数はHttp.hsで定義されている。

Http.hsではrunServer関数が定義されており、外部に公開している。
runServer関数の型は(PageSource s, PageRenderer r) => Int -> s -> r -> IO ()。
Intはポート番号。
まずURLからリクエストを受け取ってpathに変換し、もしそれが静的ファイルだった場合は静的ファイルとして、テキストファイルだった場合はRendererで適切に処理する。
Http.hsはちょっと多くの責務を背負わせすぎているので、今後機能の分離をする予定。

あとはCore/とPlugin/にソースコードを置いている。
Coreは主にPluginで使用している型や型クラスの定義を置いている。
このようにmiton-wikiで使われる型や型クラスの定義を置くことで、その型に求められる機能が分かり、誰でもPluginが書けるようにするのが理想。
Pluginには具体的な実装が置かれている。
このへんもまだ整理できていないので今後する予定。

今のところはとりあえず動くことを優先して作っているので、割と思想にそぐわない設計になっている部分とか、綺麗じゃない部分がある。
一旦これを掃除したあと、機能を追加していく。

機能

  • htmlファイルをテンプレートに埋め込み、cssを適用してサーバに配信できる。
  • markdownファイルをhtmlに変換し、同様に配信できる。
  • cssは直接htmlに埋め込む機能も実装してあるし、linkタグで読み込む形式も実装してあるが、今のところ使い分けられるような実装にしておらず、linkタグのほうだけが機能している。
  • 画像を表示できる。