# 通知設計書 9-errRstMarkdownIllformedTable

## 概要

本ドキュメントは、Nimコンパイラにおけるエラー通知「errRstMarkdownIllformedTable」の設計仕様を定義する。

### 本通知の処理概要

errRstMarkdownIllformedTableは、Markdownドキュメント内のテーブル構文の区切り行（delimiter row）が不正な形式である場合に出力されるエラー通知である。

**業務上の目的・背景**：NimコンパイラはMarkdown形式のドキュメントコメントをサポートしており、テーブル構文も解析できる。Markdownテーブルは、ヘッダー行の後に区切り行（|---|---|形式）が必要であり、この区切り行の形式が不正な場合、テーブルとして正しく解釈できない。開発者に区切り行の修正を促すためにこのエラーが発行される。

**通知の送信タイミング**：Markdownパーサーがテーブルの区切り行を解析中に、形式が不正であることを検出した時点で発行される。docgen.nimのcompilerMsgHandler経由で変換される。

**通知の受信者**：Markdownドキュメントを含むNimソースコードをコンパイルしている開発者。テーブル構文の修正が必要。

**通知内容の概要**：「illformed delimiter row of a markdown table」という固定メッセージが出力される。パラメータは含まれない。

**期待されるアクション**：開発者は、Markdownテーブルの区切り行を正しい形式（|---|---|や|:--|--:|など）に修正することが期待される。

## 通知種別

コンパイラ標準出力/標準エラー出力（コンソール通知）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期 |
| 優先度 | 高（Error） |
| リトライ | なし |

### 送信先決定ロジック

コンパイラオプション`--stdout`が指定されている場合はstdoutに、それ以外はstderrに出力される。

## 通知テンプレート

### コンソール通知の場合

| 項目 | 内容 |
|-----|------|
| 送信元 | Nimコンパイラ |
| メッセージ種別 | Error |
| 形式 | テキスト |

### 本文テンプレート

```
{ファイル名}({行},{列}) Error: illformed delimiter row of a markdown table
```

### 添付ファイル

該当なし

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| なし | 固定メッセージ | MsgKindToStr[errRstMarkdownIllformedTable] | - |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| Markdownパース処理 | meMarkdownIllformedTableイベント | 区切り行形式不正 | rst.nim |
| ドキュメント生成 | メッセージ変換 | meKindマッピング | docgen.nim 251行目 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| errorsAsWarnings有効時 | roPreferMarkdownかつ非standaloneDocの場合、警告として扱われる |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[Markdownテーブルパース] --> B{区切り行検証}
    B -->|正常| C[処理継続]
    B -->|不正| D[meMarkdownIllformedTable発行]
    D --> E[compilerMsgHandler]
    E --> F[errRstMarkdownIllformedTableへ変換]
    F --> G{errorsAsWarnings?}
    G -->|Yes| H[警告として出力]
    G -->|No| I[globalError呼び出し]
    I --> J[メッセージ出力]
```

## データベース参照・更新仕様

### 参照テーブル一覧

該当なし（ファイルベースの処理）

### 更新テーブル一覧

該当なし

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| 区切り行不足 | ヘッダー行後に区切り行がない | |---|形式の区切り行を追加 |
| 区切り行形式不正 | ハイフンやコロンの配置が不正 | 正しい形式に修正 |
| 列数不一致 | ヘッダーと区切り行の列数が異なる | 列数を揃える |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし |
| リトライ間隔 | - |
| リトライ対象エラー | - |

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| 1分あたり上限 | なし |
| 1日あたり上限 | なし |

### 配信時間帯

制限なし

## セキュリティ考慮事項

- エラーメッセージにはファイルパスと位置情報のみが含まれる
- ローカル開発環境での使用を想定

## 備考

- errRstMarkdownIllformedTableはエラー（Error）カテゴリに属する
- 固定メッセージでパラメータは含まれない
- Markdownテーブルの正しい区切り行例：
  ```
  | Header1 | Header2 |
  |---------|---------|  <- 正しい区切り行
  | Cell1   | Cell2   |
  ```
- 揃え指定付きの区切り行：
  ```
  |:--------|--------:|  <- 左揃え・右揃え
  ```

---

## コードリーディングガイド

本通知を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

errRstMarkdownIllformedTable通知の基盤となるデータ構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | lineinfos.nim | `compiler/lineinfos.nim` | TMsgKind列挙型でerrRstMarkdownIllformedTableの定義を確認（38行目） |
| 1-2 | lineinfos.nim | `compiler/lineinfos.nim` | MsgKindToStr配列でメッセージ文字列を確認（129行目） |

**読解のコツ**: errRstMarkdownIllformedTableは固定メッセージで、"illformed delimiter row of a markdown table"が直接定義されている。

#### Step 2: エントリーポイントを理解する

通知発行の起点となるファイル・関数を特定。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | docgen.nim | `compiler/docgen.nim` | compilerMsgHandlerでのメッセージ変換（241-277行目） |
| 2-2 | docgen.nim | `compiler/docgen.nim` | meMarkdownIllformedTableからerrRstMarkdownIllformedTableへのマッピング（251行目） |

**主要処理フロー**:
1. **251行目**: `of meMarkdownIllformedTable: k = errRstMarkdownIllformedTable`

#### Step 3: Markdownテーブルパースを理解する

RSTパーサーでのMarkdownテーブル検証処理を確認。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | rst.nim | `lib/packages/docutils/rst.nim` | Markdownテーブルパース処理 |

**主要処理フロー**:
- Markdownテーブルの区切り行検証
- 不正形式検出時にmeMarkdownIllformedTableを発行

### プログラム呼び出し階層図

```
RST/Markdownパーサー (lib/packages/docutils/rst.nim)
    │
    └─ Markdownテーブル区切り行検証
           │
           └─ 不正形式検出
                  │
                  └─ meMarkdownIllformedTableイベント発行
                         │
                         └─ compilerMsgHandler(filename, line, col, meMarkdownIllformedTable, "")
                                │
                                └─ case msgKind of meMarkdownIllformedTable: k = errRstMarkdownIllformedTable
                                       │
                                       └─ globalError(conf, info, errRstMarkdownIllformedTable, "")
```

### データフロー図

```
[入力]               [処理]                    [出力]

Markdownソース ──▶ RSTパーサー ────────────▶ 標準エラー出力
(テーブル構文)       │                        "illformed delimiter row..."
                    ▼
               区切り行検証
                    │
                    ▼
               meMarkdownIllformedTable
                    │
                    ▼
               compilerMsgHandler
                    │
                    ▼
               globalError
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| lineinfos.nim | `compiler/lineinfos.nim` | ソース | TMsgKind定義、メッセージ文字列定義 |
| docgen.nim | `compiler/docgen.nim` | ソース | compilerMsgHandler、メッセージ変換 |
| rst.nim | `lib/packages/docutils/rst.nim` | ソース | RSTパーサー本体、Markdownテーブル解析 |
| msgs.nim | `compiler/msgs.nim` | ソース | globalError関数 |
