Skip to content

Commit 77b48c7

Browse files
planet6897claude
andcommitted
Merge local/task548: Task edwardkim#548 셀 inline TAC Shape margin + indent 정정 (cherry-pick @planet6897 1 commit + test fixup)
본 devel 측정 (페이지 8 셀 5 line 0 [푸코] rect): x=131.04 (PDF 155.6 와 -24.6 px 시프트). `table_layout.rs` 셀 안 inline TAC Shape 분기에 paragraph 의 margin_left + first_line_indent 미반영 결함. 본질 정정 (table_layout.rs +41 LOC): 1. effective_margin_left_line 헬퍼 추가 (paragraph_layout 와 동일 산식). 2. inline_x 산출 3 분기 (Left/Justify) 에 line_margin 가산. 3. para_margin_left_px / para_indent_px 추출. 측정 (수정 후): x=155.60 (PDF ±0.0). 검증: - cargo test --lib 1121 / test_548 +1 GREEN / 회귀 0건 - clippy 0 신규 - 6 샘플 73 페이지 광범위 sweep: 13 differ (의도된 셀 안 inline TAC Shape margin/indent 적용) cherry-pick 1 commit: - 3de0505 Task edwardkim#548 (`9dc40ddb` from @planet6897) - a0dad0d Task edwardkim#548 fixup (test_548 y 범위 본 devel 측정값 기준 조정) 처리 보고서: mydocs/pr/archives/pr_task548_report.md 검토 문서: mydocs/pr/archives/pr_task548_review.md closes edwardkim#548 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2 parents f807378 + 4ef1b79 commit 77b48c7

6 files changed

Lines changed: 392 additions & 5 deletions

File tree

mydocs/orders/20260504.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44

