既知の制限:プラグインの境界線
このレッスンで学べること
- プラグインがどのテーブルタイプをサポートしていないか
- 非対応のシナリオでプラグインを使用しない方法
- プラグインの技術的境界と設計上のトレードオフ
コアコンセプト
このプラグインは 1 つの目標に集中しています:OpenCode の隠しモード向けに Markdown パイプテーブルのフォーマットを最適化する。
そのために、コアシナリオの信頼性とパフォーマンスを確保するため、一部の機能を意図的に制限しています。
既知の制限一覧
| 制限 | 説明 | サポート予定 |
|---|---|---|
| HTML テーブル | Markdown パイプテーブル(| ... |)のみサポート | ❌ 非対応 |
| 複数行セル | セル内に <br> などの改行タグを含められない | ❌ 非対応 |
| 区切り行なしテーブル | ` | --- |
| セル結合 | 行または列にまたがる結合は非対応 | ❌ 非対応 |
| ヘッダーなしテーブル | 区切り行がヘッダーとして扱われるため、ヘッダーなしテーブルは作成不可 | ❌ 非対応 |
| 設定オプション | 列幅のカスタマイズ、機能の無効化などは不可 | 🤔 将来的に可能 |
| 超大テーブル | 100+ 行のテーブルのパフォーマンスは未検証 | 🤔 将来的に最適化 |
制限の詳細
1. HTML テーブルは非対応
現象
<!-- このテーブルはフォーマットされません -->
<table>
<tr>
<th>列 1</th>
<th>列 2</th>
</tr>
<tr>
<td>データ 1</td>
<td>データ 2</td>
</tr>
</table>原因
プラグインは Markdown パイプテーブル(Pipe Table)のみ処理します。つまり、| で区切られた形式です:
| 列 1 | 列 2 |
|--- | ---|
| データ 1 | データ 2 |ソースコードの根拠
// index.ts:58-61
function isTableRow(line: string): boolean {
const trimmed = line.trim()
return trimmed.startsWith("|") && trimmed.endsWith("|") && trimmed.split("|").length > 2
}検出ロジックは | で始まり、| で終わる行のみをマッチするため、HTML テーブルは直接スキップされます。
代替案
HTML テーブルをフォーマットする必要がある場合、以下をおすすめします:
- 専用の HTML フォーマットツールを使用する
- HTML テーブルを Markdown パイプテーブルに変換する
2. 複数行セルは非対応
現象
| 列 1 | 列 2 |
|--- | ---|
| 第 1 行<br>第 2 行 | 単一行 |出力時に <!-- table not formatted: invalid structure --> コメントが表示されます。
原因
プラグインはテーブルを 1 行ずつ処理し、セル内の改行をサポートしていません。
ソースコードの根拠
// index.ts:25-56
function formatMarkdownTables(text: string): string {
const lines = text.split("\n")
// ... 1 行ずつスキャンし、複数行をマージするロジックなし
}代替案
- 複数行の内容を複数行のデータに分割する
- または、テーブルが広くなることを受け入れ、内容を 1 行内に表示する
3. 区切り行なしテーブルは非対応
現象
<!-- 区切り行が欠けている -->
| 列 1 | 列 2 |
| データ 1 | データ 2 |
| データ 3 | データ 4 |<!-- table not formatted: invalid structure --> コメントが表示されます。
原因
Markdown パイプテーブルには区切り行(Separator Row)が必須であり、列数と配置方法を定義するために使用されます。
ソースコードの根拠
// index.ts:86-87
const hasSeparator = lines.some((line) => isSeparatorRow(line))
return hasSeparator // 区切り行がない場合は false を返す正しい記述
| 列 1 | 列 2 |
| --- | --- | ← 区切り行
| データ 1 | データ 2 |
| データ 3 | データ 4 |4. セル結合は非対応
現象
| 列 1 | 列 2 |
|--- | ---|
| 2 列結合 | ← 列 1 と列 2 にまたがることを期待
| データ 1 | データ 2 |原因
Markdown 標準はセル結合構文をサポートしておらず、プラグインも結合ロジックを実装していません。
代替案
- 空白セルでプレースホルダーを使用する:
| 2 列結合 | | - または、Markdown の制限を受け入れ、HTML テーブルを使用する
5. 区切り行はヘッダーとして扱われる
現象
|--- | --- | ---|
| 左寄せ | 中央寄せ | 右寄せ |
| データ 1 | データ 2 | データ 3 |区切り行がヘッダー行として扱われるため、「ヘッダーなし」の純粋なデータテーブルを作成できません。
原因
Markdown 仕様では、区切り行の後の最初の行をテーブルヘッダー(Table Header)として扱います。
代替案
- これは Markdown 自体の制限であり、プラグイン固有のものではありません
- ヘッダーなしテーブルが必要な場合は、他のフォーマット(CSV など)を検討してください
6. 設定オプションなし
現象
設定ファイルで調整できません:
- 最小/最大列幅
- 特定機能の無効化
- カスタムキャッシュ戦略
原因
現在のバージョン(v0.0.3)は設定インターフェースを提供しておらず、すべてのパラメータはソースコードにハードコードされています。
バージョンについて
現在のプラグインバージョンは v0.0.3(package.json で宣言)です。CHANGELOG.md に記録されている v0.1.0 は将来のバージョン計画であり、まだリリースされていません。
ソースコードの根拠
// index.ts:115 - 列の最小幅が 3 にハードコード
const colWidths: number[] = Array(colCount).fill(3)
// index.ts:222 - キャッシュしきい値がハードコード
if (cacheOperationCount > 100 || widthCache.size > 1000) {
cleanupCache()
}将来の計画
CHANGELOG では、将来サポートされる可能性がある言及があります:
Configuration options (min/max column width, disable features)
7. 超大テーブルのパフォーマンスは未検証
現象
100+ 行のテーブルの場合、フォーマットが遅くなるか、メモリを多く消費する可能性があります。
原因
プラグインは 1 行ずつのスキャンとキャッシュメカニズムを使用しており、理論的には大テーブルを処理できますが、専用のパフォーマンス最適化は行われていません。
ソースコードの根拠
// index.ts:5-7
const widthCache = new Map<string, number>()
let cacheOperationCount = 0
// キャッシュは 100 回の操作または 1000 エントリ後にクリアされる
if (cacheOperationCount > 100 || widthCache.size > 1000) {
cleanupCache()
}推奨事項
- 超大テーブルの場合、複数の小テーブルに分割することをおすすめします
- または、将来のパフォーマンス最適化バージョンをお待ちください
チェックポイント
このレッスンを完了すると、以下の質問に答えられるはずです:
- [ ] プラグインはどのテーブルフォーマットをサポートしていますか?(答え:Markdown パイプテーブルのみ)
- [ ] なぜ複数行セルをフォーマットできないのですか?(答え:プラグインは 1 行ずつ処理し、マージロジックがないため)
- [ ] 区切り行の役割は何ですか?(答え:列数と配置方法を定義し、必須)
- [ ] 列幅をカスタマイズできますか?(答え:現在のバージョンでは非対応)
よくある間違い
よくあるエラー
エラー 1:HTML テーブルがフォーマットされることを期待する
プラグインは Markdown パイプテーブルのみ処理します。HTML テーブルは手動でフォーマットするか、他のツールを使用する必要があります。
エラー 2:テーブルに区切り行がない
区切り行は Markdown テーブルの必須部分であり、欠けると「無効な構造」エラーが発生します。
エラー 3:セルの内容が長すぎて、テーブルが広くなる
プラグインには最大列幅の制限がないため、セルの内容が長すぎると、テーブル全体が非常に広くなります。手動で改行するか、内容を簡潔にすることをおすすめします。
まとめ
| 制限 | 原因 | 代替案 |
|---|---|---|
| HTML テーブル非対応 | プラグインは Markdown パイプテーブルに集中 | HTML フォーマットツールを使用 |
| 複数行セル非対応 | 1 行ずつ処理するロジック | 複数行に分割するか、広くなることを受け入れる |
| 区切り行なし非対応 | Markdown 仕様の要件 | ` |
| 設定オプションなし | 現在のバージョンでは未実装 | 将来のバージョン更新をお待ちください |
次のレッスンの予告
次のレッスンでは 技術詳細 を学びます。
学べること:
- プラグインのキャッシュメカニズムの仕組み
- パフォーマンス最適化戦略
- なぜキャッシュが 100 回の操作後にクリアされるのか
付録:ソースコード参照
クリックしてソースコードの場所を表示
更新日時:2026-01-26
| 制限 | ファイルパス | 行番号 |
|---|---|---|
| HTML テーブル検出 | index.ts | 58-61 |
| 区切り行検出 | index.ts | 63-68 |
| テーブル検証(区切り行が必須) | index.ts | 70-88 |
| 列の最小幅ハードコード | index.ts | 115 |
| キャッシュしきい値ハードコード | index.ts | 222-224 |
主要な関数:
isTableRow():Markdown パイプテーブル行かどうかを検出isSeparatorRow():区切り行を検出isValidTable():テーブル構造の有効性を検証
主要な定数:
colWidths 最小幅 = 3:列の最小表示幅キャッシュしきい値 = 100 回の操作または 1000 エントリ:キャッシュクリアをトリガーする条件
CHANGELOG 参照:
- 既知の制限の章:
CHANGELOG.md第 31-36 行