umd 0.2.0

Universal Markdown - A post-Markdown superset with semantic HTML and extensible syntax
Documentation
# コードブロック拡張機能

このドキュメントは、UMDパーサーのコードブロック処理(`src/extensions/fence/code_block.rs`)の実装と使用方法について説明します。

> **破壊的変更(2026年9月〜)**: シンタックスハイライト(旧: syntect)とMermaid図のSVGレンダリング(旧: mermaid-rs-renderer)は umd-core から削除されました。これらは「ドメイン固有のビジュアル表現」であり、3層アーキテクチャ([docs/architecture.md](architecture.md)参照)の判断基準に照らしてホストアプリケーション(Layer 2/3)の責務とすべき、という結論に基づく変更です。加えて `mermaid-rs-renderer` はOSのフォントディレクトリスキャンに依存する `fontdb` を使っており、そもそも wasm32 ターゲットではビルドできませんでした。旧実装の詳細は `CHANGELOG.md` を参照してください。

## umd-coreが行うこと

umd-coreはコードブロックについて、以下のメタデータ処理のみを行います。

- `language-*` クラスのパススルー(comrakが生成したものをそのまま維持、解釈・変換はしない)
- ファイル名メタデータ(fence info文字列の `lang:filename` 記法、`src/extensions/fence/normalize.rs` が正規化)から `<figcaption>` を生成
- 常に `<figure class="umd-code-block">` でラップ(プレーンテキスト・言語指定ありのどちらも)

言語の直後に `:` を続けるとファイル名として扱われます(`:` より前がなければ言語なしファイル名指定として扱われます)。

```text
Input:  ```rust:main.rs
        fn main() {}
        ```

Output: <figure class="umd-code-block">
          <figcaption class="umd-code-filename">main.rs</figcaption>
          <pre><code class="language-rust">fn main() {}</code></pre>
        </figure>
```

`mermaid`・`geojson`など、umd-coreが特別扱いしない言語も全く同じ経路を通ります。

```text
Input:  ```mermaid
        flowchart TD
          A[Start] --> B[End]
        ```

Output: <figure class="umd-code-block">
          <pre><code class="language-mermaid">flowchart TD
          A[Start] --> B[End]</code></pre>
        </figure>
```

## ホストアプリケーションが行うこと(Layer 2/3)

シンタックスハイライトや、Mermaid/GeoJSONのような言語固有のレンダリングは、`<code class="language-*">` のクラスを検出してホスト側で行います。

- **シンタックスハイライト**: highlight.js / Shiki / Prism.js などをクライアントサイドで適用するか、ビルド時にSSRする
- **Mermaid**: `language-mermaid` を検出し、`mermaid.js`(クライアントサイド)またはビルド時ツール(サーバーサイド/ネイティブ)でSVGを生成し、`<pre><code>` を置き換える
- **GeoJSON**: `language-geojson` を検出し、OpenLayers等で地図に変換する

置き換え時は元の `<pre><code>` ノードを削除せず、`umd-hidden` クラス等で隠しつつDOMに残しておくと、「ソース表示」トグルや、レンダリング失敗時のフォールバック表示に使えます(詳細は各ホストアプリの実装に委ねられます)。

## 関連ファイル

- `src/extensions/fence/code_block.rs`: このドキュメントが説明する処理の実装
- `src/extensions/fence/normalize.rs`: `lang:filename` 記法の正規化(comrakへ渡す前に `lang umd-filename:filename` 形式へ変換)
- [docs/architecture.md](architecture.md): 3層アーキテクチャの判断基準全般