# 画面設計書 16-EditPreviewInternalLink画面

## 概要

本ドキュメントは、Wikipedia iOSアプリにおける内部リンクプレビュー画面（EditPreviewInternalLinkViewController）の設計仕様を定義するものです。

### 本画面の処理概要

内部リンクプレビュー画面は、記事編集時にウィキテキスト内の内部リンク（他のWikipedia記事へのリンク）をタップした際に、リンク先の記事のプレビューを表示するモーダル画面です。ユーザーはリンク先の記事内容を確認し、正しいリンクであることを確認できます。

**業務上の目的・背景**：Wikipedia記事を編集する際、内部リンクが正しい記事を指しているかを確認することは重要です。本画面は、編集プレビュー中に内部リンクの内容を素早く確認できるインターフェースを提供し、リンクミスを防ぎます。

**画面へのアクセス方法**：編集プレビュー画面でウィキテキスト内の内部リンク（[[記事名]]形式）をタップすることでアクセスします。

**主要な操作・処理内容**：
1. リンク先記事のプレビュー表示（ArticlePeekPreviewViewController相当）
2. 「OK」ボタンまたは背景タップで閉じる

**画面遷移**：
- 遷移元: 編集プレビュー画面（WebView内のリンクタップ）
- 遷移先: なし（モーダルを閉じて呼び出し元に戻る）

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

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 22 | 編集プレビュー | 主機能 | 内部リンクのプレビュー表示 |

## 画面種別

詳細 / プレビュー

## URL/ルーティング

iOSネイティブアプリのため、URLルーティングは適用されません。モーダル表示されます。

## 入出力項目

| 項目名 | 型 | 入力/出力 | 必須 | 説明 |
|--------|-----|---------|------|------|
| articleURL | URL | 入力 | 必須 | プレビュー対象の記事URL |
| dataStore | MWKDataStore | 入力 | 必須 | データストア |
| theme | Theme | 入力 | 任意 | 表示テーマ（デフォルト: .standard） |

## 表示項目

| 項目名 | 表示形式 | 説明 |
|--------|---------|------|
| 記事プレビュー | 埋め込みVC | ArticlePeekPreviewViewController相当のコンテンツ |
| OKボタン | ボタン | 閉じるためのボタン（"OK"） |
| 背景タップ領域 | ビュー | タップで閉じるための透明領域 |

## イベント仕様

### 1-OKボタンタップ

モーダルを閉じる処理。

- dismiss(animated: true)を呼び出し

### 2-背景タップ

モーダルを閉じる処理。

- UITapGestureRecognizerでtapViewのタップを検出
- dismiss(animated: true)を呼び出し

### 3-プレビューコンテンツ高さ変更

子ViewControllerのpreferredContentSizeに応じてコンテナの高さを調整。

- preferredContentSizeDidChange()でcontainerViewHeightConstraintを更新

## データベース更新仕様

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

ローカルデータベースへの更新はありません。

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 表示条件 |
|-------------|------|--------------|---------|
| CommonStrings.okTitle | ボタン | "OK" | 常時表示 |

## 例外処理

| 例外状況 | 処理内容 |
|---------|---------|
| 記事取得失敗 | プレビューコンテンツが空または読み込み中のまま |

## 備考

- wmf_addPeekableChildViewController()で記事プレビューを追加
- UIGestureRecognizerDelegateで背景タップを処理
- containerViewHeightConstraintで動的な高さ調整

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | EditPreviewInternalLinkViewController.swift | `Wikipedia/Code/EditPreviewInternalLinkViewController.swift` | 全体構造（74行のシンプルなVC） |

**主要処理フロー**:
1. **14-18行目**: init - articleURL、dataStoreの初期化
2. **33-42行目**: viewDidLoad - ボタン設定、プレビューVC追加、ジェスチャー設定
3. **44-51行目**: preferredContentSizeDidChange - 高さ制約の動的更新
4. **53-55行目**: dismissAnimated - 閉じる処理

#### Step 2: ジェスチャー処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | EditPreviewInternalLinkViewController.swift | `Wikipedia/Code/EditPreviewInternalLinkViewController.swift` | UIGestureRecognizerDelegate（58-62行目） |

**主要処理フロー**:
- **59-61行目**: gestureRecognizer(_:shouldReceive:) - tapViewのみタップを受け付ける

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

```
EditPreviewInternalLinkViewController
    │
    ├─ init(articleURL:dataStore:)
    │
    ├─ viewDidLoad()
    │      ├─ button.setTitle("OK")
    │      ├─ wmf_addPeekableChildViewController()
    │      │      └─ ArticlePeekPreviewViewController相当
    │      └─ tapGestureRecognizer設定
    │
    ├─ preferredContentSizeDidChange()
    │      └─ containerViewHeightConstraint更新
    │
    └─ dismissAnimated()
           └─ dismiss(animated: true)
```

### データフロー図

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

articleURL          wmf_addPeekableChildViewController()   UIView
dataStore      ───▶ (ArticlePeekPreviewViewController)  ───▶ (プレビュー表示)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| EditPreviewInternalLinkViewController.swift | `Wikipedia/Code/EditPreviewInternalLinkViewController.swift` | ソース | メインViewController |
| EditPreviewInternalLinkViewController.xib | `Wikipedia/Code/EditPreviewInternalLinkViewController.xib` | XIB | レイアウト定義 |
| UIViewController+PeekableChildViewController.swift | `Wikipedia/Code/UIViewController+PeekableChildViewController.swift` | ソース | プレビューVC追加ヘルパー |
| ArticlePeekPreviewViewController.swift | `Wikipedia/Code/ArticlePeekPreviewViewController.swift` | ソース | 記事プレビューVC |
