Skip to content

다단 paragraph 내 vpos-reset 미처리 정정 (closes #619)#622

Closed
planet6897 wants to merge 3 commits into
edwardkim:develfrom
planet6897:pr-task619-clean
Closed

다단 paragraph 내 vpos-reset 미처리 정정 (closes #619)#622
planet6897 wants to merge 3 commits into
edwardkim:develfrom
planet6897:pr-task619-clean

Conversation

@planet6897

Copy link
Copy Markdown
Contributor

Summary

  • 다단 paragraph 내부 line.vertical_pos == 0 (vpos-reset) 신호를 TypesetEngine partial-split 루프가 인식하도록 정정
  • samples/21_언어_기출_편집가능본.hwp 페이지 8 우측 단 마지막 줄(pi=181 line 8) 17.1 px overflow 해소
  • 한컴 2020 PDF 와 정확히 일치 (8줄 분할)

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 주석이 한계를 명시:

"vpos-reset 미지원으로 paragraph 가 col_bottom 너머에 layout 될 수 있는데…"

Change

TypesetEngine::typeset_paragraph partial-split 루프 (src/renderer/typeset.rs:1077-1093) 의 inner fit 루프에 vpos-reset forced break 추가.

for li in cursor_line..line_count {
    // [Task #619] 다단 paragraph 내 vpos-reset 강제 분리.
    if st.col_count > 1
        && li > cursor_line
        && para.line_segs.get(li).map(|s| s.vertical_pos == 0).unwrap_or(false)
    {
        break;
    }
    // ... 기존 fit 로직
}
조건 의도
st.col_count > 1 다단 한정. 단일 단의 partial-table split (issue #418) 회귀 차단
li > cursor_line 세그먼트 첫 줄 제외 (forced break 후 재진입 시 무한 루프 방지)
vertical_pos == 0 HWP vpos-reset 신호

Verification

대상 파일

항목 변경 전 변경 후
페이지 8 단 1 pi=181 lines=0..9 lines=0..8
페이지 9 단 0 pi=181 lines=9..13 lines=8..13
LAYOUT_OVERFLOW_DRAW (텍스트) 17.1 px 사라짐

한컴 2010 / 2020 PDF 비교

환경 pi=181 페이지 8 줄 수
한컴 2010 5줄
한컴 2020 8줄
변경 후 rhwp 8줄 ✓ (한컴 2020 정확 일치)

HWP vpos-reset 인코딩 의도 = 한컴 2020 분포.

회귀 가드 샘플 (HEAD~1 vs 변경 후 자동 비교)

샘플 LAYOUT_OVERFLOW (전/후) 페이지 분포
exam_eng.hwp (Task #470) 3 / 3 동일 동일
exam_kor.hwp (issue #418) 1 / 1 동일 동일
exam_science.hwp (Task #568) 1 / 1 동일 동일
exam_math.hwp 0 / 0 동일 동일
exam_social.hwp 0 / 0 동일 동일
hwp-multi-001.hwp (Task #470) 1 / 1 동일 동일
hwp-multi-002.hwp 0 / 0 동일 동일
k-water-rfp.hwp (Task #361) 2 / 2 동일 동일
kps-ai.hwp (Task #362) 7 / 7 동일 동일
aift.hwp (77p) 8 / 8 동일 동일

→ 모든 회귀 가드 샘플의 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 확인
  • 한컴 2020 PDF 분포 일치
  • 회귀 가드 샘플 10개 byte-equivalent 확인

Remaining

PartialParagraph/Shape bbox 잔여 2.4 px overflow (텍스트 자체는 단 안). 별도 이슈 분리 후보.

Files changed

  • src/renderer/typeset.rs (+9 LOC)
  • mydocs/{plans,working,report,orders}/ (신규 보고서/계획서)

planet6897 added 3 commits May 6, 2026 09:24
…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
@edwardkim

Copy link
Copy Markdown
Owner

PR #622 처리 결과

cherry-pick 머지 완료 (20e660c Stage 1 + a7eb171 Stage 2/3 + 2d20cc0 Stage 4 보고서). PR #622 close + Issue #619 close 처리.

처리 옵션

옵션 A — 3 commits 단계별 cherry-pick (author Jaeook Ryu 보존, committer edward). mydocs/orders/20260506.md add/add 충돌 영역은 본 환경 영역 보존 (ours) 정합.

본 환경 결정적 검증 (모두 통과)

항목 결과
cargo test --lib --release 1155 passed (회귀 0)
cargo test --test svg_snapshot --release 7/7
cargo test --test issue_546 / issue_554 / issue_418 / issue_501 1/1, 12/12, 1/1, 1/1
cargo clippy --lib -- -D warnings 0
cargo build --release 통과
Docker WASM 빌드 4,578,641 bytes (PR #621 baseline 4,606,564 -27,923)
rhwp-studio/public/{rhwp_bg.wasm, rhwp.js} 갱신 (vite dev server web 영역)

권위 영역 100% 일치 (본 환경 직접 측정)

항목 PR 본문 본 환경 측정
페이지 8 단 1 pi=181 lines=0..8 lines=0..8 vpos=77316..0 [vpos-reset@line8]
페이지 9 단 0 pi=181 lines=8..13 lines=8..13 vpos=0..7264 [vpos-reset@line8]
LAYOUT_OVERFLOW_DRAW 17.1px 사라짐 부재 ✓

메인테이너 시각 판정 ★ 통과 (web editor 영역)

권위 영역 — samples/21_언어_기출_편집가능본.hwp:

  • 페이지 8 우측 단 마지막 줄 영역 — line 8 정상 분할 (col_bottom 너머 부재)
  • 페이지 9 좌측 단 첫 줄 영역 — line 8 정상 배치 (vpos-reset 영역 정합)

회귀 영역 점검: 단일 단의 partial-table split (issue #418 회귀 차단 영역) 정합 — cargo test --test issue_418 1/1 통과.

본질 정정의 가치

다단 한정 가드 (st.col_count > 1 && li > cursor_line && line_segs[li].vertical_pos == 0) 는 구조적 판단 (col_count 영역 + cursor_line 영역 + vertical_pos 영역, 측정 의존 없음) — feedback_hancom_compat_specific_over_general 메모리 룰 권위 사례 강화. PR #621 의 다중 줄 가드 영역과 동일 패턴 (구조적 가드 좁힘 영역).

거버넌스 영역 정합 영역

본 PR 의 거버넌스 산출물 영역 (task_m100_619*) 은 본 환경 명명 규약 영역 정합 영역 — PR #621 영역의 m07 → m100 정정 영역과 다른 영역. cherry-pick 영역 그대로 정합.

잔여 영역 (PR 본문 §Remaining)

page=7 col=1 pi=181 PartialParagraph + Shape 2.4 px overflow — 본 PR 영역 외, 별도 이슈 분리 후보 영역.

cherry-pick 결과

  • 본질 commit 20e660c — Stage 1 (src + 거버넌스 일부)
  • Stage 2/3 commit a7eb171 — Stage 2 (한컴 PDF 비교) + Stage 3 (회귀 가드 샘플 검증)
  • 보고서 commit 2d20cc0 — Stage 4 최종 보고서

본 PR 의 정확한 본질 정정 + 다단 한정 구조적 가드 + 회귀 가드 sweep 10개 + 메인테이너 web editor 시각 판정 ★ 통과 패턴 모두 정합.

@edwardkim edwardkim closed this May 7, 2026
edwardkim added a commit that referenced this pull request May 7, 2026
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건
edwardkim added a commit that referenced this pull request May 7, 2026
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건
edwardkim added a commit that referenced this pull request May 7, 2026
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건
edwardkim added a commit that referenced this pull request May 11, 2026
- 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 필수)
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