Skip to content

fix: Square wrap 표 horz_rel_to=단 속성 정합 (closes #590)#593

Closed
planet6897 wants to merge 1 commit into
edwardkim:develfrom
planet6897:pr-task590
Closed

fix: Square wrap 표 horz_rel_to=단 속성 정합 (closes #590)#593
planet6897 wants to merge 1 commit into
edwardkim:develfrom
planet6897:pr-task590

Conversation

@planet6897

Copy link
Copy Markdown
Contributor

이슈

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

  •            } 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) {
                   // [Issue #480 / #590] horz_rel_to=Para 인 Square wrap 표만 paragraph 영역
                   // (col_area + margin) 기준으로 정렬. horz_rel_to=Column/Page/Paper 는
                   // compute_table_x_position 의 기본 분기에서 명세대로 처리한다.
    

```

검증

  • `cargo test --lib`: 1125 passed; 0 failed
  • `cargo clippy`: 신규 경고 0 (기존 `panicking_unwrap` 2건은 본 패치 무관 사전 존재)
  • 5 샘플 56 페이지 sweep:
    • exam_eng / exam_math / exam_science / exam_social: byte-identical (32 페이지)
    • exam_kor: 차분 4 페이지 (모두 의도된 정정)
  • p17 [A] 셀 좌측: 151.28 → 126.61 px (= col_left + h_offset, IR 정합)
  • hancomdocs PDF p24 와 시각 정합

차분 페이지 4 분석

페이지 halign 변화
p17 [A] Left 151.28 → 126.61 (-24.7 px, 사용자 보고 정정)
p18 [B] x2 Left 602.83 → 591.49 (-11.33 px, 동류 정정)
p19 [B] Left (동류 정정)
p14 [A] x4 Right 515.60 → 508.05 (-7.55 px, 명세 정합 향상)

p14 (halign=Right) 의 미세 변경은 명세 정합 향상: 이전 동작은 `inline_x_override` 경로가 Right 정렬 시에도 h_offset 을 ADD 하던 모순 (Right 는 SUBTRACT 해야 함). `compute_table_x_position` 의 명세 기반 분기로 통일.

적용 영역 / 미적용 영역

적용 (위치 변경):

  • Square wrap (`wrap=어울림`) 표
  • `treat_as_char=false`
  • `horz_rel_to ∈ {Column, Page, Paper}`

미적용 (이전과 동일):

변경 파일

  • `src/renderer/layout.rs`: 분기 가드 1줄 추가 + 주석 업데이트
  • `mydocs/plans/task_m100_590.md` / `task_m100_590_impl.md`: 계획서
  • `mydocs/working/task_m100_590_stage1.md`: 단계별 보고서
  • `mydocs/report/task_m100_590_report.md`: 최종 보고서
  • `mydocs/orders/20260504.md`: 오늘할일 갱신

Test plan

  • cargo test --lib (1125 passed)
  • cargo build --release
  • svg_snapshot tests (6/6 passed)
  • 5 샘플 광범위 sweep (52 byte-identical + 4 의도된 정정)
  • hancomdocs PDF 시각 비교 (p24 정합 확인)
  • 메인테이너 시각 판정 (p17 [A] 정정 + p14/p18/p19 회귀 없음)

🤖 Generated with Claude Code

문제: 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>
edwardkim added a commit that referenced this pull request May 5, 2026
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 + 작업지시자 시각 판정.
edwardkim added a commit that referenced this pull request May 5, 2026
…ixture 1,614 페이지 회귀 0 + exam_kor 4 페이지 의도된 정정 + page 17 [A] -24.67 px 좌측 시프트 정량 검증
edwardkim added a commit that referenced this pull request May 5, 2026
…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.
@edwardkim

Copy link
Copy Markdown
Owner

@planet6897 @jangster77 님,

본 PR 의 본질 commit (5d3b3e2d) 핀셋 cherry-pick 후 devel merge 완료되었습니다 (0e543e6).

처리 결과

본질 cherry-pick

결정적 검증

광범위 페이지네이션 회귀 sweep (본 환경 자동)

통계 결과
총 fixture 164 (158 hwp + 6 hwpx — samples/ 폴더 전체)
총 페이지 (devel baseline) 1,614
총 페이지 (cherry-pick 후) 1,614
fixture 별 페이지 수 차이 0

exam_kor 4 페이지 의도된 정정 (PR 본문 100% 재현)

페이지 halign 변화
page 17 [A] Left 151.28 → 126.61 (-24.7 px, 사용자 보고 정정)
page 18 [B] x2 Left 동류 정정
page 19 [B] Left 동류 정정
page 14 [A] x4 Right 515.60 → 508.05 (-7.55 px, 명세 정합 향상)

page 17 [A] 글자 정량 검증

글자 Before (devel) After (cherry-pick) 변화
셀 내부 [ translate(152.28, 579.39) translate(127.61, 579.39) -24.67 px
셀 내부 A translate(157.50, 579.39) translate(132.83, 579.39) -24.67 px
다른 위치 (x=622) [A] 변경 없음 변경 없음 0 (회귀 0)

→ PR 본문 effective_margin (24.67 px = 6.5 mm) 과 정확히 일치 정량 검증 완료.

시각 판정 (★ 게이트)

작업지시자 시각 판정 결과:

svg, 웹 모두 시각 판정 통과입니다.

→ ★ 통과. 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) {

케이스별 명시 가드 (feedback_hancom_compat_specific_over_general 정합) + HWP 표준 룰 위임 (compute_table_x_position 명세 기반 분기, feedback_rule_not_heuristic 정합) + 회귀 위험 영역 좁힘 (분기 진입 조건만 좁힘).

명세 정합 향상 (page 14 halign=Right)

이전 동작: inline_x_override 경로가 Right 정렬 시에도 h_offset 을 ADD 하던 모순 (Right 는 SUBTRACT 해야 함). compute_table_x_position 의 명세 기반 분기로 통일 — 회귀 아닌 명세 정합 향상.

처리 보고서: mydocs/pr/archives/pr_593_report.md (작성 후 push 됩니다).

본 PR 은 단일 commit 에 본질 + 보고서 + orders 갱신 통합된 새 패턴이었으며 (이전 PR 들은 본질 + 보고서 별도 commit), MERGEABLE 표시 + 광범위 sweep 의 명세 정합 향상까지 포함한 우수한 처리였습니다. 감사합니다.

@edwardkim edwardkim closed this May 5, 2026
edwardkim added a commit that referenced this pull request May 5, 2026
- 처리 보고서 추가: 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 항목 추가
edwardkim added a commit that referenced this pull request May 5, 2026
…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 유지).
edwardkim added a commit that referenced this pull request May 5, 2026
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 (영문).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants