다단 paragraph 내 vpos-reset 미처리 정정 (closes #619)#622
Conversation
…et forced break 추가 - src/renderer/typeset.rs::typeset_paragraph 의 partial-split 루프에 line_segs[li].vertical_pos == 0 (li>cursor) 강제 분리 검출 추가. - 다단 (col_count>1) 한정 적용 — 단일 단의 partial-table split (issue edwardkim#418) 회귀 차단. - 21_언어_기출_편집가능본.hwp 페이지 8 우측 단 마지막 줄 17.1px 오버플로 해소. 수행계획서/구현계획서/Stage 1 완료 보고서 포함.
Stage 2: - 한컴 2010 PDF (5줄 분할) vs 2020 PDF (8줄 분할) 비교. - 본 변경은 한컴 2020 분포와 정확히 일치 (HWP vpos-reset 인코딩 신호 존중). - 페이지 9 단 0 첫 줄 = pi=181 line 8 정상 배치 확인. Stage 3: - cargo test --release --lib 통과. - cargo clippy --release --all-targets -- -D warnings 통과. - 회귀 가드 샘플 10개 (exam_eng/exam_kor/exam_science/exam_math/exam_social/ hwp-multi-001/hwp-multi-002/k-water-rfp/kps-ai/aift) 의 LAYOUT_OVERFLOW 메시지 + 페이지 분포 변경 전후 완전 동일 확인. - 추가 광역 샘플 (2010-01-06, biz_plan, atop-equation-01) 회귀 없음.
- mydocs/report/task_m100_619_report.md 작성 (변경 전/후 dump-pages, 한컴 2010/2020 PDF 비교, 회귀 가드 샘플 10개 byte-equivalent 검증). - mydocs/orders/20260506.md 작성 (Task edwardkim#619 완료 항목). - closes edwardkim#619
PR #622 처리 결과cherry-pick 머지 완료 ( 처리 옵션옵션 A — 3 commits 단계별 cherry-pick (author Jaeook Ryu 보존, committer edward). 본 환경 결정적 검증 (모두 통과)
권위 영역 100% 일치 (본 환경 직접 측정)
메인테이너 시각 판정 ★ 통과 (web editor 영역)권위 영역 —
회귀 영역 점검: 단일 단의 partial-table split (issue #418 회귀 차단 영역) 정합 — 본질 정정의 가치다단 한정 가드 ( 거버넌스 영역 정합 영역본 PR 의 거버넌스 산출물 영역 ( 잔여 영역 (PR 본문 §Remaining)page=7 col=1 pi=181 PartialParagraph + Shape 2.4 px overflow — 본 PR 영역 외, 별도 이슈 분리 후보 영역. cherry-pick 결과
본 PR 의 정확한 본질 정정 + 다단 한정 구조적 가드 + 회귀 가드 sweep 10개 + 메인테이너 web editor 시각 판정 ★ 통과 패턴 모두 정합. |
PR #622 (Task #619 다단 vpos-reset 정정) 처리 완료 후속 영역: - mydocs/pr/archives/pr_622_review.md (1차 검토 + 옵션 분석 + 본 환경 cherry-pick simulation) - mydocs/pr/archives/pr_622_report.md (처리 결과 + 결정적 검증 + 권위 영역 측정 + 시각 판정 통과) - mydocs/orders/20260507.md PR #622 entry 추가 처리 결과 요약: - 옵션 A: 3 commits 단계별 cherry-pick (Stage 1 / Stage 2/3 / Stage 4) - mydocs/orders/20260506.md add/add 충돌 → ours 영역 본 환경 보존 - devel commits: 20e660c (Stage 1, author Jaeook Ryu) + a7eb171 (Stage 2/3) + 2d20cc0 (Stage 4) - cargo test 1155 / svg_snapshot 7/7 / issue_546 1/1 / issue_554 12/12 / issue_418 1/1 (단일 단 회귀 차단) / issue_501 1/1 / clippy 0 - WASM 4,578,641 bytes (PR #621 baseline -27,923) - rhwp-studio/public/{rhwp_bg.wasm,rhwp.js} 갱신 (vite dev server web 영역) - 권위 영역 100% 일치: 페이지 8 lines=0..8 + 페이지 9 lines=8..13 + LAYOUT_OVERFLOW_DRAW 17.1px 사라짐 - 메인테이너 web editor 시각 판정 ★ 통과 - PR #622 close + Issue #619 수동 close + 한글 댓글 본질 정정의 가치: - 다단 한정 가드 (col_count > 1 + li > cursor_line + vertical_pos == 0) 는 구조적 판단 (측정 의존 없음) - feedback_hancom_compat_specific_over_general 권위 사례 강화 누적 (PR #621 다중 줄 가드 + 본 PR 다단 vpos-reset 가드) 본 사이클 (5/7) PR 처리 누적: 10건
PR #627 (Task #624 exam_science p2 7번 글상자 ㉠ 사각형 y 회귀 정정 — Task #520 부분 회귀 복원) 처리 완료 후속 영역: - mydocs/pr/archives/pr_627_review.md (1차 검토 + 옵션 분석 + 본 환경 cherry-pick simulation + 권위 영역 직접 측정) - mydocs/pr/archives/pr_627_report.md (처리 결과 + TDD 흐름 영역 + 결정적 검증 + 권위 영역 100% 일치 + 시각 판정 통과) - mydocs/orders/20260507.md PR #627 entry 추가 처리 결과 요약: - 옵션 A: 5 commits 단계별 cherry-pick (TDD 흐름 영역 보존) - mydocs/orders/20260506.md add/add 충돌 → ours 영역 본 환경 보존 (PR #622 패턴 정합) - devel commits: fc8675c (Stage 0) + dc94a55 (Stage 1 RED) + e042a15 (Stage 2 분석) + f8085c8 (Stage 2 정정) + c55ee3c (Stage 3) — author Jaeook Ryu + Co-Authored-By Claude 5 commits 모두 보존 - cargo test --lib 1156 (test_624 RED → GREEN 정합) / svg_snapshot 7/7 / issue_546/554/418/501 통과 / clippy 0 - WASM 4,578,751 bytes (PR #626 baseline +110) - rhwp-studio/public/{rhwp_bg.wasm,rhwp.js} 갱신 (vite dev server web 영역) - 권위 영역 100% 일치: ㉠ rect y=235.413 + ㉠ text y=251.453 (PR 본문 정확 일치) - 메인테이너 web editor 시각 판정 ★ 통과 - PR #627 close + Issue #624 수동 close + 한글 댓글 본질 정정의 가치: - TDD 흐름 영역의 권위 패턴 (Stage 1 RED → Stage 2 정정 → Stage 3 GREEN) - feedback_close_issue_verify_merged 권위 사례 강화 누적 (PR #620 Task #519 누락 + 본 PR Task #520 누락 = PR #561 cherry-pick base diff 점검 누락 패턴) - 회귀 차단 가드 영구 보존 (test_624_textbox_inline_shape_y_on_line2_p2_q7) 본 사이클 (5/7) PR 처리 누적: 12건
PR #632 (Task #631 HWP 권위값 더블체크로 vpos-reset 인접 line 보존) 처리 완료 후속 영역: - mydocs/pr/archives/pr_632_review.md (1차 검토 + 옵션 분석 + cherry-pick simulation + 권위 영역 직접 측정) - mydocs/pr/archives/pr_632_report.md (처리 결과 + 결정적 검증 + 권위 영역 100% 일치 + Task #332 stage4b 종결) - mydocs/orders/20260507.md PR #632 entry 추가 처리 결과 요약: - 옵션 B: 5 commits cherry-pick (samples/aift.pdf 영역 제외, 본 환경 PR #670 pdf/aift-2022.pdf 영역 정합) - mydocs/orders/20260506.md add/add 충돌 → ours 영역 본 환경 보존 (PR #622/#627 패턴) - devel commits: 51c22a6 Stage 1 + 7127ded Stage 2 구현계획 + 5fdc096 Stage 2 정정 + e415f62 Stage 3 + e098562 Stage 4 (author Jaeook Ryu 보존) - cargo test --lib 1156 passed / svg_snapshot 7/7 / issue_546/554/418/501 통과 / clippy 0 - WASM 4,577,370 bytes (PR #627 baseline -1,381) - 권위 영역 100% 일치: page 18 pi=222 lines=0..2 + page 19 pi=222 lines=2..4 + [vpos-reset@line2] 마커 - 시각 판정 영역 스킵 (작업지시자 결정) — 결정적 검증 + 권위 영역 100% 일치 + 광범위 sweep 회귀 0 통과 - PR #632 close + Issue #631 수동 close + 한글 댓글 본질 정정의 가치: - HWP 권위값 더블체크 (다음 줄 vertical_pos==0 + 현재 줄 vpos+lh ≤ body_h) — 구조적 가드 영역 (측정 의존 없음) - feedback_hancom_compat_specific_over_general 권위 사례 강화 누적 (PR #621 다중 줄 가드 + PR #622 다단 vpos-reset + 본 PR vpos-reset 인접 line 보존 = 본 사이클의 vpos-reset 영역 권위 사례 누적) - Task #332 stage4b 알려진 회귀 (aift pi=222) 종결 본 사이클 (5/7) PR 처리 누적: 13건
- mydocs/pr/archives/pr_813_review.md (5 정책 위반 + 회귀 위험 분석) - mydocs/pr/archives/pr_813_report.md (옵션 C 처리 결과 + 분리 PR 가이드) - mydocs/orders/20260511.md PR #813 행 추가 핵심 문제점: 1. base=main 정책 위반 (devel 재제출 필수) 2. 폰트 라이선스 정책 어긋남 (Noto/Pretendard 미포함) 3. typeset.rs LINE_SEG 가드 회귀 위험 (PR #621/#622/#627/#632/#636 누적 정정 우회) 4. Issue 연결 부재 5. wasm_api.rs pub(crate) core 가시성 변경 분리 PR 3 가이드 (재제출 대기): - 분리 PR 1: pdf.rs SVG BBox (안전, PR #798 close 후속, 우선) - 분리 PR 2: 폰트 fallback (Noto/Pretendard 우선) - 분리 PR 3: typeset.rs LINE_SEG + HWPX adapter (광범위 sweep 필수)
Summary
line.vertical_pos == 0(vpos-reset) 신호를TypesetEnginepartial-split 루프가 인식하도록 정정samples/21_언어_기출_편집가능본.hwp페이지 8 우측 단 마지막 줄(pi=181 line 8) 17.1 px overflow 해소closes #619
Background
pi=181 line_segs[8].vertical_pos = 0(line>0 인데 vpos=0) 은 HWP 가 line 8 을 다음 단/페이지 최상단에서 시작하도록 인코딩한 vpos-reset 신호. 활성TypesetEngine의 partial-split 루프가 이를 무시 → line 8 이 col_bottom 너머에 그려짐.paragraph_layout.rs:1733주석이 한계를 명시:Change
TypesetEngine::typeset_paragraphpartial-split 루프 (src/renderer/typeset.rs:1077-1093) 의 inner fit 루프에 vpos-reset forced break 추가.st.col_count > 1li > cursor_linevertical_pos == 0Verification
대상 파일
lines=0..9lines=0..8lines=9..13lines=8..13한컴 2010 / 2020 PDF 비교
HWP
vpos-reset인코딩 의도 = 한컴 2020 분포.회귀 가드 샘플 (HEAD~1 vs 변경 후 자동 비교)
exam_eng.hwp(Task #470)exam_kor.hwp(issue #418)exam_science.hwp(Task #568)exam_math.hwpexam_social.hwphwp-multi-001.hwp(Task #470)hwp-multi-002.hwpk-water-rfp.hwp(Task #361)kps-ai.hwp(Task #362)aift.hwp(77p)→ 모든 회귀 가드 샘플의 overflow + 페이지 분포 변경 전후 완전 동일.
Test plan
cargo build --release통과cargo test --release --lib통과cargo clippy --release --all-targets -- -D warnings통과samples/21_언어_기출_편집가능본.hwp) 페이지 8 단 1 lines=0..8, 페이지 9 단 0 lines=8..13 확인Remaining
PartialParagraph/Shape bbox 잔여 2.4 px overflow (텍스트 자체는 단 안). 별도 이슈 분리 후보.
Files changed
src/renderer/typeset.rs(+9 LOC)mydocs/{plans,working,report,orders}/(신규 보고서/계획서)