55
| Issue | 타스크 | 상태 | 비고 |
66
|------|--------|------|------|
7-
| **PR #551 Task #544** | 21_언어_기출 passage 글상자 우측 시프트 정정 (옵션 A2 cherry-pick, closes #544) | **완료 (핀셋 cherry-pick 머지 + push)** | 작업지시자 보고 "21_언어_기출_편집가능본.hwp 1/2/4/5/7/8/11/13/14 페이지 글상자 우측 시프트". 이슈 #544 (closed) 재오픈 후 PR #551 잔존 cherry-pick. 당초 검토 옵션 A3 (`1934161f` Task #552 + `05beb208` Task #544 v2 + `84d1d4b2` Task #544 v3) 채택했으나 B1 진단 결과 본 devel 의 Task #479 미적용 (pre-#479 trailing-ls 항상 가산 모델) 확인 → #552/v3 cherry-pick 시 #479-style 분기 신설로 광범위 회귀 위험. **옵션 A2 (`05beb208` 단독, #547+#544(1) 통합) 로 변경 채택**. 본질: `paragraph_layout.rs` (1) `box_x = col_area.x` / `box_w = col_area.width` (margin 미적용, paragraph border outline = col_area 전체) + (2) `inner_pad` 분기 제거 (visible-stroke + bs=0 인 경우 `margin_left = box_margin_left + inner_pad_left` 이중 적용 → `margin_left = box_margin_left` 단일 적용). 측정 (페이지 4 [7~9]): 박스 left 128.51→117.17 (PDF 117.0), width 402.5→425.17 (PDF 425.1), 본문 첫 글자 '평' x 153.12→128.51 (PDF 128.5). 9 박스 모두 정합. 검증: cargo test --lib 1120 / test_544+test_547 +2 GREEN / clippy 0 신규 / 5 샘플 58 페이지 광범위 sweep 38 differ (의도된 paragraph border 정합 변경, visible-stroke paragraph text -11.33 px 좌측 시프트 의도) / 회귀 검출 가능 영역 (비-border paragraph text) 0 변경. 작업지시자 시각 판정 통과. cherry-pick `457d5f33` (Task #544 v2 Stage 2 from @planet6897 `05beb208`). devel merge `f6039f32` push 완료, 이슈 #544 close. 처리 보고서: `mydocs/pr/archives/pr_551_v3_544_a2_report.md`. 검토 문서: `mydocs/pr/archives/pr_551_review_v3_544_a2.md`. 잔존 미반영: #552 / v3 (#479 미적용 모델로 발현 안 함, 별도 사이클 결정 대기), #548 Phase C (별개 본질 [푸코] 페이지). |
7+
| **PR #551 Task #544** | 21_언어_기출 passage 글상자 우측 시프트 정정 (옵션 A2 cherry-pick, closes #544) | **완료 (핀셋 cherry-pick 머지 + push, PR #560)** | 작업지시자 보고 "21_언어_기출_편집가능본.hwp 1/2/4/5/7/8/11/13/14 페이지 글상자 우측 시프트". 이슈 #544 (closed) 재오픈 후 PR #551 잔존 cherry-pick. 당초 검토 옵션 A3 (`1934161f` Task #552 + `05beb208` Task #544 v2 + `84d1d4b2` Task #544 v3) 채택했으나 B1 진단 결과 본 devel 의 Task #479 미적용 (pre-#479 trailing-ls 항상 가산 모델) 확인 → #552/v3 cherry-pick 시 #479-style 분기 신설로 광범위 회귀 위험. **옵션 A2 (`05beb208` 단독, #547+#544(1) 통합) 로 변경 채택**. 본질: `paragraph_layout.rs` (1) `box_x = col_area.x` / `box_w = col_area.width` (margin 미적용, paragraph border outline = col_area 전체) + (2) `inner_pad` 분기 제거 (visible-stroke + bs=0 인 경우 `margin_left = box_margin_left + inner_pad_left` 이중 적용 → `margin_left = box_margin_left` 단일 적용). 측정 (페이지 4 [7~9]): 박스 left 128.51→117.17 (PDF 117.0), width 402.5→425.17 (PDF 425.1), 본문 첫 글자 '평' x 153.12→128.51 (PDF 128.5). 9 박스 모두 정합. 검증: cargo test --lib 1120 / test_544+test_547 +2 GREEN / clippy 0 신규 / 5 샘플 58 페이지 광범위 sweep 38 differ (의도된 paragraph border 정합 변경, visible-stroke paragraph text -11.33 px 좌측 시프트 의도) / 회귀 검출 가능 영역 (비-border paragraph text) 0 변경. 작업지시자 시각 판정 통과. cherry-pick `457d5f33` (Task #544 v2 Stage 2 from @planet6897 `05beb208`). devel merge `f6039f32` push 완료, 이슈 #544 close, PR #560 등록. 처리 보고서: `mydocs/pr/archives/pr_551_v3_544_a2_report.md`. 검토 문서: `mydocs/pr/archives/pr_551_review_v3_544_a2.md`. 잔존 미반영: #552 / v3 (#479 미적용 모델로 발현 안 함, 별도 사이클 결정 대기), #548 Phase C (별개 본질 [푸코] 페이지, 다음 사이클). |
8+
| **Task #548** | 셀 inline TAC Shape margin_left + indent 정정 (closes #548) — [푸코] 페이지 8 | **완료 (핀셋 cherry-pick 머지 + push, PR #561)** | 이슈 #548 (closed) 재오픈 후 cherry-pick. 본 devel 측정 (페이지 8 셀 5 line 0 [푸코] rect): x=131.04 (PDF 155.6 와 -24.6 px 시프트). 본질: `table_layout.rs` 셀 안 inline TAC Shape (`Control::Shape` + `treat_as_char=true`) 분기에 paragraph 의 `margin_left + first_line_indent` 미반영. cherry-pick `9dc40ddb` (Task #544 v2 Stage 3 — Phase C #548 from @planet6897). 변경: `effective_margin_left_line` 헬퍼 + 3 분기에 `line_margin` 적용 (Picture target_line reset, Shape target_line reset, paragraph 시작) + `para_margin_left_px` / `para_indent_px` 추출. test fixup: y 범위 [685, 690] → [690, 710] 으로 조정 (본 devel #479 미적용 모델로 셀 y 위치가 fork 와 다름). 측정 (수정 후): x=**155.60** (PDF ±0.0). 검증: cargo test --lib 1121 / test_548 +1 GREEN / clippy 0 신규 / 6 샘플 73 페이지 광범위 sweep 13 differ (의도된 셀 안 inline TAC Shape margin/indent 적용). 작업지시자 시각 판정 통과. 처리 보고서: `mydocs/pr/archives/pr_task548_report.md`. 검토 문서: `mydocs/pr/archives/pr_task548_review.md`. **새 PR (Task #548) 등록** — `feedback_no_pr_accumulation` 메모리 적용 (PR #551 잔존 누적 회피). |
89

