---
generated_at: 2026-01-28 10:00:00
metrics:
  claims_total: 28
  claims_with_evidence: 26
  claims_without_evidence: 2
confidence_derived: 0.93
---

# 根拠レポート: 21-記事編集

## 概要

本レポートは「機能設計書 21-記事編集」に記載された内容の根拠を示す。各記述がソースコードのどの部分に基づいているかを明示する。

## 根拠一覧

### 1. 処理概要に関する根拠

| 主張 | 根拠ファイル | 該当行 | 根拠内容 |
|------|-------------|--------|----------|
| ウィキテキストをMediaWiki APIから取得 | EditorViewController.swift | L48, L357-396 | `wikitextFetcher = WikitextFetcher(session: dataStore.session, configuration: dataStore.configuration)` および `loadWikitext` メソッド |
| シンタックスハイライト付きソースエディタ表示 | EditorViewController.swift | L557-561 | `WMFSourceEditorViewModel` と `WMFSourceEditorViewController` の初期化 |
| 編集通知の表示 | EditorViewController.swift | L296-333 | `loadEditNotices` メソッドと `presentEditNoticesIfAvailable` メソッド |
| 検索・置換機能の提供 | EditorViewController.swift | L755-761, L586-600 | `sourceEditorViewControllerDidTapFind` と `showFocusNavigationView`/`hideFocusNavigationView` |
| 元に戻す・やり直し操作 | EditorViewController.swift | L746-749, L840-846 | `sourceEditorDidChangeUndoState` と `didTapUndoButton`/`didTapRedoButton` |

### 2. 入力パラメータに関する根拠

| パラメータ | 根拠ファイル | 該当行 | 根拠内容 |
|-----------|-------------|--------|----------|
| pageURL | EditorViewController.swift | L38, L91 | `private let pageURL: URL` プロパティ宣言と初期化 |
| sectionID | EditorViewController.swift | L39, L91 | `let sectionID: Int?` プロパティ宣言と初期化 |
| editFlow | EditorViewController.swift | L17-20, L40 | `enum EditFlow` 定義と `private let editFlow: EditFlow` |
| source | EditorViewController.swift | L22-25, L41 | `enum Source` 定義と `private let source: Source` |
| articleSelectedInfo | EditorViewController.swift | L43, L98 | `private let articleSelectedInfo: SelectedTextEditInfo?` |
| editTag | EditorViewController.swift | L44, L99 | `private let editTag: WMFEditTag` |

### 3. 処理フローに関する根拠

| 処理ステップ | 根拠ファイル | 該当行 | 根拠内容 |
|-------------|-------------|--------|----------|
| コンテンツ並列読み込み | EditorViewController.swift | L191-294 | `loadContent()` メソッド内の `DispatchGroup` を使用した並列処理 |
| 編集通知取得 | EditorViewController.swift | L200-212 | `group.enter()` と `loadEditNotices` の呼び出し |
| ウィキテキスト取得 | EditorViewController.swift | L214-226 | `group.enter()` と `loadWikitext` の呼び出し |
| 一時アカウント状態確認 | EditorViewController.swift | L228-235 | `group.enter()` と `checkWikiStatus` の呼び出し |
| ブロック時の処理 | EditorViewController.swift | L254-256, L444-467 | `blockedError` チェックと `presentBlockedError` |
| 保護ページ時の処理 | EditorViewController.swift | L257-259, L469-493 | `protectedPageError` チェックと `presentProtectedPageWarning` |
| ソースエディタ追加 | EditorViewController.swift | L285-288, L495-584 | `addChildEditor` メソッドの呼び出しと実装 |

### 4. 編集フロー分岐に関する根拠

| フロー | 根拠ファイル | 該当行 | 根拠内容 |
|--------|-------------|--------|----------|
| editorPreviewSave | EditorViewController.swift | L833-834, L652-673 | `case .editorPreviewSave: showEditPreview(editFlow: editFlow)` |
| editorSavePreview | EditorViewController.swift | L831-832, L675-698 | `case .editorSavePreview: showEditSave(editFlow: editFlow)` |

### 5. ビジネスルールに関する根拠

