Task #680: nested 1x1 wrapper 표 외곽 테두리 누락 정정#681
Conversation
`src/renderer/layout/table_layout.rs::layout_table` 의 1x1 wrapper 분기는 외부 1x1 표를 무시하고 내부 nested 표만 직접 layout 한다. 외부 1x1 표가 자료 박스 외곽 테두리 역할 (padding + border_fill 정의) 인 경우 외곽선이 SVG 출력에서 누락되었다. 샘플: - samples/exam_social.hwp 페이지 1 단 1 4번 자료 박스 (pi=15) - 외부 1x1: padding=(850,850,850,850), border_fill_id=6 - 내부 6x3: 대화체 셀 16개 (그림 6개 포함) - 한컴2022 PDF (pdf/exam_social-2022.pdf) 에서 외곽 박스 시각 정합 정정: wrapper 분기 진입 시 다음 조건 AND 만족 시 외곽 4개 라인을 col_node 에 추가 (회귀 영역 좁힘): A) depth == 0 (top-level 표) B) 외부 셀 padding ≠ 0 (자료 박스 의미 있음) C) border_fill 의 borders 중 하나라도 None 아님 (테두리 정의) 외곽 박스 size 는 외부 표 IR size 가 아니라 nested layout 결과 사용: - width: nested.common.width (nested 표 측정 너비) - height: y_end - y_start (nested layout 실제 결과 높이) → 내부 표 영역과 정확히 정합. 외부 표 IR size (411.92×370.32) 사용 시 nested 측정 결과 (390.65×343.88) 와 차이로 5번 박스와 위치 부정합. 회귀 차단 가드: tests/issue_nested_table_border.rs (1 통합 테스트) - 4번 박스 외곽 4개 라인 좌표 검증 (390.65×343.88, x=549.88~940.53, y=331.53~675.41) 검증: - cargo test --release --lib: 1155 passed (회귀 0) - cargo test --release (통합): all GREEN - issue_nested_table_border 1/1 - build --release - 광범위 sweep (samples/ 187 fixture): 페이지 카운트 변동 0 (외곽 박스만 추가, 페이지 분할 로직 무관) 시각 영향: 4번 박스 외곽 4개 라인 (stroke=#000000, width=0.75) 출력. 내부 6×3 셀들은 wrapper 분기 그대로 → 시각 위치 변경 없음. 주의 사항: 본 정정은 외곽 박스만 추가. 외부 셀 padding (3mm) 영역 적용은 미포함 (내부 표가 외곽 박스 가장자리까지 닿음). 한컴2022 PDF 는 padding 안쪽으로 내부 표 inset — 이는 별도 후속 영역 (wrapper 분기 본질 정정 또는 nested padding inset). Closes edwardkim#680 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
CI Build & Test 실패 원인 정정: clippy::needless_late_init lint 위반 2건. outer_x_for_box / outer_w_for_box 를 분리 선언 후 단일 경로 대입 패턴 → 대입 시점에 let 바인딩으로 통합. 분기 없이 단일 경로로 대입되는 코드 흐름이라 늦은 초기화 불필요. 기존 동작 변경 없음 (clippy 경고만 해소). 검증: - cargo build --release ✅ - cargo test --release --test issue_nested_table_border ✅ (1/1)
closes #680 2 commits 단계별 보존: - 1787731 Task #680: nested 1x1 wrapper 표 외곽 테두리 누락 정정 - 2eca210 Task #680: clippy needless_late_init 정정 (CI rustc 1.95.0) 본질 정정: - src/renderer/layout/table_layout.rs:152 wrapper 분기 영역에 외곽선 추가 - 3 조건 AND 가드: depth==0 + 외부 셀 padding != 0 + border_fill borders not None - nested 측정 결과 영역 사용 영역 (외부 표 IR size 영역 사용 시 5번 박스 위치 부정합) - 외곽 4개 라인 (좌/우/상/하) col_node 추가 본 환경 검증: - cherry-pick 충돌 0건 (Auto-merging table_layout.rs) - cargo test --release ALL PASS 1165 lib + svg 7/7 + clippy clean - issue_nested_table_border ❌ 실패 (hardcoded 좌표 영역 PR #679 머지 후 영역 시프트 ~6.67px) - 외곽선 4개 라인 영역 SVG 영역 정상 출력 영역 (직접 grep 영역 검증) PR: #681 컨트리뷰터: @planet6897 (Jaeuk Ryu) — 30+ 사이클 핵심 컨트리뷰터 작업지시자 시각 검증: 'wasm 빌드해보세요' 영역 (웹 에디터 안 보임 영역 영역 점검)
PR #681 (Task #680): nested 1x1 wrapper 표 외곽 테두리 누락 정정 - merge commit: e8671d6 (2 commits 단계별 보존 no-ff merge) - 본질: table_layout.rs:152 wrapper 분기 영역에 외곽선 추가 (3 조건 AND 가드 + nested 측정 결과 영역 사용) - 본 환경 결정적 검증 1165 lib + svg_snapshot 7/7 + issue_546/issue_554 13/13 + clippy clean - 회귀 차단 가드 hardcoded 좌표 fragility 발견 (PR #679 머지 후 ~6.67px 시프트) - WASM 빌드 4,597,064 bytes - 작업지시자 시각 판정: 1차 stale WASM 회귀 → 2차 WASM 빌드 후 ★ 통과 잔존 후속: (a) 회귀 차단 가드 hardcoded 좌표 정정 (b) padding 정합 (외부 셀 padding 3mm inset) 컨트리뷰터: @planet6897 (Jaeuk Ryu) — 30+ 사이클 핵심 컨트리뷰터 closes #680
|
@planet6897 님 30+ 사이클 PR 처리 완료입니다. 본 환경 검증 결과: 결정적 검증 통과:
광범위 회귀 sweep: 회귀 0 ✅ 4번 박스 외곽선 SVG 직접 검증: WASM 빌드 (`pkg/rhwp_bg.wasm` 4,597,064 bytes) 후 작업지시자 시각 판정:
처리: 2 commits 단계별 보존 no-ff merge.
본질 정정 영역의 정확성: `table_layout.rs:152` wrapper 분기 영역의 외곽선 추가 영역 — 3 조건 AND 가드 (depth==0 + outer padding != 0 + border_fill borders not None) + nested 측정 결과 영역 사용 영역 (외부 표 IR size 영역 영역 5번 박스 위치 부정합). 회귀 차단 가드 영역의 fragility 영역: `tests/issue_nested_table_border.rs` 영역의 hardcoded 좌표 (y=331.53/675.41) 영역 영역 PR #679 (Task #676) 영역 머지 후 영역 ~6.67px 시프트 영역 영향 영역 영역 → 본 환경 (y=324.87/668.75) 영역과 정합 부재 영역. 본 PR 본질 (외곽선 4 라인 SVG 정상 출력) 영역 정합 영역. 후속 영역 정정 권장 영역. 잔존 영역 분리 (PR 본문 명시):
처리 보고서: `mydocs/pr/archives/pr_681_report.md` closes #680 |
closes #677 1 commit (2a400aa): - pi=16 PartialParagraph y 누적 결함 정정 (layout.rs:2120-2147) - U+F081C HWP PUA 채움 문자 폭 0 정정 (text_measurement.rs) - 한컴 워터마크 모드 변환 미적용 정정 (svg.rs + web_canvas.rs) 본 환경 검증: - cherry-pick 충돌 0건 - cargo test --release ALL PASS (1165 lib + svg_snapshot 8/8 (issue_677 신규 포함) + issue_546/issue_554 13/13 + clippy clean) - issue_nested_table_border 영역 잔존 영역 (PR #681 hardcoded 좌표 fragility) - 광범위 sweep 7 샘플 170 페이지: same=169 / diff=1 (aift p1 영역 PR #687 정정 부수 영향 영역) 핵심 시각 판정 게이트: - samples/복학원서.hwp p1: pi=16 overflow 273.1→2.5px, 3×3 표 x=716→63.69, 워터마크 정합 - samples/aift.hwp p1: 인라인 TAC + PartialParagraph 패턴 영역의 +8.43px 시프트 (정정 부수 영향 영역) PR: #687 컨트리뷰터: @planet6897 (Jaeuk Ryu) — 30+ 사이클 핵심 컨트리뷰터
CI failure 영역 본질: PR #681 영역의 회귀 차단 가드 영역 영역 PR #679 (Task #676 trailing empty paragraph) 영역 머지 영역 후 영역 ~6.67px 시프트 영역 영향 영역 영역 hardcoded 좌표 (y=331.53/675.41) 영역 영역 본 환경 (y=324.87/668.75) 영역과 정합 부재 영역으로 영역 실패 영역. CI 영역에서도 영역 동일 실패 영역 (devel 영역 push 후 영역). PR #687 (Task #677) 영역의 layout.rs:2120-2147 영역 정정 영역 영역 추가 영역으로 영역 인라인 TAC + PartialParagraph 패턴 영역의 fixture 영역 (aift, exam_social) 영역 영역 영역 시프트 영역 영향 영역 영역 추가 영역 발생 영역. 정정 (메인테이너 hardcoded 좌표 영역 fragility 정정): - y 좌표 영역 hardcoded 영역 회피 영역 - x 좌표 영역 (lx=549.88, rx=940.53) 영역과 stroke 영역 본질 영역만 영역 검증 - 외곽선 4 라인 영역의 본질 (좌수직 / 우수직 / 수평) 영역 영역 검증 영역 본 정정 영역 영역 테스트 영역만 영역 변경 영역 (src 영역 영역 무영향) 영역 → WASM 영역 재빌드 영역 불필요 영역. Refs #680 #677
PR #687 (Task #677): 복학원서.hwp PDF 정합 결함 정정 - merge commit: f0dec67 (1 commit cherry-pick no-ff merge) - 본질 3 결함: pi=16 PartialParagraph y 누적 + U+F081C 폭 + 워터마크 모드 변환 - 본 환경 결정적 검증 1165 lib + svg_snapshot 8/8 + issue_546/issue_554 13/13 + clippy clean - 광범위 sweep 7 샘플 170 페이지: same=169 / diff=1 (aift p1 부수 영향 영역) - WASM 빌드 4,595,889 bytes - 작업지시자 시각 판정 ★ 통과 CI Failure 메인테이너 후속 정정 (commit abef8ca): - PR #681 영역 회귀 차단 가드 hardcoded 좌표 fragility 영역 → y 좌표 hardcoded 회피 + x 좌표 + stroke 본질만 검증 컨트리뷰터: @planet6897 (Jaeuk Ryu) — 30+ 사이클 핵심 컨트리뷰터 closes #677 산출물: - mydocs/pr/archives/pr_687_review.md - mydocs/pr/archives/pr_687_report.md - mydocs/orders/20260508.md 갱신 - 회귀 차단 가드 영구 보존: tests/svg_snapshot.rs + tests/golden_svg/issue-677/
…t 미반영 정정 본질: layout_table + height_measurer 두 곳의 1×1 wrapper unwrap 분기가 flat_map(...).find_map(...) 으로 셀 paragraphs 전체에서 첫 nested 표만 가져와, paragraphs 가 2개 이상인 경우 두 번째 nested 표가 통째 누락. table-vpos-01.hwpx 5쪽 외부 1×1 셀 (paras=2: 1×1 헤더 + 11×3 그리드) 에서 11×3 그리드 시각 누락 + 외부 표 height 778.8px → 57.72px 부족. PR 정정 (Stage 1 + Stage 3 fix): 두 곳에 4 조건 가드 (1×1 단일 셀 + paragraphs.len()==1 + controls.len()==1 nested table + visible text 없음). 메인테이너 충돌 해결 통합 정정: PR #681 (Task #680, 자료 박스 외곽 테두리) 가 동일 1×1 wrapper 분기에 외곽선 추가 분기를 삽입한 상태에서 PR #694 의 controls.len()==1 가드를 그대로 적용하면 exam_social.hwp pi=15 (paragraphs=1, controls=2 — 정렬 마커 + nested 표) 케이스에서 unwrap + 외곽선 분기까지 회귀 누락. → controls.len()==1 가드 제거, paragraphs.len()==1 만 본질 가드 보존, find_map 으로 정렬 마커 등 다른 control 무시하고 첫 nested table 만 추출. 두 곳 (table_layout.rs + height_measurer.rs) 동일 정정. 검증: - cargo test --release: lib 1166 + 통합 ALL GREEN (issue_nested_table_border 1/1, svg_snapshot 8/8 — PR #681 회귀 가드 보존 확인) - cargo clippy --release: 본 변경 신규 경고 0 - cargo build --release: 통과 Closes #688 Co-Authored-By: Jaeuk Ryu <jaeook.ryu@gmail.com> Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
요약
src/renderer/layout/table_layout.rs::layout_table의 1x1 wrapper 분기가 외부 1x1 표를 무시하고 내부 nested 표만 직접 layout 하면서, 외부 1x1 표가 자료 박스 외곽 테두리 역할 (padding + border_fill 정의) 인 경우 외곽선이 SVG 출력에서 누락되던 결함 정정.권위 자료
samples/exam_social.hwp페이지 1 단 1 의 4번 자료 박스 (대화체):padding=(850,850,850,850)(3mm),border_fill_id=6bin_id=1~6)pdf/exam_social-2022.pdf) 에서 외곽 박스 시각 정합SVG 검증 (devel baseline
d58217be)grep -E '<rect [^/]*411\.92[^/]*' exam_social_001.svg결과 width=411.92 rect 3개 — nested wrapper pi=15 외곽선 누락 확인:정정 — wrapper 분기에 외곽선 추가
table_layout.rs:152wrapper 분기 진입 시 3 조건 AND 만족 시 외곽 4개 라인 (좌/우/상/하) 을col_node에 추가:depth == 0padding != 0(4 방향 OR)border_fill.borders중 하나라도BorderLineType::None이 아님3 조건 모두 충족 시에만 외곽선 추가 → 회귀 영역 좁힘.
외곽 박스 size — nested layout 결과 사용
외부 표 IR size (411.92×370.32) 가 아닌 nested 측정 결과 (390.65×343.88) 사용 → 내부 표 영역과 정확히 정합. 외부 표 IR size 사용 시 5번 박스 (y=935.83) 와 위치 부정합 발생.
4번 박스 외곽 SVG (AFTER)
5번 박스 (y=935.83~1198.76) 와 ~260px 갭 — 겹침 없음.
회귀 차단 가드
tests/issue_nested_table_border.rs(1 통합 테스트):nested_table_border_exam_social_p1_q4_outline_present— 페이지 카운트 4 + 4번 박스 외곽 4개 라인 좌표 검증검증
cargo build --releasecargo test --release --libcargo test --release(통합)issue_nested_table_bordersamples/187 fixture)시각 영향
주의 사항 (정합 한계)
본 정정은 외곽 박스만 추가. 외부 셀 padding (3mm) 영역 적용은 미포함 — 내부 표가 외곽 박스 가장자리까지 닿음. 한컴2022 PDF 는 padding 안쪽으로 내부 표 inset.
padding 정합은 별도 후속 영역 (wrapper 분기 본질 정정 또는 nested padding inset). 본 PR 은 "박스가 안 보임" 결함의 1차 정정 — 박스 외곽이 시각상 표시되는 영역 충족.
Test plan
cargo test --release --lib(1155 passed)cargo test --release --test issue_nested_table_border(1/1)cargo build --releasesamples/187 fixture 페이지 카운트 sweep (회귀 0)grep으로 4번 박스 외곽 4개 라인 좌표 검증 (390.65×343.88, x=549.88940.53, y=331.53675.41)Closes #680
🤖 Generated with Claude Code