# 機能設計書 80-JSONサポート

## 概要

本ドキュメントは、Doom EmacsにおけるJSONファイルの編集サポート機能について記述する。設定ファイル、API応答、データ交換など、様々な場面で使用されるJSONの効率的な編集環境を提供する。

### 本機能の処理概要

**業務上の目的・背景**：JSONは最も広く使用されるデータ交換フォーマットの一つであり、APIレスポンス、設定ファイル、パッケージ定義（package.json等）など多様な用途で使用される。本モジュールはJSON編集のための専用機能（パス表示、値操作、フォーマット等）を提供する。

**機能の利用シーン**：
- package.jsonの編集
- tsconfig.jsonの編集
- API応答データの確認・編集
- ESLint/Prettier設定ファイルの編集
- jqによるJSONクエリ実行

**主要な処理内容**：
1. json-modeによるJSON編集サポート
2. Tree-sitterによる高度な構文解析（json-ts-mode）
3. LSPサポート（json-language-server）
4. JSONパス表示・コピー機能
5. ブール値トグル、数値増減機能
6. 値のnull化機能
7. JSON整形機能
8. counsel-jqによるjqクエリ（ivy使用時）

**関連システム・外部連携**：
- json-language-server: JSON Language Server
- jq: JSONクエリツール

**権限による制御**：特になし。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | JSONバッファ | 主画面 | JSONファイルの編集 |

## 機能種別

言語サポート / データフォーマット

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| +lsp | フラグ | No | LSPサポートを有効化 | doom!ブロックで指定 |
| +tree-sitter | フラグ | No | Tree-sitterサポートを有効化 | doom!ブロックで指定 |

### 入力データソース

- JSONファイル（*.json）
- JSHint設定（*.jshintrc）
- ESLint設定（*.eslintrc）
- JSDoc設定（jsdoc.json）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| JSONパス | 文字列 | json-mode-show-path によるパス表示 |
| 整形済みJSON | テキスト | json-mode-beautify による整形 |

### 出力先

- ミニバッファ: JSONパス表示
- キルリング: json-mode-kill-path によるパスコピー
- バッファ: 整形結果

## 処理フロー

### 処理シーケンス

```
1. JSONファイルを開く
   └─ json-mode が起動
2. electric設定
   └─ 改行、コロン、ブレースでelectric動作
3. Tree-sitterモード有効時
   └─ json-ts-mode へリマップ
4. LSPモード有効時
   └─ lsp! フック実行
```

### フローチャート

```mermaid
flowchart TD
    A[JSONファイルを開く] --> B[json-mode起動]
    B --> C[electric設定]
    C --> D{+tree-sitter?}
    D -->|Yes| E[json-ts-mode]
    D -->|No| F[json-mode継続]
    E --> G{+lsp?}
    F --> G
    G -->|Yes| H[json-language-server接続]
    G -->|No| I[開発作業]
    H --> I
    I --> J{操作選択}
    J -->|パス表示| K[json-mode-show-path]
    J -->|ブールトグル| L[json-toggle-boolean]
    J -->|数値増減| M[json-increment/decrement-number-at-point]
    J -->|null化| N[json-nullify-sexp]
    J -->|整形| O[json-mode-beautify]
    J -->|jqクエリ| P[counsel-jq]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | 拡張子判定 | .json, .jshintrc, .eslintrc, jsdoc.json を json-mode で開く | ファイルオープン時 |
| BR-02 | electricキャラクタ | 改行、コロン、開き波括弧、閉じ波括弧でelectric動作 | json-mode有効時 |
| BR-03 | ブールトグル | true/false を相互に切り替え | json-toggle-boolean実行時 |
| BR-04 | パス表示形式 | ドット記法でJSONパスを表示（例: .foo.bar[0].baz） | json-mode-show-path実行時 |

### 計算ロジック

**数値増減**:
- `json-increment-number-at-point`: ポイント位置の数値を +1
- `json-decrement-number-at-point`: ポイント位置の数値を -1

## データベース操作仕様

### 操作別データベース影響一覧

データベース操作なし

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | なし | - | - |

### リトライ仕様

リトライ機能なし

## トランザクション仕様

トランザクション管理なし

## パフォーマンス要件

特になし

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

- JSON内の機密情報（APIキー等）の管理に注意

## 備考

- json-snatcherパッケージはjson-modeの依存として自動インストール
- counsel-jqは:completion ivyモジュール有効時のみ利用可能

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | config.el | `modules/lang/json/config.el` | モジュール全体の設定 |

**主要処理フロー**:
1. **3-4行目**: json-mode のモード設定
2. **6行目**: set-electric!設定
3. **8-9行目**: LSPフック設定
4. **11-19行目**: キーバインド設定

#### Step 2: キーバインドを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | config.el | `modules/lang/json/config.el` | map! によるキーバインド設定 |

**主要キーバインド**:
- `SPC m p`: json-mode-show-path（パス表示）
- `SPC m t`: json-toggle-boolean（ブールトグル）
- `SPC m d`: json-mode-kill-path（パス削除/コピー）
- `SPC m x`: json-nullify-sexp（null化）
- `SPC m +`: json-increment-number-at-point（数値+1）
- `SPC m -`: json-decrement-number-at-point（数値-1）
- `SPC m f`: json-mode-beautify（整形）

#### Step 3: Tree-sitter設定を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | config.el | `modules/lang/json/config.el` | json-ts-mode の設定 |

**主要処理フロー**:
- **23-32行目**: json-ts-mode設定、set-tree-sitter!、LSPフック

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

```
json-mode
    │
    ├─ set-electric! → 改行, コロン, 波括弧
    │
    ├─ キーバインド
    │      ├─ json-mode-show-path
    │      ├─ json-toggle-boolean
    │      ├─ json-mode-kill-path
    │      ├─ json-nullify-sexp
    │      ├─ json-increment-number-at-point
    │      ├─ json-decrement-number-at-point
    │      └─ json-mode-beautify
    │
    ├─ LSP (+lsp)
    │      └─ json-mode-local-vars-hook
    │             └─ lsp!
    │
    ├─ Tree-sitter (+tree-sitter)
    │      └─ json-ts-mode
    │             └─ json-ts-mode-local-vars-hook
    │                    └─ lsp!
    │
    └─ counsel-jq (:completion ivy)
           └─ jq クエリ実行
```

### データフロー図

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

JSONファイル ──────────▶ json-mode ─────────────────▶ シンタックスハイライト
        │                   │
        │                   ▼
        │              json-mode-show-path ────────▶ パス文字列（ミニバッファ）
        │
        │              json-toggle-boolean ────────▶ 反転されたブール値
        │
        │              json-mode-beautify ─────────▶ 整形済みJSON
        │
        └─ +tree-sitter ─▶ json-ts-mode ────────────▶ Tree-sitterハイライト
                              │
                              ▼
        +lsp ────────────▶ json-language-server ───▶ 補完/診断
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| config.el | `modules/lang/json/config.el` | ソース | モジュール設定、キーバインド |
| packages.el | `modules/lang/json/packages.el` | ソース | 依存パッケージ定義 |
