せっかく行列データを作っても、GitHubやNotionでそのまま見られなければ結局誰も見てくれません。出力形式にMermaidとPlantUMLの両方を用意したのは、そういう実用面へのこだわりです。
Markdownテーブル出力
図1: COBOL CRUDマトリクス — 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形式出力
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形式出力
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)
統合出力クラス
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}')
各ツールでのレンダリング確認
| ツール | 形式 | 利用方法 |
|---|---|---|
| GitHub | Markdown / Mermaid | .md ファイルをそのままプッシュ |
| Notion | Markdown | Markdownインポート機能を使用 |
| Confluence | PlantUML | PlantUML マクロプラグインを使用 |
| VS Code | Mermaid / PlantUML | Mermaid Preview / PlantUML 拡張 |
✅ 次の章では…
PART 07 では実際のサンプル COBOL プロジェクトを使ってツールを動かし、生成されたMarkdown・Mermaid・PlantUML 出力を確認します。
CRUD図出力でよくある誤り
Markdown・Mermaid・PlantUML形式での出力は、特殊文字エスケープや文字数制限を誤ると表示が崩れます。
| 誤り/失敗パターン | 何が起きるか | 正しい対処/防止策 |
|---|---|---|
| Mermaidでノード名に特殊文字をエスケープしない | テーブル名にハイフン・スラッシュ等が含まれるとMermaid構文エラーになり図が描画されない | ノード名をダブルクォートで囲むか、特殊文字をアンダースコアに置換して安全な識別子にする |
| テーブル・プログラム数が多いのに1つのMermaid図にする | ノード数が多すぎてレンダリングが非常に遅くなるか、「Too many edges」エラーで描画できない | サブシステムや業務領域ごとにMermaid図を分割し、各図に含まれるプログラム数を20〜30以内に収める |
| Markdownテーブルのセル内に縦棒(|)を含む値を書く | Markdownのセル区切り文字と混同され、表の列が崩れて正しく表示されない | セル内の縦棒は\|にエスケープするか、HTMLエンティティ|に置換してから出力する |