Markdownテーブル出力

Python — Markdown出力
def render_markdown(result) -> str:
    """CRUD行列をMarkdownテーブル形式で出力する"""
    programs = result.programs
    tables = result.tables

    # ヘッダー行
    header = '| プログラム / テーブル | ' + ' | '.join(tables) + ' |'
    sep    = '|-' + '-|'.join(['-' * max(len(t), 3) for t in ['プログラム / テーブル'] + tables]) + '-|'

    rows = [header, sep]
    for prog in programs:
        cells = [get_cell(result, prog, t) or '' for t in tables]
        row = f'| {prog} | ' + ' | '.join(cells) + ' |'
        rows.append(row)

    return '\n'.join(rows)
Markdown出力例
| プログラム / テーブル | MEISAI | SHOHIN | TOKUI | URIAGE |
|------------------------|--------|--------|-------|--------|
| SHOHIN-KANRI           |        | CRUD   |       |        |
| TOKUI-MEISHO           |        |        | CRUD  |        |
| URIAGE-SHUKEI          | R      | R      | R     | R      |
| URIAGE-TOROKU          | CRD    | R      | R     | CU     |

Mermaid形式出力

Python — Mermaid出力
def render_mermaid(result) -> str:
    """CRUD行列をMermaid xychart-beta形式で出力する(主要テーブルのみ)"""
    lines = ['```mermaid', 'graph LR']

    for prog in result.programs:
        safe_prog = prog.replace('-', '_')
        for table, ops in result.matrix.get(prog, {}).items():
            safe_table = table.replace('-', '_')
            label = ops_to_str(ops)
            lines.append(f'    {safe_prog}["{prog}"] -->|{label}| {safe_table}[("{table}")]')

    lines.append('```')
    return '\n'.join(lines)
Mermaid出力例
```mermaid
graph LR
    URIAGE_TOROKU["URIAGE-TOROKU"] -->|R| TOKUI[("TOKUI")]
    URIAGE_TOROKU["URIAGE-TOROKU"] -->|R| SHOHIN[("SHOHIN")]
    URIAGE_TOROKU["URIAGE-TOROKU"] -->|CU| URIAGE[("URIAGE")]
    URIAGE_TOROKU["URIAGE-TOROKU"] -->|CRD| MEISAI[("MEISAI")]
    URIAGE_SHUKEI["URIAGE-SHUKEI"] -->|R| TOKUI[("TOKUI")]
```

💡 Mermaid の表現制限

Mermaid の graph LR はエッジ数が多いと見づらくなります。プログラム数・テーブル数が多い場合は、重要なプログラムに絞ったフィルタリングや PlantUML の表形式出力が有効です。

PlantUML形式出力

Python — PlantUML出力(テーブル形式)
def render_plantuml(result) -> str:
    """CRUD行列をPlantUMLのテーブル形式で出力する"""
    programs = result.programs
    tables = result.tables

    lines = ['@startuml', 'title COBOL CRUD図', '']
    lines.append('legend')
    lines.append('  C=Create R=Read U=Update D=Delete')
    lines.append('end legend')
    lines.append('')

    # salt(ワイヤーフレームUI)でテーブルを表現
    lines.append('salt')
    lines.append('{#')

    # ヘッダー
    header_cells = ['プログラム'] + tables
    lines.append('| ' + ' | '.join(header_cells) + ' |')
    lines.append('|' + '|'.join(['=' * max(len(c), 3) for c in header_cells]) + '|')

    # データ行
    for prog in programs:
        cells = [prog] + [get_cell(result, prog, t) or ' ' for t in tables]
        lines.append('| ' + ' | '.join(cells) + ' |')

    lines.append('}')
    lines.append('@enduml')
    return '\n'.join(lines)

統合出力クラス

Python — 統合出力クラス
from pathlib import Path

class CrudOutputWriter:
    def __init__(self, result, output_dir: str = '.'):
        self.result = result
        self.out = Path(output_dir)
        self.out.mkdir(parents=True, exist_ok=True)

    def write_all(self) -> None:
        self._write('crud_matrix.md', render_markdown(self.result))
        self._write('crud_matrix_mermaid.md', render_mermaid(self.result))
        self._write('crud_matrix.puml', render_plantuml(self.result))
        export_to_json(self.result, str(self.out / 'crud_matrix.json'))
        print(f'出力完了: {self.out}')

    def _write(self, filename: str, content: str) -> None:
        path = self.out / filename
        path.write_text(content, encoding='utf-8')
        print(f'  → {path}')

各ツールでのレンダリング確認

ツール 形式 利用方法
GitHubMarkdown / Mermaid.md ファイルをそのままプッシュ
NotionMarkdownMarkdownインポート機能を使用
ConfluencePlantUMLPlantUML マクロプラグインを使用
VS CodeMermaid / PlantUMLMermaid Preview / PlantUML 拡張

次の章では…

PART 07 では実際のサンプル COBOL プロジェクトを使ってツールを動かし、生成されたMarkdown・Mermaid・PlantUML 出力を確認します。

→ PART 07 — 動作デモへ