【Rust】mdlibで作るMarkdownウィキ

Rustで書かれたノートアプリ[mdlib](https://github.com/bahdotsh/mdlib)が実用性もあり、実装も興味深かったので紹介します。

![Screenshot 2025-04-17 at 12.31.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79562/a040b614-e498-4cf7-b774-191a2cc103ff.png)

mdlibは、Rustで書かれたウェブベースのMarkdownノートアプリケーションです。自分のマークダウンファイルを、タグやカテゴリで整理し、リアルタイムプレビューでスムーズに編集できます。現時点では個人用途のみを想定しているようです（チーム機能なし）。

## 前提条件

- Rust と Cargo （バージョン1.54.0以上）
- ブラウザ（Chrome、Firefox、Safariなど）

## mdlibの特徴

GitHub上の説明によると、mdlibには以下のような機能があります：

- 📝 ディレクトリ内のマークダウンファイルの閲覧と編集
- ✨ 新しいマークダウンファイルの作成
- 👁️ リアルタイムでのマークダウンレンダリングプレビュー
- 🔍 全ノートを対象とした検索機能
- 🏷️ タグによる整理
- 📂 カテゴリによる階層的な整理
- 🌙 ダークモード対応
- ⚡ キーボードショートカット
- 🔄 自動保存機能
- 💾 シンプルなファイル管理
- 📱 レスポンシブデザイン
- 🔍 全文検索機能
- 🔗 ノート間のリンク機能
- 📄 YAMLフロントマター対応
- 🧩 カスタマイズ可能な設定
- 📦 埋め込みウェブアセット（どのディレクトリからでも実行可能）

## インストール方法

### cargoを使ったインストール

```bash
cargo install mdlib
```

### ソースからのビルド

1. リポジトリをクローンします：

```bash
git clone https://github.com/bahdotsh/mdlib.git
cd mdlib
```

2. プロジェクトをビルドします：

```bash
cargo build --release
```

コンパイルされたバイナリは`target/release/mdlib`に配置されます。

## 使い方

mdlibを起動するには、以下のコマンドを実行します：

```bash
mdlib [DIRECTORY]
```

`[DIRECTORY]`はマークダウンファイルを含むディレクトリへのパスです。指定しない場合、現在のディレクトリが使用されます。

カスタム設定ファイルを指定することもできます：

```bash
mdlib --config-file /path/to/config.json [DIRECTORY]
```

起動したら、ブラウザで[http://localhost:3000](http://localhost:3000)にアクセスします。

### 設定コマンド

mdlibには設定を管理するための特別なコマンドが含まれています：

```bash
# 設定ファイルの場所と現在の設定を表示
mdlib --config

# デフォルトの設定ファイルを作成
mdlib --config create

# 埋め込まれた静的ファイルを一覧表示（デバッグ用）
mdlib --list-embedded
```

## キーボードショートカット

READMEに記載されているキーボードショートカットは以下の通りです：

- `Ctrl/Cmd + S`: 現在のファイルを保存
- `Ctrl/Cmd + B`: 選択したテキストを太字に
- `Ctrl/Cmd + I`: 選択したテキストを斜体に
- `Ctrl/Cmd + P`: プレビューモードの切り替え
- `Ctrl/Cmd + N`: 新しいノートの作成

## 設定

`--config-file`オプションでカスタム設定ファイルを指定できます：

```bash
mdlib --config-file /path/to/config.json
```

設定オプションには以下が含まれます：
- サーバーポート
- バインドアドレス
- ファイル監視
- 最大ファイルサイズ
- デフォルトのテーマ設定

### 設定例

デフォルト設定を持つ`config.json`ファイルの例：

```json
{
  "port": 3000,
  "watch_files": true,
  "bind_address": "127.0.0.1",
  "max_file_size_mb": 10,
  "default_dark_mode": false
}
```

これらの設定は好みに応じてカスタマイズできます：
- `port`: mdlibサーバーのHTTPポート（デフォルト: 3000）
- `watch_files`: ファイルの変更を監視して自動更新するかどうか（デフォルト: true）
- `bind_address`: バインドするアドレス（デフォルト: "127.0.0.1"、外部アクセスを許可するには "0.0.0.0" を使用）
- `max_file_size_mb`: メガバイト単位の最大ファイルサイズ（デフォルト: 10）
- `default_dark_mode`: デフォルトでダークモードで起動するかどうか（デフォルト: false）

## mdlibの内部構造

GitHub上のソースコードを調査すると、プロジェクト構造は以下のようになっています：

- `src/`: ソースコード
  - `main.rs`: エントリーポイント
  - `fs.rs`: ファイルシステム操作
  - `server.rs`: ウェブサーバーとAPIエンドポイント
  - `config.rs`: 設定管理
  - `embedded.rs`: 埋め込み静的アセットハンドラ
- `static/`: 静的ウェブファイル（コンパイル時にバイナリに埋め込まれる）
  - `index.html`: メインHTMLページ
  - `css/`: スタイルシート
  - `js/`: JavaScriptファイル

## 技術的な解説

ソースコードをみたところ、mdlibは**Axum**を中心に以下のような技術を使用しています：

1. **Axumウェブフレームワーク**: `server.rs`で使用されており、ウェブサーバーとAPIエンドポイントを実装しています。

2. **ファイルシステム操作**: `fs.rs`でマークダウンファイルの読み書きや、タグ・カテゴリの管理機能が実装されています。

3. **設定管理**: `config.rs`でアプリケーション設定の読み込みと保存を行っています。

4. **埋め込み静的ファイル**: `embedded.rs`で静的ファイルをバイナリに埋め込む機能が実装されています。

## まとめ

mdlibは、シンプルながらも機能的なマークダウンウィキシステムです。Rustで書かれたバックエンドとウェブインターフェースを組み合わせることで、ナレッジベースの管理ツールとして活用できそうです。

インストールは簡単で、既存のマークダウンファイルをそのまま活用できるため、すぐに使い始めることができます。また、Gitリポジトリとしてノートを管理すれば、バージョン管理やバックアップの恩恵も受けられますね。

チーム機能やAPI機能があるとさらに便利になりそうですね

## 参考リンク

- [GitHub リポジトリ](https://github.com/bahdotsh/mdlib)
- [Rust と Cargo のインストール](https://www.rust-lang.org/tools/install)