# 画面設計書 35-TalkPageCoffeeRoll画面

## 概要

本ドキュメントは、Wikipedia iOSアプリにおけるTalkPageCoffeeRoll画面の設計仕様を定義するものです。

### 本画面の処理概要

TalkPageCoffeeRoll画面は、トークページのヘッダー部分に表示される「Coffee Roll」（トークページの紹介テキストやウェルカムメッセージ）の全文を表示する画面です。TalkPage画面のヘッダーで「Read more」をタップした際に遷移する詳細表示画面です。

**業務上の目的・背景**：
トークページのヘッダー領域は限られているため、長いウェルカムメッセージや説明文を完全に表示できない場合があります。この画面は、そうしたコンテンツを全文で閲覧できるようにするための補助画面です。

**画面へのアクセス方法**：
TalkPage画面のヘッダー部分にある「Read more」ボタンをタップすることで遷移します。

**主要な操作・処理内容**：
1. Coffee Rollテキストの全文表示
2. テキスト内のリンクのタップ処理
3. テーマ適用

**画面遷移**：
- 遷移元：TalkPage画面
- 遷移先：リンク先のページ（Article画面、外部URL等）

**権限による表示制御**：
特に権限による表示制御はありません。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 27 | トークページ表示・投稿 | 補助機能 | トークページの補助表示 |

## 画面種別

詳細（テキスト表示）

## URL/ルーティング

本画面は独立したURLを持たず、TalkPage画面からのpush遷移でアクセスされます。

## 入出力項目

| 項目名 | 入力/出力 | データ型 | 説明 |
|--------|----------|---------|------|
| theme | 入力 | Theme | テーマ設定 |
| viewModel | 入力 | TalkPageCoffeeRollViewModel | Coffee Rollデータ |

## 表示項目

| 項目名 | データ型 | 説明 |
|--------|---------|------|
| TalkPageCoffeeRollView | UIView | メインビュー |
| coffeeRollTextView | UITextView | Coffee Rollテキスト |

## イベント仕様

### 1-リンクタップ

テキスト内のリンクをタップすると、LinkCoordinatorまたはレガシーナビゲーションを使用して該当ページに遷移します。

### 2-ナビゲーションバー設定

viewWillAppearで「Talk」タイトルのナビゲーションバーを設定します。

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

本画面はデータベースを更新しません（読み取り専用）。

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| なし | - | - | 本画面は表示のみ |

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 表示条件 |
|-------------|------|--------------|---------|
| talk-pages-view-title | タイトル | "Talk" | ナビゲーションバー |

## 例外処理

| 例外条件 | 処理内容 |
|---------|---------|
| リンク先URLが無効な場合 | ナビゲーションをスキップ（何も起こらない） |
| coffeeRollTextがnilの場合 | 空のビューを表示 |

## 備考

- ThemeableViewControllerを継承
- WMFNavigationBarConfiguringプロトコルに準拠
- TalkPageTextViewLinkHandlingプロトコルでリンク処理を実装
- RTL（右から左）言語対応（semanticContentAttribute）

---

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

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

### 推奨読解順序

#### Step 1: データ構造を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | TalkPageCoffeeRollViewModel.swift | `Wikipedia/Code/TalkPageCoffeeRollViewModel.swift` | シンプルなViewModel |

**読解のコツ**: TalkPageCoffeeRollViewModelはcoffeeRollText、talkPageURL、semanticContentAttributeの3プロパティのみを持つシンプルな構造です。

**主要プロパティ**:
- **5行目**: coffeeRollText - 表示するテキスト
- **6行目**: talkPageURL - リンク解決に使用するベースURL
- **7行目**: semanticContentAttribute - RTL対応

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | TalkPageCoffeeRollViewController.swift | `Wikipedia/Code/TalkPageCoffeeRollViewController.swift` | 小規模なViewController |

**主要処理フロー**:
1. **24-28行目**: init(theme:viewModel:)で初期化
2. **18-22行目**: loadView()でTalkPageCoffeeRollViewを生成、configure()呼び出し
3. **34-37行目**: viewDidLoadでlinkDelegate設定
4. **39-48行目**: viewWillAppearでナビゲーションバー設定

#### Step 3: リンク処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | TalkPageCoffeeRollViewController.swift | `Wikipedia/Code/TalkPageCoffeeRollViewController.swift` | TalkPageTextViewLinkHandling実装 |

**主要処理フロー**:
- **60-86行目**: tappedLink(_:sourceTextView:)でリンク処理
- **63-65行目**: talkPageURLを基準にした相対URL解決
- **74-81行目**: LinkCoordinatorによるナビゲーション試行
- **82-84行目**: 失敗時はlegacyNavigateActionでフォールバック

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

```
TalkPageViewController
    │
    └─ userDidTapCoffeeRollReadMoreButton() (TalkPageViewController.swift:332-336)
           │
           └─ TalkPageCoffeeRollViewController
                  │
                  ├─ init(theme:viewModel:)
                  │
                  ├─ loadView()
                  │      └─ TalkPageCoffeeRollView.configure(viewModel:)
                  │
                  ├─ viewDidLoad()
                  │      └─ coffeeRollView.linkDelegate = self
                  │
                  └─ TalkPageTextViewLinkHandling
                         └─ tappedLink(_:sourceTextView:)
                                ├─ LinkCoordinator.start() → 成功時遷移
                                └─ navigate(to:userInfo:) → フォールバック
```

### データフロー図

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

TalkPageCoffeeRollViewModel ──▶ TalkPageCoffeeRollView    ──────▶ UITextView表示
                                .configure(viewModel:)
                               │
                               ▼
Link tap                ──────▶ tappedLink()              ──────▶ ページ遷移
                               │
                               ├─ URL解決 (relativeTo: talkPageURL)
                               │
                               └─ LinkCoordinator / navigate()
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| TalkPageCoffeeRollViewController.swift | `Wikipedia/Code/TalkPageCoffeeRollViewController.swift` | ソース | ViewController |
| TalkPageCoffeeRollView.swift | `Wikipedia/Code/TalkPageCoffeeRollView.swift` | ソース | View |
| TalkPageCoffeeRollViewModel.swift | `Wikipedia/Code/TalkPageCoffeeRollViewModel.swift` | ソース | ViewModel |
| TalkPageViewController.swift | `Wikipedia/Code/TalkPageViewController.swift` | ソース | 遷移元VC |
| LinkCoordinator.swift | `Wikipedia/Code/LinkCoordinator.swift` | ソース | リンクナビゲーション |