| ルールNo | 根拠ファイル | 該当行 | 根拠内容 |
|---------|-------------|--------|----------|
| BR-001 | EditorViewController.swift | L421-442 | `checkUserGroupLevelCanEdit` メソッドで編集権限をチェック |
| BR-002 | EditorViewController.swift | L254-256, L276-277 | `blockedError` のチェックと `editCloseProblemSource = .blockedMessage` |
| BR-003 | EditorViewController.swift | L263-269, L315-321 | `editNoticesViewModel` のチェックと `presentEditNoticesIfNecessary` |
| BR-004 | EditorViewController.swift | L64-66, L289-292 | `shouldShowEditAlert` プロパティと警告表示処理 |
| BR-005 | EditorViewController.swift | L386-390, L1132-1136 | `onloadSelectRange` の計算と `htmlInfo()` メソッド |

### 6. エラー処理に関する根拠

| エラー種別 | 根拠ファイル | 該当行 | 根拠内容 |
|-----------|-------------|--------|----------|
| 接続エラー | EditorViewController.swift | L398-408 | `wmf_isNetworkConnectionError()` チェックと `editCloseProblemSource = .connectionError` |
| ブロックエラー | EditorViewController.swift | L379, L444-467 | `apiError.code.contains("block")` と `presentBlockedError` |
| 保護エラー | EditorViewController.swift | L377-378, L469-493 | `apiError.code.contains("protectedpage")` と `presentProtectedPageWarning` |
| 選択範囲エラー | EditorViewController.swift | L282-285, L335-342 | `onloadSelectRange.location == NSNotFound` と `presentFailToFindSelectedRangeAlert` |
| サーバーエラー | EditorViewController.swift | L410-418 | `else` ブロックでの汎用エラー処理と `editCloseProblemSource = .serverError` |

### 7. UserDefaults操作に関する根拠

| キー | 根拠ファイル | 該当行 | 根拠内容 |
|-----|-------------|--------|----------|
| didShowInformationEditingMessage | EditorViewController.swift | L65, L291 | `UserDefaults.standard.didShowInformationEditingMessage` |
| wmf_IsSyntaxHighlightingEnabled | EditorViewController.swift | L557 | `UserDefaults.standard.wmf_IsSyntaxHighlightingEnabled` |
| wmf_alwaysDisplayEditNotices | EditorViewController.swift | L316 | `UserDefaults.standard.wmf_alwaysDisplayEditNotices` |
| didShowEditingOnboarding | ArticleViewController+Editing.swift | L114, L122 | `UserDefaults.standard.didShowEditingOnboarding` |

### 8. デリゲート実装に関する根拠

| デリゲート | 根拠ファイル | 該当行 | 根拠内容 |
|-----------|-------------|--------|----------|
| EditorViewControllerDelegate | EditorViewController.swift | L8-11 | プロトコル定義 |
| WMFSourceEditorViewControllerDelegate | EditorViewController.swift | L745-808 | extension実装 |
| EditorNavigationItemControllerDelegate | EditorViewController.swift | L812-883 | extension実装 |
| EditNoticesViewControllerDelegate | EditorViewController.swift | L1095-1128 | extension実装 |

## 根拠なし項目

| 項目 | 理由 |
|------|------|
| パフォーマンス要件（5秒、3秒等） | ソースコード内に明示的なタイムアウト設定が見つからない。スピナー遅延の1秒は L179 で確認 |
| トランザクション仕様 | 本機能は編集準備のみで、実際の保存処理は EditSaveViewController で行われるため |

## 信頼度評価

- **claims_total**: 28（処理概要5、入力6、処理フロー7、フロー分岐2、ビジネスルール5、エラー5、UserDefaults4、デリゲート4 - 重複除外後）
- **claims_with_evidence**: 26
- **claims_without_evidence**: 2
- **confidence_derived**: 26/28 = 0.93

## 検証方法

1. 各根拠ファイルの該当行を確認し、記述内容と一致することを検証
2. メソッド呼び出し関係が正確であることをコードトレースで確認
3. 列挙型・構造体の定義が設計書の記述と一致することを確認
