Skip to content

Task #511: HWP3 Square wrap 렌더링 보완 6-13 + narrow zone 정정#553

Closed
jangster77 wants to merge 7 commits into
edwardkim:develfrom
jangster77:local/task511_v2
Closed

Task #511: HWP3 Square wrap 렌더링 보완 6-13 + narrow zone 정정#553
jangster77 wants to merge 7 commits into
edwardkim:develfrom
jangster77:local/task511_v2

Conversation

@jangster77

Copy link
Copy Markdown
Collaborator

Summary

변경 영역

소스 (14 파일, +1063 / -93)

파일 변경 설명
src/parser/hwp3/mod.rs +619 보완7,8,11,12,13 누적 (cs=0 줄 wrap zone 상향, Fix B 교정, 앵커 binary 신뢰, sx 기반 wrap zone 판정, body_top_pgy)
src/renderer/layout.rs +182 HWP3 narrow zone 처리, paper_images z-order swap, v_push_before
src/renderer/composer.rs +157 보완12 (앵커 문단 binary 신뢰), wrap_ref_span gate (Latin 텍스트 분리 회귀 정정)
src/renderer/layout/paragraph_layout.rs +38 wrap_precomputed line cs/sw 처리
src/renderer/typeset.rs +38 Square wrap 처리
src/model/paragraph.rs +11 `v_push_before` 필드 추가
src/{parser,serializer,wasm_api}/* +12 model 변경 정합

문서 (7 파일, +302)

회귀 테스트 (3 파일)

  • tests/golden_svg/{form-002,issue-157,issue-267}/page-*.svg — 보완11 (body clip 우측 확장 시 텍스트 노드 제외) 정합

샘플 (5 파일, ~1.4 MB)

  • samples/hwp3-sample{,4,5}-hwp5.hwp — HWP3 → HWP5 변환본 (회귀 검증용)
  • samples/hwp3-sample{,5}-hwpx.hwpx — HWP3 → HWPX 변환본 (XML diff 가능)

시각 검증

회복된 결함

  • HWP3 page 48 pi=1396 (Groucho Marx 인용구): 단어 간격 70+ px → 14.3 px (정상 영어 단어 간격)
  • HWP3 hwp3-sample5.hwp: 64 페이지 (clean upstream/devel과 일치)
  • HWP3 hwp3-sample.hwp: 16 페이지 / hwp3-sample4.hwp: 40 페이지

회귀 무재발

회귀 영역 (별도 issue 분리 권장)

Task #546 commit 메시지의 명시적 권장사항 ("Stage 5 시각 판정 시 HWP3 fixture 점검 후 재발 시 별도 task 분리")에 따라, 본 PR에 포함하지 않는 잔존 결함:

  1. HWP3 Square wrap 그림 아래 텍스트 y위치 회귀 (page 4/8 그림 겹침)

  2. HWP3 narrow zone 후속 full-width 문단 wrap-around 미지원 (page 22)

    • HWP97은 narrow zone 종료 후에도 그림 하단까지 narrow wrap 유지
    • rhwp는 file의 cs=0을 그대로 사용 → architectural 재구현 필요

Test plan

빌드 / 머지 노트

커밋 (5건)

```
64bb10a samples: HWP3 → HWP5/HWPX 변환 fixture 추가
c6de8c3 Restore orders/20260503.md accidentally removed by squash merge
9a28ce6 Restore upstream docs accidentally removed by squash merge
db536d6 Task #511 후속: HWP3 narrow zone Groucho Marx 분리/z-order/bottom-push 정정
3568646 Task #511: HWP3 Square wrap 보완 6-13 squash merge — Task #546 정합
```

🤖 Generated with Claude Code

jangster77 and others added 6 commits May 3, 2026 18:16
…rdkim#546 정합

local/task511 브랜치 13 commit (보완6~13)을 upstream/devel(Task edwardkim#546 revert
포함)에 squash merge하여 conflict 해결.

포함:
- src/parser/hwp3/mod.rs (+508 LOC) — 보완7,8,11,12,13 누적
- src/renderer/composer.rs (+148 LOC) — 보완12 (HWP3 앵커 문단 binary 신뢰)
- src/renderer/layout/paragraph_layout.rs (+38 LOC) — wrap_precomputed line 처리
- src/model/paragraph.rs (+11 LOC) — v_push_before 필드 추가
- src/renderer/layout.rs — v_push_before 처리 (Fix C Pattern B)
- src/serializer/{body_text.rs, hwpx/section.rs} — model 변경 정합
- mydocs/plans/working/report — Task edwardkim#511 문서 일체

제외 (Task edwardkim#546 정합):
- task460 보완5 (82e41ba) 코드 — wrap_pic_bottom_y, wrap_around_pic_bottom_px
  처리. Task #546이 exam_science.hwp 회귀 정정으로 revert한 영역.
  본 squash merge에서도 conflict 해결 시 HEAD(upstream/devel) 유지.

Trade-off (별도 issue로 분리):
- 손실: HWP3 Square wrap 그림 아래 텍스트 y위치 정합 (page 4/8/22/48 겹침 재발)
- Task edwardkim#546 commit 메시지 권장: "Stage 5 시각 판정 시 HWP3 fixture 점검 후
  재발 시 별도 task 분리"

검증:
- cargo build 통과
- cargo test --lib 1113 passed
- cargo clippy --lib 0건
- 통합 테스트 svg_snapshot 6/6, issue_418/501/505/530/546 통과
- exam_science.hwp 4 페이지 (Task edwardkim#546 정합)
- hwp3-sample5.hwp 65 페이지 (clean upstream/devel 64 페이지 — 별도 issue)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…m-push 정정

세션 작업 결과 + stash apply (Task edwardkim#546 정합 유지하면서 task511 hwp3 변수 복원).

수정 1 - composer.rs wrap_ref_span gate (Groucho Marx fix):
  - HWP3 wrap_precomputed paragraph 중 non-TAC picture가 없는 문단은
    sub-line splitting 적용 안 함. Latin 텍스트의 경우 cps_est(CJK 기준)가
    과소평가되어 단일 시각 줄을 잘못 분할하면 양쪽정렬 시 단어 간격이
    비정상적으로 벌어지는 문제 해결.
  - 사례: hwp3-sample5.hwp page 48 pi=1396 ("I don't care to belong to a
    club...") — 글자 간격 70+ px → 14.3 px (정상 영어 단어 간격).

수정 2 - layout.rs paper_images z-order swap:
  - body_node를 먼저 push하고 paper_images를 그 후에 push.
  - SVG 문서 순서상 나중 요소가 위에 그려지므로 floating image가 텍스트
    위에 렌더됨 (정상 z-order).

수정 3 - layout.rs HWP3 narrow zone bottom-push 제거:
  - narrow zone 종료 후 full-width 문단을 그림 하단으로 밀지 않음.
  - HWP3에서 그림은 텍스트 위에 float되므로 자연 위치에서 시작.
  - 기존엔 그림 우측에 빈 공간이 발생해 사용자 컴플레인.

수정 4 - parser/hwp3/{drawing.rs, mod.rs} body_top_pgy 파라미터:
  - parse_paragraph_list에 body_top_pgy 파라미터 추가
  - 드로잉 내부 텍스트는 body_top_pgy=0 (용지 기준 변환 불필요)

검증:
- cargo build 통과
- cargo test --lib 1113 passed
- 통합 테스트 svg_snapshot 6/6, issue_418/501/505/530/546 통과

Known limitations (별도 issue로 분리 권장):
- Page 22 narrow zone 후속 문단(pi=605) 자체 wrap-around 미지원
  → HWP97은 narrow zone 종료 후에도 그림 하단까지 narrow wrap 유지
  → rhwp는 file의 cs=0를 그대로 사용. 본질적 wrap-around 재구현 필요.
- Page 4/8 그림 아래 텍스트 겹침 (Task edwardkim#546 revert로 손실된 task460
  보완5 기능 복원 미완)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
squash merge of local/task511 into upstream/devel-based branch removed
upstream docs that didn't exist in task511 base. Restoring from
upstream/devel:
- Task edwardkim#525 (계획서/구현계획/단계별/최종 보고서)
- PR edwardkim#551 (검토 + 처리 보고서)

These docs are unrelated to Task edwardkim#511 and should remain in the tree.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
원본 HWP3 fixture (hwp3-sample.hwp, hwp3-sample4.hwp, hwp3-sample5.hwp)는
upstream/devel에 이미 존재. HWP3 파서의 변환 결과물(같은 문서를 HWP5/HWPX
포맷으로 저장한 파일)을 회귀 테스트/IR 비교 검증용으로 추가.

추가 파일:
- samples/hwp3-sample-hwp5.hwp (109 KB)
- samples/hwp3-sample-hwpx.hwpx (106 KB)
- samples/hwp3-sample4-hwp5.hwp (645 KB)
- samples/hwp3-sample5-hwp5.hwp (289 KB)
- samples/hwp3-sample5-hwpx.hwpx (267 KB)

용도:
- ir-diff 명령으로 HWP3 → HWP5 IR 정합 검증
- HWP3 파서 회귀 시 IR 변환 결과 비교
- HWPX 변환본은 XML 기반이라 텍스트 diff 가능

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@edwardkim

Copy link
Copy Markdown
Owner

@jangster77 님, 본 PR 의 검토 + 시각 판정 결과 작업지시자 결정으로 cherry-pick rollback 처리하고 close 합니다.

처리 결과 — Rollback

본 PR 의 본질 정정 (HWP3 Square wrap 보완 6-13 + narrow zone + composer wrap_ref_span 등) 자체는 정합한 영역이라 cherry-pick 시뮬레이션 + 결정적 검증 통과 (1118 / svg_snapshot 6/6 / clippy 0). 작업지시자 의도된 옵션 C (Task #525 호출 제거 유지 + Task #511 wrap_precomputed 인프라 통합) 도 정상 적용.

그러나 시각 판정 단계에서 page 4 + page 8 의 그림 + 문단 배치 결함 이 작업지시자 시각 판정에서 수용 불가능한 영역으로 판단됨:

`samples/hwp3-sample5-hwp5.hwp` page 4 / page 8 — pi=74 / pi=140 등 Square wrap 그림 (어울림, tac=false) 영역에서 그림 + 후속 paragraph 의 배치 결함:

  • page 4 단 0: items=14, used=556.8 px / hwp_used 952.8 px (diff -396.0 px) — 본문 영역 이상 공백
  • pi=74 그림: 126.4 × 94.5 mm Square wrap (어울림), Paper-relative offset
  • 그림 옆 paragraph 들이 정합한 위치에 배치 안 됨

본 결함은 PR 본문 §"회귀 영역" 1번 (HWP3 Square wrap 그림 아래 텍스트 y위치 회귀, page 4/8 그림 겹침) 의 영역과 본질적으로 같은 본질 — Task #546 의 `82e41ba` revert trade-off. 본 PR 본문이 의도된 trade-off 로 명시한 영역.

다만 작업지시자 시각 판정에서 수용 불가능 으로 판단:

output/svg/pr553_after/hwp3-sample5-hwp5/hwp3-sample5-hwp5_004.svg
이미지와 문단 배치에서 버그가 발생합니다.

output/svg/pr553_after/hwp3-sample5-hwp5/hwp3-sample5-hwp5_008.svg
에서도 동일한 현상발견했습니다.

HWP 3.0 은 렌더링 뿐만 아니라 향후 시리얼라이제이션도 생각해야 합니다.

재 PR 요청 사항

본 PR 의 본질 정정 영역은 매우 정합하고 가치 있는 작업입니다. page 4/8 의 결함만 정정 후 재 PR 부탁드립니다:

정정 방향 — HWP3 Square wrap 그림 아래 텍스트 y위치 정합

추가 고려 사항 — HWP 3.0 직렬화

작업지시자 의견:

HWP 3.0 은 렌더링 뿐만 아니라 향후 시리얼라이제이션도 생각해야 합니다.

본 PR 의 `wrap_precomputed` / `v_push_before` 등 model 변경이 HWP3 → HWP3 round-trip (직렬화) 까지 정합한지 점검 권장. 본 정정이 IR 모델에 영향을 주는 영역이므로 향후 직렬화 시 정합한 인코딩 필요.

본 PR 의 정합한 영역 (재 PR 시 보존 권장)

  • HWP3 파서 보완 6-13 (`src/parser/hwp3/mod.rs` +619)
  • HWP3 narrow zone 처리 (`src/renderer/layout.rs` 의 비충돌 영역)
  • composer wrap_ref_span gate (영어 텍스트 양쪽정렬 단어 분리 회귀 정정)
  • floating image z-order 정합
  • HWP3 narrow zone Groucho Marx 분리 (db536d6)
  • HWP3 → HWP5/HWPX 변환 fixture (samples)

재 PR 시 base 동기화

본 cherry-pick rollback 후 본 환경 devel 은 `b84c5e9` (PR #551 Task #528 처리 후속) 시점으로 유지됩니다. 본 PR 의 base 와 동일하므로 재 PR 시 동기화 추가 필요 없습니다.

컨트리뷰터께 감사

본 PR 의 진단 깊이 + Task #546 의식 + 정합한 PR 형식 (5 commits / 26 files) 이 매우 인상적이었습니다. PR #538/#551 의 fork devel 누적 패턴과 다른 모범 사례 — 본 환경 devel 정확히 분기점 (`b84c5e9`) 으로 두고 정합한 변경만 포함.

page 4/8 결함만 정정 후 재 PR 부탁드립니다. 본 PR 의 다른 영역은 그대로 보존하시면 됩니다.

검토 자료

  • 본 환경 cherry-pick 시뮬레이션 결과 (rollback 됨): cargo test --lib 1118 / svg_snapshot 6/6 / clippy 0 / WASM 4,586,232 bytes — 본질 정정 자체는 정합
  • 시각 판정 자료: `output/svg/pr553_after/hwp3-sample5-hwp5/_001.svg ~ _068.svg` (rollback 후에도 보존)
  • page 4 의 pi=74 Square wrap 그림 dump: 본 댓글 위 측정값

@edwardkim edwardkim closed this May 4, 2026
edwardkim added a commit that referenced this pull request May 4, 2026
- 외부 컨트리뷰터 @jangster77 의 PR #553 (Task #511 HWP3 Square wrap 보완)
- 작업지시자 옵션 C (Task #525 호출 제거 유지 + Task #511 wrap_precomputed 통합)
  cherry-pick 진행 후 결정적 검증 통과 (1118 / svg_snapshot 6/6 / clippy 0)
- 그러나 시각 판정에서 hwp3-sample5 page 4 + page 8 그림 + 문단 배치 결함
  (Square wrap 어울림 텍스트 y위치) 수용 불가
- 작업지시자 결정으로 옵션 2 (rollback) 진행:
  · git reset --hard b84c5e9 로 local/devel 복원
  · devel push 안 됨, 영향 0
  · exam_science 4 페이지 (Task #546) / Task #525 / Task #528 모두 유지
- PR #553 close + 컨트리뷰터에게 안내:
  · page 4/8 결함 정정 후 재 PR 요청
  · PR 본질 정정 영역 (HWP3 파서 + narrow zone + composer 등) 보존 권장
  · HWP 3.0 직렬화 고려 (작업지시자 의견)
  · 트러블슈팅 문서 (square_wrap_pic_bottom_double_advance.md) 참조 권장

산출물:
- mydocs/pr/archives/pr_553_review.md (검토 보고서, rollback 결정 반영)
- mydocs/orders/20260504.md (오늘할일 신규)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
edwardkim added a commit that referenced this pull request May 4, 2026
…commit)

본 PR 은 외부 컨트리뷰터 @oksure (Hyunwoo Park) 의 세 번째 PR (PR #581/#582 후속).

cherry-pick:
- 21fe401 (8dc75f6): fix: 그룹 내 그림(Picture) 직렬화 구현 + 라운드트립 테스트
  · src/serializer/control.rs +13/-2
  · src/serializer/control/tests.rs +79

본질: serialize_group_child 의 ShapeObject::Picture TODO 빈 분기 → 단독 Picture
직렬화와 동일 패턴 적용 (HWPTAG_SHAPE_COMPONENT + HWPTAG_SHAPE_COMPONENT_PICTURE).
PR #428 후속 (Copilot 리뷰 피드백 반영, 라운드트립 테스트 포함).

검증:
- cargo test --lib 1125 passed (신규 GREEN +1)
- test_roundtrip_group_picture_child 통과
- 회귀 0 (issue_505/530/546/418/501/svg_snapshot)
- cargo clippy --lib 0 건

작업지시자 의견 정합 (HWP 직렬화 영역, PR #553 close 시 명시).
edwardkim added a commit that referenced this pull request May 5, 2026
…er77 7 commits + 시각 판정 ★ 통과)

PR #589 (Task #511 v2 + Task #554, @jangster77):
- PR #553 close 회신 응답 — page 4/8 결함 정정 후 재PR
- 옵션 A2 — wrap_precomputed IR 플래그 + cs_offset 단일 접근
- Task #546 회귀 영역 모두 회피 (wrap_around_pic_bottom_px 등 제외)
- HWP 3.0 직렬화 round-trip 정합 — derived 필드 + serializer 미참조

검증:
- cargo test --lib 1129 / issue_554 12 / issue_546 1 회귀 0
- WASM 4,569,773 bytes (-12,772 vs devel)
- 시각 판정 ★ 통과 (page 4/8 정정 + page 17/18/48 보완8 영향 + page 27 trade-off 수용)

PR #556 (Task #554 단독) close 처리 예정.
edwardkim added a commit that referenced this pull request May 5, 2026
- 처리 보고서 추가: mydocs/pr/archives/pr_589_report.md
  PR #553 → PR #589 재PR 의 메인테이너 회신 3개 요청 응답 검증 +
  cherry-pick 7 commits + 결정적 검증 + WASM + 시각 판정 ★ 통과
- 검토 보고서 archives 이동:
  mydocs/pr/pr_589_review.md → mydocs/pr/archives/pr_589_review.md
- 5/5 orders 신규 작성: mydocs/orders/20260505.md
  PR #589 처리 + Issue #598 (각주 삭제 기능) 등록 +
  인프라 정합 (local/devel 재생성 / 메모리 동기화 / 페르소나 덤프)
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