Task #1007: HWP5 변환본 페이지 강제 나눔 한컴 정합#1009
Conversation
b9e7a48 to
71054c5
Compare
sample16-hwp5.hwp 의 페이지 수가 한컴 정답지 (64) 와 다른 67 페이지로 렌더되던 문제 해결. 변환본 encoder 의 line_segs.vertical_pos page-reset 신호를 paginator 가 인식하도록 typeset.rs/engine.rs 에 cross-paragraph vpos reset 감지 로직 추가. 핵심 변경: - variant cross-paragraph vpos reset 감지 (prev_end > body × 0.85, curr_first < 1500 HU) - empty line_segs paragraph 의 walk-back/forward - empty paragraph bridge aux trigger - composer CHARS_PER_LINE 45 → 50 (variant CharShape spacing=-12%) - prev_end = vpos + line_height (wrap shape lh 큰 값 대응) 검증: - sample16-hwp5: 67 → 64 페이지 (한컴 정합) - 페이지별 단락 alignment: 63/64 (98.4%) perfect match - 1303 tests passed, 0 clippy warnings - HWP3 sample16, hwp3-sample10/14, exam_kor, aift, biz_plan 회귀 없음 잔존 follow-up: variant paragraph 외곽선 micro-overflow (PARA_LINE_SEG 누락 paragraph 의 render 누적 y drift) — 별도 issue 등록 예정. Closes edwardkim#1007 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
78340c8 to
d18a43f
Compare
|
검토 결과 수정 요청드립니다 (보류, PR/이슈 OPEN 유지). 핵심 — PR base 부정합으로 인한 페이지 수 회귀PR 본문은 "sample16-hwp5 67 → 64 한컴 정합"을 목표로 하나, 이 "67" 시작점은 PR이 분기된 #1005 머지 이전 base 기준입니다.
검증 (cherry-pick 후 sweep, BEFORE=현 devel #1005):
cargo test 1307 / clippy -D / fmt 0 통과, vpos reset 로직이 variant 가드 한정이라 일반 문서 무회귀인 점은 양호합니다. 다만 타깃 자체가 회귀입니다. 추가 — PR 본문과 실제 코드 불일치PR 본문 표의 요청 사항
설계(variant 가드 한정 vpos reset)는 건전합니다. base 재정렬 후 재제출 부탁드립니다. #997→#999→#1005 연속 작업 감사합니다. |
|
메인터너 진단 + 추가 sweep 검증 결과 본 PR 의 vpos reset 휴리스틱은 현 devel base 에서 순수 증분이 없음 을 확인. close 합니다. Sweep 결과 (base = upstream/devel f35a0a5, #999 + #1005 머지 이후)HWP3→HWP5 변환본 9개 fixture:
순수 증분 케이스 0개. 유일한 발동 케이스인 sample16-hwp5 에서 over-split 회귀. Issue #1007 처리원래 목표 (sample16-hwp5 67→64 정합) 는 #999 + #1005 머지에서 이미 달성됨. Issue #1007 도 함께 close 합니다. 검토 + 명확한 진단 감사합니다. base 부정합 케이스를 놓치지 않도록 다음부터 PR sync 시점에 BEFORE/AFTER 를 최신 devel 로 고정해서 재검증하겠습니다. |
@jangster77 — paper_based outline 회귀 사이클 종결 (task877→#920→#956→ #987→#1005→#1006). 단일 attr & 0x01 비트 해석 모호성을 PageBorderBasis enum + parser 단계 명시 주입(HWP3/HWP5/HWPX 모두 PaperBased)으로 책임 분리 — interpretation → parser, 사용 → renderer. clip 정책 변경: !header_inside clip 제거 (cover logo paper-edge 정합), !footer_inside clip 유지 (페이지 번호 외곽선 바깥 유지). 작업지시자 Hancom Office close-up 시각 판정 기반 — spec(attr bit 1/2) ≠ 한컴 실제 동작, 한컴 정합 우선 명문화. 옵션 A: 본질 커밋 aa8160c cherry-pick (작성자 Taesup Jang 보존, 충돌 없음). 검증: cargo test 1307 + clippy -D + fmt 0 + WASM 4.83MB. sweep 7 fixture: 일반 5종(sample10/exam_kor/exam_math/aift/biz_plan) diff=0 무회귀, sample16-hwp5/hwp3 외곽선만 paper-edge 이동 (텍스트 무변동). 작업지시자 시각 판정 통과. 매직넘버 감사: 신규 0 / 제거 3 (attr & 0x01 ×2, attr & 0x02). 잔존 footer_inside = attr & 0x04 (layout.rs:979) 일관성 정리는 별도 issue 권고. test-image fixture 추가로 그림 wrap 4종 회귀 가드 영구화. 후속: footer_inside 일관성, test-image paragraph 텍스트 라벨 누락 (별도 root cause). #1009 (보류) 컨트리뷰터 rebase 후 재제출 대기.
…#1035) samples/hwp3-sample16-hwp5.hwp (HWP5 변환본) 의 페이지별 paragraph alignment 가 동일 문서 HWP3 native 와 37.5% (24/64) 만 정합. PR #1009 (Task #1007, closed — sample16-hwp5 +1 over-split 회귀로 close) 의 cross-paragraph vpos reset 감지 휴리스틱 base 적용 + Task #1035 narrow 가드 2 항목 으로 over-split 회피 + alignment 93.75% (60/64) 달성. PR #1009 close 사유 정정: | 시도 | sample16-hwp5 | alignment | |------|---------------|-----------| | devel baseline | 64 | 24/64 (37.5%) | | PR #1009 그대로 (0.85+aux) | 65 (+1 회귀) | 23/64 (악화) | | 본 PR (0.95 + main만) | 64 ✓ | 60/64 (93.75%) ✓ | PR #1009 의 +1 over-split 직접 원인 = aux_trigger (empty bridge 휴리스틱 false positive). aux_trigger 제거 + high_threshold 0.85→0.95 narrow. 핵심 변경: - pagination/engine.rs (+71): variant cross-paragraph vpos reset 감지 - is_hwp3_variant 가드 (일반 HWP 무영향) - prev/curr line_seg synth (tag top bit) 아님 - prev_end_vpos > body × 0.95 (PR #1009 0.85 보다 보수적) - curr_first_vpos < 1500 HU (encoder page-reset 신호) - typeset.rs (+106): 동일 로직 두 경로 정합 - pagination.rs (+5) + rendering.rs (+3): PaginationOpts.is_hwp3_variant 필드 + 전달 variant 식별 인프라 (cfb_reader, model/document.rs, parser/mod.rs, hwpx/mod.rs) 는 #1005 이미 머지 — 재활용. 검증: - cargo build --release: warning 0 - cargo clippy --release --lib -- -D warnings: clean - cargo fmt --all -- --check: clean - cargo test --release --lib: 1319 passed; 0 failed - cargo test --release --test issue_1035_alignment: 1 passed (회귀 가드) - sample16-hwp5 페이지 수 64 유지 (PR #1009 over-split 65 회귀 재발 방지) - alignment 정합률 측정: 24/64 → 60/64 (93.75%) - 페이지 수 sweep 25 fixture (변환본 9종 + HWP3 + 일반): 모두 무변동 - 작업지시자 한컴 한글 정답지 시각 검증 — p21 영역 alignment 정합 회귀 가드: - tests/issue_1035_alignment.rs::hwp3_sample16_hwp5_page_count_64 — sample16-hwp5 64 유지 단언 잔존 + 후속: - 잔존 4 미정합 페이지 (p21 등) + p23 overflow 의 본질 = HWP5 변환본 paragraph height 가 HWP3 의 약 2배 (font/spacing metric 차이). Task #1008 격차 D (폰트 매핑) 영역 연장. 별도 issue 등록 예정 — "HWP5 변환본 paragraph height 과대 측정 (HWP3 대비 약 2배)". closes #1035
…ent fix (37.5% → 93.75%) @jangster77 (Taesup Jang) PR #1036 — closes #1035 (M100, v1.0.0). 핵심: - HWP3 vs HWP5 변환본 페이지 alignment 24/64 (37.5%) → 60/64 (93.75%) - is_hwp3_variant 가드 + cross-paragraph vpos reset 감지 (engine.rs + typeset.rs) - 조건 4개: variant + non-synth + prev_end > body × 0.95 + curr_first < 1500 HU - PR #1009 대비 narrow (aux_trigger 제거 + threshold 0.85 → 0.95) - 회귀 가드: tests/issue_1035_alignment.rs (sample16-hwp5 페이지 수 64 유지) 검증: - cargo test --release --lib: 1319 passed - cargo test --release --test issue_1035_alignment: 1/1 passed - 10 fixture BEFORE/AFTER 페이지 수 모두 일치 (회귀 부재) - 작업지시자 시각 판정 통과 본 환경 dry-run (PR base a52859d → origin/devel bc5683f) 본질 11 파일 squash 적용.
- mydocs/pr/archives/pr_1036_review.md (이동) - mydocs/pr/archives/pr_1036_report.md (최종 보고서 신규) - mydocs/plans/archives/task_m100_1035.md + task_m100_1035_impl.md (이동) - mydocs/orders/20260521.md PR #1036 항목 추가 PR #1036 (closes #1035, @jangster77 26+번째 기여): HWP3 vs HWP5 변환본 페이지 alignment 24/64 (37.5%) → 60/64 (93.75%). PR #1009 close 사유 정정 — aux_trigger 제거 + high_threshold 0.85 → 0.95 narrow. squash merge (devel 402e0ce) + 10 fixture 페이지 수 회귀 부재 + 작업지시자 시각 판정 통과 + WASM 4.90MB 동기화.
Summary
line_segs.vertical_pospage-reset 신호를 paginator 가 직접 인식하도록 cross-paragraph vpos reset 감지 로직 추가핵심 변경
src/renderer/pagination.rsPaginationOpts::is_hwp3_variant필드src/renderer/pagination/engine.rssrc/renderer/typeset.rstypeset_section_with_variant+ 동일 로직src/renderer/composer.rssrc/document_core/queries/rendering.rsis_hwp3_variant전달조건:
prev_end_vpos = vpos + line_height > body_height × 0.85(wrap shape/Table 의 lh 큰 값 반영)curr_first_vpos < 1500 HU(또는< 4000 HUfor curr empty line_segs)Test plan
cargo build --release통과cargo test --release --lib: 1303 passedcargo clippy --release -- -D warnings: 0 warningswasm-pack build --target web --out-dir pkg)Follow-up
본 PR 의 메인 scope (페이지 split 정합) 와 별개로, 변환본 일부 paragraph (pi=441/445/449/450/460/461 등 59 개) 의 PARA_LINE_SEG 누락으로 인한 render 누적 y micro-drift (페이지 마지막 paragraph 가 외곽선 9~45px overflow) 는 별도 follow-up issue 로 분리 등록 예정.
Closes #1007
🤖 Generated with Claude Code