bouzuya.hatenablog.com

ぼうずやのにっき

mmdv 0.1.0 をつくった

昨日のことだけど bouzuya/rust-sandbox に mmdv を追加した。

mmdv は Mermaid Viewer 。ローカルの mermaid ファイルを描画してブラウザで表示する。ファイルの更新を監視してブラウザの側も自動更新する。

きっかけは Helix だと Mermaid の preview がしづらいこと。 VS Code では拡張を使っていたのだけど、 Helix だとどうすればいいか分からなかったのでつくった。調べればあるかもしれないけど調べてない。 https://mermaid.live/ を使う手もあるが、ローカルのファイルとの同期が面倒だ。

軽い気持ちで雑につくった。

つくる過程でいろいろ課題があった。

まず Mermaid の描画ができないといけなかった。

mermaid は JavaScript なら問題なく動くはず……くらいの認識だった。

https://mermaid.js.org/config/usage.html

雑に CDN から取得して…… でなんとかなった。だいたい↓な感じ。

<script type="module">
  import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs';
  mermaid.initialize({ startOnLoad: false });

  // Example of using the render function
  const drawDiagram = async function () {
    element = document.querySelector('#graphDiv');
    const graphDefinition = 'graph TB\na-->b';
    const { svg } = await mermaid.render('graphDiv', graphDefinition);
    element.innerHTML = svg;
  };

  await drawDiagram();
</script>

既定値だと .mermaid な要素を勝手に処理して勝手に描画する。迷惑な挙動なので startOnLoad: false しておく。

次にファイルの監視ができないといけないかった。

ファイルを監視するツール……で思いついたのが cargo-watchwatchexec/cargo-watch を見ると、 notify crate に言及していた。

crates:notify 。いかにもな感じ。 notify-rs/notify

適当にドキュメントを見ながら実装。 debounce してないので、過剰に来てしまうけどひとまず許容する。

最後に WebSocket を使えないといけなかった。

ファイルを監視して変更に合わせてリロードしたい。そこで WebSocket を使うことにした。

crates:axum の features に ws がある。 examples もあり、分かりやすい。

https://github.com/tokio-rs/axum/blob/269565ff931b133d850e20491983baf6b2f8c115/examples/websockets/src/main.rs

JavaScript 側のインタフェースは MDN で WebSocket を調べる。

https://developer.mozilla.org/en-US/docs/Web/API/WebSocket

// Create WebSocket connection.
const socket = new WebSocket("ws://localhost:8080");

// Connection opened
socket.addEventListener("open", (event) => {
  socket.send("Hello Server!");
});

// Listen for messages
socket.addEventListener("message", (event) => {
  console.log("Message from server ", event.data);
});

うん。普通に動く。

あとは適当に Rust で CLI を書いておしまい。

とりあえず雰囲気は動くようになったので 0.1.0 にした。


今日のコミット。