910
## 작업 메모
1011

mydocs/pr/pr_task548_report.md

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
# Task #548 핀셋 cherry-pick 처리 보고서
2+
3+
**처리 결정**: ✅ Task #548 단독 cherry-pick (`9dc40ddb` + test fixup)
4+
**작성일**: 2026-05-04
5+
**브랜치**: `local/task548`
6+
**검토 문서**: `mydocs/pr/pr_task548_review.md`
7+
**관련 이슈**: #548 (closed → reopen → closes)
8+
9+
## 1. 본질 정정
10+
11+
`src/renderer/layout/table_layout.rs` 셀 안 inline TAC Shape (`Control::Shape` + `treat_as_char=true`) 분기에 paragraph 의 `margin_left + first_line_indent` 미반영 결함 정정.
12+
13+
**측정 (페이지 8 셀 5 line 0 [푸코] rect)**:
14+
- 수정 전: x=131.04 (PDF 155.6 와 -24.6 px 시프트) ❌
15+
- 수정 후: x=**155.60** (PDF 정합 ±0.0) ✅
16+
17+
## 2. cherry-pick + fixup 절차
18+
19+
| commit | 내용 |
20+
|--------|------|
21+
| `3de05051` | cherry-pick `9dc40ddb` (Task #544 v2 Stage 3 — Phase C #548 from @planet6897). table_layout.rs Shape 분기 conflict 해소 (incoming 채택). |
22+
| `a0dad0d3` | test_548 의 y 범위 [685, 690][690, 710] 조정 (본 devel 의 #479 미적용 trailing-ls 모델로 셀 y 위치가 contributor fork 와 다름). |
23+
24+
**변경**: 3 files, +193 / -3
25+
- `src/renderer/layout/table_layout.rs` (+41 LOC): `effective_margin_left_line` 헬퍼 + 3 분기에 `line_margin` 적용 + `para_margin_left_px` / `para_indent_px` 추출
26+
- `src/renderer/layout/integration_tests.rs` (+2 / -2): `#[ignore]` 제거 + y 범위 조정
27+
- `mydocs/working/task_m100_544_v2_stage3.md` (+150 / 0): 컨트리뷰터 stage 보고서
28+
29+
## 3. 검증
30+
31+
### 3.1 단위 테스트
32+
33+
```
34+
cargo test --lib --release: 1121 passed / 0 failed / 2 ignored
35+
test_548_cell_inline_shape_first_line_indent_p8 GREEN
36+
```
37+
38+
baseline 1120 → +1 GREEN (test_548), 회귀 0건.
39+
40+
### 3.2 Clippy
41+
42+
```
43+
cargo clippy --release --lib: 0 errors / 0 warnings 신규
44+
```
45+
46+
pre-existing 2건 (`table_ops.rs:1007`, `object_ops.rs:298`) 동일 baseline.
47+
48+
### 3.3 광범위 회귀 sweep (6 샘플 73 페이지)
49+
50+
```
51+
73 SVGs (5 exam samples + 21_언어 15 페이지)
52+
13 differ (intended)
53+
60 byte-identical
54+
```
55+
56+
차이 본질 (sample exam_kor_005):
57+
- 셀 안 inline TAC Shape rect + 본문 text +2 px 시프트 (셀 paragraph 의 margin/indent 적용)
58+
- visible-stroke + paragraph margin 이 있는 셀 안 inline TAC Shape 만 영향
59+
60+
회귀 검출 가능 영역 (paragraph 텍스트 위치, 일반 shape 위치): 0 변경 ✅
61+
62+
### 3.4 영향 범위
63+
64+
| 샘플 | 페이지 | 변경 페이지 | 비고 |
65+
|------|-------|-----------|------|
66+
| 21_언어_기출 | 15 | 1 (페이지 8) | [푸코] inline shape 정합 |
67+
| exam_eng | 8 | 3 | 셀 안 small shape |
68+
| exam_kor | 20 | 6 | 동일 |
69+
| exam_math | 20 | 0 | 영향 없음 |
70+
| exam_science | 4 | 2 | 동일 |
71+
| 2010-01-06 | 6 | 0 (sample 누락) ||
72+
73+
## 4. 잔존 사항
74+
75+
### 4.1 시각 판정 게이트 (작업지시자 직접)
76+
77+
- `/tmp/diag548/after/21_언어_기출_편집가능본_008.svg` — 페이지 8 [푸코] 위치 PDF 정합 확인
78+
- `/tmp/diag548/before/``/tmp/diag548/after/` — 광범위 회귀 비교
79+
- 비교 PDF: `samples/21_언어_기출_편집가능본-2010.pdf` 페이지 8
80+
81+
### 4.2 PR #551 잔존 미반영 (별도 사이클 결정 대기)
82+
83+
| commit | 본질 | 비고 |
84+
|--------|------|------|
85+
| `1934161f` Task #552 | paragraph border 시작 직전 trailing ls 보존 | 본 devel #479 미적용 모델로 발현 안 함 |
86+
| `84d1d4b2` Task #544 v3 | 박스 안 sequential paragraph trailing-ls 보존 | 동일 이유 |
87+
| `0341a2a7` 다중 (#517/#518/#544 v3/#552) | layout 다중 정정 일괄 | 분해 불가 |
88+
| 기타 ~50 task || 작업지시자 결정 대기 |
89+
90+
## 5. 메모리 룰 정합
91+
92+
- [feedback_no_pr_accumulation] — 본 cherry-pick 은 PR #551 잔존이지만 **새 PR (Task #548) 로 등록**
93+
- [feedback_pdf_not_authoritative] — 한컴 2010 PDF 정합 + 작업지시자 시각 판정 게이트
94+
- [feedback_essential_fix_regression_risk] — 6 샘플 73 페이지 광범위 회귀 검증 + 본질 분석
95+
- [feedback_rule_not_heuristic]`effective_margin_left_line` 단일 룰 (paragraph_layout / table_layout 동일 산식)
96+
- [feedback_local_task_branches_origin_backup]`origin/local/task544_v2` (`9dc40ddb` 포함) 보존 유지
97+
98+
## 6. 후속 절차
99+
100+
1. local/task548 → devel merge (no-ff)
101+
2. devel push origin
102+
3. 이슈 #548 close (with cherry-pick commit reference)
103+
4. orders 20260504.md 갱신
104+
5. archives 이동
105+
6. **새 PR 등록** (planet6897:devel → edwardkim/rhwp:devel)

mydocs/pr/pr_task548_review.md

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
# Task #548 핀셋 cherry-pick 리뷰 — 셀 inline TAC Shape margin_left + indent
2+
3+
**원 PR**: [#551 (closed)](https://github.com/edwardkim/rhwp/pull/551) (참고용 — 본 cherry-pick 은 별도 사이클)
4+
**작성자**: @planet6897 (Jaeuk Ryu) — `9dc40ddb` Task #544 v2 Stage 3 (Phase C #548)
5+
**처리 결정**: ✅ **Task #548 단독 cherry-pick + test fixup**
6+
**작성일**: 2026-05-04
7+
**관련 이슈**: #548 (재오픈 → closes)
8+
9+
## 1. 본질
10+
11+
페이지 8 보기 표 (pi=167) 셀 5 (3-col 병합 본문 셀) 의 첫 줄 시작에 있는 [푸코] inline rectangle Shape (treat_as_char=true) 의 좌측 위치가 cell 좌측 가장자리 (x=131.04 px) 에 렌더 → PDF (한컴 2010, x≈155.6 px) 와 -24.6 px 시프트.
12+
13+
**root cause**: `src/renderer/layout/table_layout.rs` Shape 분기의 `inline_x` 산출에 paragraph 의 `margin_left + first_line_indent` 미반영.
14+
15+
| 경로 | x 산식 | 셀 5 line 0 결과 |
16+
|------|--------|----------------|
17+
| paragraph_layout (텍스트 경로) | col_x + effective_margin_left + ... | 131.04 + 24.56 = 155.60 ✓ |
18+
| table_layout (shape 경로, 수정 전) | inner_area.x | 131.04 ✗ |
19+
| table_layout (수정 후) | inner_area.x + line_margin | 155.60 ✓ |
20+
21+
## 2. 본 devel 측정 (현재 발현)
22+
23+
페이지 8 셀 5 line 0 [푸코] rect:
24+
- **x=131.04** px (PDF 기대값 155.6 와 -24.6 px 시프트) ❌
25+
- y=698.43, w=30.23, h=18.89
26+
27+
→ 이슈 #548 본문의 broken state 와 정확 일치. 본 devel cherry-pick 필요.
28+
29+
## 3. cherry-pick 대상
30+
31+
`9dc40ddb` (Task #544 v2 Stage 3 — Phase C #548 from @planet6897 fork)
32+
33+
**변경**:
34+
- `src/renderer/layout/table_layout.rs` (+41 LOC):
35+
1. `effective_margin_left_line` 헬퍼 추가 (paragraph_layout 의 line_indent 산식과 동일)
36+
2. `inline_x` 산출 3 분기 (Left/Justify) 에 `line_margin` 가산 (Picture target_line reset, Shape target_line reset, paragraph 시작)
37+
3. `para_margin_left_px` / `para_indent_px` 추출 (ParaShape 에서)
38+
- `src/renderer/layout/integration_tests.rs` (-1 LOC):
39+
- `test_548_cell_inline_shape_first_line_indent_p8``#[ignore]` 제거 → 활성화
40+
41+
## 4. cherry-pick 절차 + conflict resolution
42+
43+
```bash
44+
git checkout -b local/task548 devel
45+
git cherry-pick 9dc40ddb
46+
# table_layout.rs Shape 분기 (line 1648-1693): incoming 채택
47+
# integration_tests.rs: auto-merge
48+
```
49+
50+
**conflict resolution**:
51+
- `src/renderer/layout/table_layout.rs` Shape 분기 — HEAD 빈 영역 + incoming block 삽입. surrounding context 불일치로 auto-merge 실패. incoming 채택 (의미는 단순 삽입).
52+
- 다른 파일은 auto-merge 정상.
53+
54+
## 5. test fixup
55+
56+
contributor fork 의 test_548 가 y 범위 [685, 690] 검사. 본 devel 측정 y≈698.43 (Task #479 미적용 모델로 셀 y 위치 차이) → y 범위 [690, 710] 으로 조정.
57+
58+
```rust
59+
// 본 devel 의 #479 미적용 trailing-ls 모델로 셀 y 위치가 컨트리뷰터 fork
60+
// (y≈685-690) 대비 다름. 본 devel 측정 y≈698.43 → 범위 [690, 710] 으로 조정.
61+
if (w - 30.23).abs() < 0.5
62+
&& (h - 18.89).abs() < 0.5
63+
&& y > 690.0 && y < 710.0
64+
```
65+
66+
## 6. 검증
67+
68+
| 항목 | 결과 |
69+
|------|------|
70+
| `cargo test --lib --release` | 1121 passed / 0 failed / 2 ignored — baseline +1 GREEN (test_548) |
71+
| `cargo clippy --release --lib` | 신규 결함 0건 (pre-existing 2건 동일 baseline) |
72+
| 페이지 8 [푸코] rect | x=131.04 → **155.60** (PDF 155.6 ±0.0) ✅ |
73+
| 광범위 sweep (6 샘플 73 페이지) | 13 differ / 60 byte-identical |
74+
75+
**광범위 차이의 본질** (sample exam_kor_005):
76+
- 셀 안 작은 box 의 shape rect + text +2 px 시프트 (셀 paragraph 의 margin/indent 적용)
77+
- visible-stroke + paragraph margin 이 있는 셀 안 inline TAC Shape 만 영향
78+
79+
## 7. 작업지시자 결정 사항
80+
81+
1. cherry-pick 채택 (`9dc40ddb` + test fixup)
82+
2. 작업지시자 시각 판정 (페이지 8 [푸코] + 광범위 sweep)
83+
3. 통과 시 devel merge / push / 이슈 #548 close + 새 PR 등록
84+
4. 본 cherry-pick 사이클은 PR #551 잔존이지만 `feedback_no_pr_accumulation` 메모리 적용 → **새 PR 등록**
85+
86+
## 8. 메모리 룰 정합
87+
88+
- [feedback_no_pr_accumulation] — 본 cherry-pick 은 PR #551 잔존이지만 새 PR/이슈 (Task #548) 로 등록
89+
- [feedback_pdf_not_authoritative] — 한컴 2010 PDF 정합 + 작업지시자 시각 판정 게이트
90+
- [feedback_essential_fix_regression_risk] — 6 샘플 73 페이지 광범위 회귀 검증 (13 differ, 본질 분석 완료)
91+
- [feedback_rule_not_heuristic]`effective_margin_left_line` 단일 룰 (paragraph_layout / table_layout 동일 산식)
92+
- [feedback_visual_regression_grows] — 작업지시자 직접 시각 판정 게이트
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
# Task #544 v2 Stage 3 보고서
2+
3+
## 목적
4+
5+
Phase C 재적용 — 셀 내부 inline TAC Shape (Picture / Shape) 의 left x 산식에 paragraph margin_left + first-line indent 반영. paragraph_layout 텍스트 경로와 셀 inline 경로의 위치 일관성 보장.
6+
7+
## 적용 변경
8+
9+
### 1. effective_margin_left_line 헬퍼 추가 (table_layout.rs:13~28)
10+
11+
```rust
12+
/// [Task #548] paragraph 의 line N 에 적용되는 effective margin_left.
13+
/// paragraph_layout.rs 의 line_indent 산식과 동일 (단일 룰).
14+
/// - positive indent: line 0 에만 +indent 적용 (첫줄 들여쓰기)
15+
/// - negative indent (hanging): line N≥1 에 +|indent| 적용
16+
/// - indent=0: 모든 line 에 margin_left 만 적용
17+
fn effective_margin_left_line(margin_left: f64, indent: f64, line_n: usize) -> f64 {
18+
let line_indent = if indent > 0.0 {
19+
if line_n == 0 { indent } else { 0.0 }
20+
} else if indent < 0.0 {
21+
if line_n == 0 { 0.0 } else { indent.abs() }
22+
} else {
23+
0.0
24+
};
25+
margin_left + line_indent
26+
}
27+
```
28+
29+
### 2. inline_x 산출 3 분기 (Left/Justify) 에 line_margin 가산
30+
31+
#### 분기 (1) — paragraph 시작 (line 0)
32+
33+
```rust
34+
let mut inline_x = {
35+
let line_w = ...;
36+
let line_margin = effective_margin_left_line(para_margin_left_px, para_indent_px, 0);
37+
match para_alignment {
38+
Center | Distribute => inner_area.x + (inner_area.width - line_w).max(0.0) / 2.0,
39+
Right => inner_area.x + (inner_area.width - line_w).max(0.0),
40+
_ => inner_area.x + line_margin, // [Task #548] 추가
41+
}
42+
};
43+
```
44+
45+
#### 분기 (2) — Picture target_line reset (line ~1582)
46+
#### 분기 (3) — Shape target_line reset (line ~1674)
47+
48+
각 분기에 `line_margin = effective_margin_left_line(..., target_line)` 추가, Left/Justify 케이스에 `+ line_margin` 가산.
49+
50+
### 3. para_margin_left_px / para_indent_px 추출 (line ~1512)
51+
52+
```rust
53+
let para_margin_left_px = styles.para_styles.get(para.para_shape_id as usize)
54+
.map(|s| s.margin_left).unwrap_or(0.0);
55+
let para_indent_px = styles.para_styles.get(para.para_shape_id as usize)
56+
.map(|s| s.indent).unwrap_or(0.0);
57+
```
58+
59+
### 4. test_548 의 `#[ignore]` 제거
60+
61+
RED → GREEN 전환.
62+
63+
## 검증
64+
65+
### 단위 테스트
66+
67+
```
68+
cargo test --lib
69+
test result: ok. 1122 passed; 0 failed; 2 ignored; 0 measured
70+
```
71+
72+
- Stage 2 baseline: 1121 passed / 3 ignored
73+
- 현재: 1122 passed / 2 ignored
74+
- Δ = **+1 GREEN, -1 ignored** (test_548)
75+
- 회귀 **0건**
76+
77+
### 회귀 가드 통합 테스트
78+
79+
| Suite | 결과 |
80+
|-------|------|
81+
| issue_301 | 1 GREEN |
82+
| issue_418 | 1 GREEN |
83+
| issue_501 | 1 GREEN |
84+
| issue_505 | 9 GREEN |
85+
| issue_514 | 3 GREEN |
86+
| issue_516 | 8 GREEN |
87+
| issue_530 | 1 GREEN |
88+
| issue_546 | 1 GREEN |
89+
90+
**24 / 24 GREEN, 회귀 0건**.
91+
92+
### test_548 측정값 변화
93+
94+
| 좌표 | Stage 1 (수정 전) | Stage 3 (수정 후) | PDF 기대 |
95+
|------|--------------------|-------------------|----------|
96+
| 셀 5 line 0 [푸코] puko_x | 131.04 | **155.6 ±2** | 155.6 |
97+
98+
→ paragraph_layout 텍스트 "는" 의 위치 (185.83) 와 정합. 텍스트와 shape 위치 일관성 회복.
99+
100+
## 코드 영향
101+
102+
| 파일 | 변경 | 비고 |
103+
|------|------|------|
104+
| `src/renderer/layout/table_layout.rs` | +40 LOC (헬퍼 + 3 분기 + para 추출) | 정정 본문 |
105+
| `src/renderer/layout/integration_tests.rs` | -1 ignore attribute | test_548 GREEN |
106+
107+
## 다음 단계
108+
109+
Stage 4 — 최종 보고서:
110+
- 광범위 svg_snapshot 회귀 (의도된 정정 vs 회귀 분석)
111+
- WASM 빌드 + clippy 0 확인
112+
- `mydocs/report/task_m100_544_v2_report.md`
113+
- `mydocs/orders/20260503.md` 갱신 ("잔존 (별도 이슈 후보)" 항목 정정)

src/renderer/layout/integration_tests.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1017,7 +1017,6 @@ mod tests {
10171017
///
10181018
/// 본 테스트는 fix 적용 전 RED, fix 적용 후 GREEN.
10191019
#[test]
1020-
#[ignore = "Task #548 RED — fix 적용 전 실패 expected"]
10211020
fn test_548_cell_inline_shape_first_line_indent_p8() {
10221021
let Some(core) = load_document("samples/21_언어_기출_편집가능본.hwp") else {
10231022
return;
@@ -1043,9 +1042,11 @@ mod tests {
10431042
let y = match parse_attr("y") { Some(v) => v, None => continue };
10441043
let w = match parse_attr("width") { Some(v) => v, None => continue };
10451044
let h = match parse_attr("height") { Some(v) => v, None => continue };
1045+
// 본 devel 의 #479 미적용 trailing-ls 모델로 셀 y 위치가 컨트리뷰터 fork
1046+
// (y≈685-690) 대비 다름. 본 devel 측정 y≈698.43 → 범위 [690, 710] 으로 조정.
10461047
if (w - 30.23).abs() < 0.5
10471048
&& (h - 18.89).abs() < 0.5
1048-
&& y > 685.0 && y < 690.0
1049+
&& y > 690.0 && y < 710.0
10491050
{
10501051
puko_x = Some(x);
10511052
break;

0 commit comments

Comments
 (0)