fix: Square wrap 표 horz_rel_to=단 속성 정합 (closes #590)#593
Conversation
문제: exam_kor.hwp 17쪽 [A] 글상자 우측 6.5mm 치우침. 원인: src/renderer/layout.rs:2285-2300 (Issue edwardkim#480 도입 분기) 가 모든 Square-wrap 표를 무조건 문단 좌측 가장자리(col_area.x + effective_margin) 기준으로 강제 배치하며 horz_rel_to 속성을 무시. 패치: 분기 가드에 horz_rel_to=Para 만 한정. Column/Page/Paper 는 compute_table_x_position 의 명세 기반 분기에서 처리. 검증: - cargo test --lib 1125 GREEN - clippy 신규 경고 0 - 5 샘플 56 페이지 sweep: byte-identical 32 + 의도된 정정 4 (exam_kor) - p17 [A] 셀 좌측 151.28 → 126.61 px (col_left + h_offset, IR 정합) - hancomdocs PDF p24 와 시각 정합 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
PR #593 (Task #590, @planet6897 PR / Jaeook Ryu commit author) 1차 검토: - 본질 결함: layout.rs:2285-2300 (Issue #480 도입 분기) 가 모든 Square-wrap 표를 무조건 문단 좌측 가장자리 기준으로 강제 배치 → horz_rel_to 속성 무시 - 정량 측정: exam_kor p17 [A] table_x = col_area.x + effective_margin + h_offset = 117.17 + 24.67 + 9.44 = 151.28 px (사용자 보고 6.5mm 치우침) - 본질 정정: 분기 가드에 horz_rel_to=Para 한정 1줄 추가 → Column/Page/Paper 는 compute_table_x_position 명세 기반 분기로 위임 - PR mergeable=MERGEABLE (PR #592 와 함께 본 사이클 두 번째 케이스), 본질 cherry-pick (5d3b3e2) 충돌 0 - 단 1 commit 에 본질 + 보고서 + orders 모두 묶임 (이전 PR 들과 다른 패턴) - 본 환경 임시 검증: cargo test --lib --release 1134 passed (회귀 0) / clippy 0건 권장 처리: 옵션 A — 핀셋 cherry-pick + 결정적 검증 + 광범위 sweep + WASM + 작업지시자 시각 판정.
…ixture 1,614 페이지 회귀 0 + exam_kor 4 페이지 의도된 정정 + page 17 [A] -24.67 px 좌측 시프트 정량 검증
…rel_to=단 속성 정합 — @planet6897 / Jaeook Ryu 1 commit + 시각 판정 ★ 통과) PR #593 (Task #590, @planet6897 PR / Jaeook Ryu commit author): - 본질 결함: layout.rs:2285-2300 (Issue #480 도입 분기) 가 모든 Square-wrap 표를 무조건 문단 좌측 가장자리 기준으로 강제 배치 → horz_rel_to 속성 무시 - 정량 측정: exam_kor p17 [A] table_x = col_area.x + effective_margin + h_offset = 117.17 + 24.67 + 9.44 = 151.28 px (사용자 보고 6.5mm 치우침) - 본질 정정: 분기 가드에 horz_rel_to=Para 한정 1줄 추가 → Column/Page/Paper 는 compute_table_x_position 명세 기반 분기로 위임 - 단일 파일 본질 (layout.rs +5/-4) 검증: - cargo test --lib --release 1134 passed (회귀 0) - svg_snapshot 6/6 / issue_546 1 / issue_554 12 / clippy 0 / build --release - WASM 4,581,465 bytes (PR #592 baseline -62 bytes — 가드 1줄 LLVM 최적화 효과) - 광범위 페이지네이션 회귀 sweep: 164 fixture (158 hwp + 6 hwpx) / 1,614 페이지 / 페이지 수 회귀 0 - exam_kor 4 페이지 의도된 정정 (PR 본문 100% 재현): page 14 [A] x4 (Right -7.55 px 명세 정합 향상) + page 17 [A] (Left -24.7 px 사용자 보고 정정) + page 18 [B] x2 + page 19 [B] (Left 동류 정정) - page 17 [A] 글자 정량 검증: 152.28 → 127.61 px (정확 -24.67 px) 시각 판정 ★ 통과 — 작업지시자 SVG + 웹 캔바스 양쪽 검증 완료. closes #590.
|
본 PR 의 본질 commit ( 처리 결과본질 cherry-pick
결정적 검증
광범위 페이지네이션 회귀 sweep (본 환경 자동)
exam_kor 4 페이지 의도된 정정 (PR 본문 100% 재현)
page 17 [A] 글자 정량 검증
→ PR 본문 effective_margin (24.67 px = 6.5 mm) 과 정확히 일치 정량 검증 완료. 시각 판정 (★ 게이트)작업지시자 시각 판정 결과:
→ ★ 통과. SVG + 웹 캔바스 양쪽 모두 검증 완료. PR #584 처럼 Canvas/SVG 경로 차이 의심 영역 없이 양쪽 일관 정합. 본 PR 의 본질 — 단일 줄 분기 가드 + 명세 위임- } else if !is_tac && tbl_is_square {
+ } else if !is_tac && tbl_is_square
+ && matches!(t.common.horz_rel_to, crate::model::shape::HorzRelTo::Para) {케이스별 명시 가드 ( 명세 정합 향상 (page 14 halign=Right)이전 동작: 처리 보고서: 본 PR 은 단일 commit 에 본질 + 보고서 + orders 갱신 통합된 새 패턴이었으며 (이전 PR 들은 본질 + 보고서 별도 commit), MERGEABLE 표시 + 광범위 sweep 의 명세 정합 향상까지 포함한 우수한 처리였습니다. 감사합니다. |
- 처리 보고서 추가: mydocs/pr/archives/pr_593_report.md PR #593 (Task #590, @planet6897 / @jangster77) 핀셋 cherry-pick 1 commit + 결정적 검증 + WASM 4,581,465 bytes + 광범위 페이지네이션 sweep (164 fixture / 1,614 페이지 / 회귀 0) + exam_kor 4 페이지 의도된 정정 + page 17 [A] -24.67 px 정량 검증 + 시각 판정 ★ 통과 (SVG + 웹 캔바스 양쪽) - 검토 보고서 archives 이동: mydocs/pr/pr_593_review.md → mydocs/pr/archives/pr_593_review.md - 5/5 orders 갱신: PR #593 항목 추가
…efs #536 — @seo-rii 9 commits + 5개 영역 정정 + 시각 판정 ★ 통과) PR #599 (refs #536, @seo-rii) — render P4 native Skia PNG raster backend: - Skia 본질 cherry-pick (9 commits): src/renderer/skia/ + layer_renderer.rs + image_conv.rs 신규 영역 (본 사이클 처리분과 0 중첩) - 메인테이너 후속 정정 (5개 영역): 1. Skia 한글 fallback chain (Noto Sans KR / Nanum 등) 2. --font-path 동적 로딩 (with_font_paths API, SVG 패턴 정합) 3. char 단위 fallback (공백 두부 정정 — NBSP/U+2007/U+200B 방지) 4. VLM 옵션 (--vlm-target claude + --scale + --max-dimension, AI 파이프라인 + Vision-Language Model 연동) 5. export-png CLI 명령 + 매뉴얼 (한글 + 영문 동기화) 검증: - cargo test --lib --release 1134 passed (회귀 0) - cargo test --features native-skia skia 20 passed - clippy 0건 - WASM 4,581,465 bytes (PR #593 baseline +0 — feature gate 정합 입증) - 광범위 페이지네이션 회귀 sweep: 164 fixture / 1,614 페이지 / 회귀 0 - VLM 옵션 게이트웨이: Claude 898×1269 = 1.14 MP ≤ 1.15 MP ✓ 후속 이슈 등록: - #613 (VLM 프리셋 확장 — GPT-4V / Gemini / Qwen-VL / LLaVA) - #614 (DPI 메타데이터 옵션 — PNG pHYs chunk) 시각 판정 ★ 통과 (SVG/PNG 한글 + 공백 정상 표시). refs #536 (멀티 렌더러 지원 트래킹 이슈, OPEN 유지).
v0.7.9 후속 patch 사이클 (5/4 ~ 5/6). ## 신규 기능 - **CLI 바이너리 릴리즈** (Issue #608/#612, @almet 의 요청) - 4 플랫폼 GitHub Release 자산 첨부 (Linux x86_64 / macOS x86_64+aarch64 / Windows x86_64) + SHA-256 체크섬 - **PNG raster backend** (PR #599, @seo-rii) — render P4 단계 - native Skia 기반 PageLayerTree → PNG export, native-skia feature gate - **AI 파이프라인 + VLM 연동 도입** (메인테이너 후속 정정): - --vlm-target claude (1568 longest edge / 1.15 MP, Claude Vision 정합) - --scale / --max-dimension (자동 scale 계산) - export-png CLI 명령 + 매뉴얼 (한글 + 영문 dual) - 한글 폰트 fallback chain + char 단위 fallback (공백 두부 정정) + --font-path 동적 로딩 ## 외부 PR cherry-pick (13 PR / 7 컨트리뷰터) - @planet6897 / Jaeook Ryu (협업): PR #587/#589/#561/#564/#570/#575/ #580/#584/#592/#593/#567 - @oksure (Hyunwoo Park): PR #600 (closes #513) - @seo-rii: PR #599 (refs #536) - @cskwork / @johndoekim / @nameofSEOKWONHONG / @jangster77 — 사이클 누적 ## 메인테이너 정정 Skia 폰트 영역 5개 정정 (한글 fallback / font-path / char-fallback / VLM 옵션 / export-png CLI). ## 인프라 - CI 빌드 안정성 (Cargo.toml [[example]] required-features) - 광범위 페이지네이션 회귀 sweep 도구 (164 fixture / 1,614 페이지 자동) ## 후속 이슈 - #613 (VLM 프리셋 확장) - #614 (DPI 메타데이터) - #615 (pua_oldhangul.rs U+F53A 한컴 정합) - #598 (rhwp-studio 각주 삭제, 외부 컨트리뷰터 공개) ## 잔여 PR (v0.7.11 후속 patch) PR #601, #602 (@oksure) / PR #607 (@dicebattle) / PR #609 (@jangster77, Task #604) / PR #611 (@kihyunnn). 상세: CHANGELOG.md (한글) / CHANGELOG_EN.md (영문).
이슈
closes #590
사용자 보고: `exam_kor.hwp` 17페이지 [35~36] 지문의 [A] 글상자 위치가 오른쪽으로 6.5mm 치우침.
원인
`src/renderer/layout.rs:2285-2300` (Issue #480 도입 분기) 가 모든 Square-wrap 표를 무조건 문단 좌측 가장자리(`col_area.x + effective_margin`) 기준으로 강제 배치하며 `horz_rel_to` 속성을 무시했음.
문단 2 ParaShape `margin_left=1700, indent=+2000` → effective_margin = 24.67 px → 우측 24.7 px (=6.5mm) 시프트 발생.
수식 검증:
```
table_x = col_area.x + effective_margin + h_offset
= 117.17 + 24.67 + 9.44
= 151.28 px ← SVG 실측치와 정확히 일치
```
패치
분기 가드에 `horz_rel_to=Para` 만 한정 → `Column/Page/Paper` 는 `compute_table_x_position` 명세 기반 분기에서 처리.
```diff
```
검증
차분 페이지 4 분석
p14 (halign=Right) 의 미세 변경은 명세 정합 향상: 이전 동작은 `inline_x_override` 경로가 Right 정렬 시에도 h_offset 을 ADD 하던 모순 (Right 는 SUBTRACT 해야 함). `compute_table_x_position` 의 명세 기반 분기로 통일.
적용 영역 / 미적용 영역
적용 (위치 변경):
미적용 (이전과 동일):
변경 파일
Test plan
🤖 Generated with Claude Code