Skip to content

Task #702: shortcut.hwp 다단 정의 후속 갱신 누락 정정 (closes #702)#710

Closed
planet6897 wants to merge 2 commits into
edwardkim:develfrom
planet6897:pr-task702
Closed

Task #702: shortcut.hwp 다단 정의 후속 갱신 누락 정정 (closes #702)#710
planet6897 wants to merge 2 commits into
edwardkim:develfrom
planet6897:pr-task702

Conversation

@planet6897

Copy link
Copy Markdown
Contributor

Summary

samples/basic/shortcut.hwp (한글 2010 단축키 일람표, A4 가로) 의 SVG 출력이 한글 2022 PDF 정답 (pdf/basic/shortcut-2022.pdf, 7쪽) 대비 10쪽 (+43%) 으로 폭주하던 결함 정정.

항목 수정 전 수정 후
페이지 수 10 8 (PDF 7 +1쪽)
LAYOUT_OVERFLOW 다수 (40~60px) 1건 (페이지 8 마지막)
페이지 1 지우기 1단 6항목 적층 2단 3+3 분할
페이지 2 섹션 파일 header 만 파일+미리보기+편집 통합

Root cause (2건)

본질 1A — Distribute 다단의 짧은 컬럼 vpos-reset 임계값

src/renderer/typeset.rs:430-446

기존 임계값 pv > 5000 이 짧은 Distribute (배분) 컬럼 (예: 지우기 3+3 분배, 마지막 paragraph vpos=3000) 에서 미달 → column-advance 미발동 → 6항목 1단 적층.

정정: ColumnType::Distribute (HWPX BalancedNewspaper) 한정 임계값 pv > 0 으로 완화. Normal/단단 분기는 기존 pv > 5000 유지.

본질 1B — Page/Column break + 새 ColumnDef 미적용

shortcut.hwp p2 의 파일/미리보기/편집 sections 는 다음 패턴 사용:

  • [쪽나누기] + 단정의:1단 + 표(header)
  • [단나누기] + 단정의:2단 배분

기존 코드는 MultiColumn break 만 ColumnDef 적용 → Page/Column break 동반 ColumnDef 무시 → col_count 가 이전 zone 값 유지 → 페이지 분기 폭주.

정정: Page/Column break 처리 시 새 ColumnDef 검출 후 zone 재정의:

  • Column + has_diff_col_def: process_multicolumn_break 호출
  • Column + 동일 ColumnDef: 기존 advance_column_or_new_page
  • Page/Section + has_diff_col_def: force_new_page 후 ColumnDef 적용

변경 파일

  • src/renderer/typeset.rs (+50 / -6)
    • ColumnType import + TypesetState.current_zone_column_type 필드
    • TypesetState::new 시그니처 변경 (column_type 인자)
    • 메인 루프 column-break 검출 + ColumnDef 적용
    • vpos-reset trigger 분기 (Distribute 한정 완화)
    • process_multicolumn_break 에서 column_type 전파
  • tests/issue_702.rs (신규, 2 회귀 가드)
    • shortcut_distribute_short_column_split: 페이지 수 ≤ 8
    • shortcut_page2_has_three_sections: 페이지 2 SVG 에 파일/편집 헤더 모두 존재
  • mydocs/plans/task_m100_702.md, task_m100_702_impl.md
  • mydocs/working/task_m100_702_stage2.md, task_m100_702_stage3.md
  • mydocs/report/task_m100_702_report.md

회귀 차단 가드

Normal (NEWSPAPER) 다단은 기존 pv > 5000 유지 → Task #321/#418/#470 회귀 차단:

  • tests/exam_eng_multicolumn.rs: 14 passed
  • tests/issue_418.rs: 1 passed
  • tests/svg_snapshot.rs: 7 passed (golden snapshots)
  • tests/issue_702.rs: 2 passed (신규 가드)
  • 전체 cargo test --release: 1248+ tests, 0 failed

잔여 결함 → 별도 이슈 분리

다른 열린 PR 과의 관계

src/renderer/typeset.rs 를 건드리는 다른 열린 PR (#644, #679, #707) 과 텍스트 충돌 없음 (각각 다른 line 영역, 다른 함수 분기):

머지 순서 무관, rebase + cargo test 통과 시 안전.

Test plan

  • cargo build --release 통과
  • cargo test --release: 1248+ passed, 0 failed
  • rhwp dump-pages samples/basic/shortcut.hwp: 페이지 1 지우기 단 5/6 = items=3/3, 페이지 2 = 파일+미리보기+편집 통합
  • rhwp export-svg samples/basic/shortcut.hwp: 8쪽 (수정 전 10쪽), LAYOUT_OVERFLOW 1건 (수정 전 다수)
  • 시각 판정 (qlmanage 비교): 페이지 1, 2 PDF 정합 우수
  • 광범위 샘플 회귀 (KTX, aift, hwp-multi-001, kps-ai, exam_eng): 무회귀

🤖 Generated with Claude Code

planet6897 and others added 2 commits May 9, 2026 08:57
)

samples/basic/shortcut.hwp (한글 2010 단축키 일람표, A4 가로) 의 SVG 출력이
한글 2022 PDF 정답 (7쪽) 대비 10쪽 (+43%) 으로 폭주하던 결함 정정.

## 본질 정정 (2건)

### 본질 1A — Distribute 다단의 짧은 컬럼 vpos-reset 검출 임계값

src/renderer/typeset.rs:430-446

기존 임계값 `pv > 5000` 은 짧은 Distribute (배분) 컬럼 (예: 지우기 3+3
분배) 에서 마지막 paragraph vpos=3000 < 5000 미달로 column-advance
미발동 → 6항목 1단 적층.

ColumnType::Distribute (HWPX BalancedNewspaper) 한정 임계값 `pv > 0` 으로
완화. Normal/단단 분기는 기존 `pv > 5000` 유지 → Task edwardkim#321/edwardkim#418/edwardkim#470
회귀 차단.

### 본질 1B — Page/Column break + 새 ColumnDef 미적용

shortcut.hwp p2 의 파일/미리보기/편집 sections 는 다음 패턴 사용:
- [쪽나누기] + 단정의:1단 + 표(header)
- [단나누기] + 단정의:2단 배분

기존 코드는 MultiColumn break 만 ColumnDef 적용 → Page/Column break
동반 ColumnDef 무시 → col_count 가 이전 zone 값 유지 → 페이지 분기
폭주.

Page/Column break 처리 시 새 ColumnDef 검출 후 zone 재정의 적용:
- Column + has_diff_col_def: process_multicolumn_break 호출
- Column + 동일 ColumnDef: 기존 advance_column_or_new_page
- Page/Section + has_diff_col_def: force_new_page 후 ColumnDef 적용
  (col_count, layout, column_type 갱신)

### 보조 변경

- TypesetState 에 current_zone_column_type: ColumnType 필드 추가
- TypesetState::new 시그니처에 column_type 인자 추가
- process_multicolumn_break 에서 ColumnDef 적용 시 column_type 전파
- typeset_section 에서 초기 column_def.column_type 전달

## 검증

| 항목 | 수정 전 | 수정 후 |
|------|--------|--------|
| 페이지 수 | 10 | 8 (PDF 7 +1쪽) |
| LAYOUT_OVERFLOW | 다수 (40~60px) | 1건 |
| 페이지 1 지우기 | 1단 6항목 | 2단 3+3 ✓ |
| 페이지 2 섹션 | 파일 header 만 | 파일+미리보기+편집 ✓ |

cargo test --release: 1248+ tests, 0 failed
- exam_eng_multicolumn: 14 passed (Task edwardkim#470 회귀 차단)
- issue_418: 1 passed (단단 partial-table split 잔재)
- svg_snapshot: 7 passed (golden snapshots)
- issue_702 (신규): 2 passed (회귀 가드)

## 잔여 결함 → 별도 이슈 분리

- Issue edwardkim#708: pi=94 bare [단나누기] at last col 1쪽 시프트 (fix 시도 시
  test_539/test_548/test_exam_math_page_count 회귀 발견 → rollback)
- Issue edwardkim#709: 부수 시각 결함 4건 (PUA 글자 / 탭 leader / 바탕쪽 자동번호
  / right col 우측 정렬)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
CLAUDE.md 하이퍼워터폴 절차 산출물:
- mydocs/plans/task_m100_702.md (수행계획서)
- mydocs/plans/task_m100_702_impl.md (구현계획서)
- mydocs/working/task_m100_702_stage2.md (Stage 2 본질 1 정정 보고)
- mydocs/working/task_m100_702_stage3.md (Stage 3 광범위 회귀 + 시각 판정)
- mydocs/report/task_m100_702_report.md (최종 결과 보고서)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@edwardkim edwardkim added this to the v1.0.0 milestone May 9, 2026
@edwardkim edwardkim added the enhancement New feature or request label May 9, 2026
edwardkim added a commit that referenced this pull request May 9, 2026
본질 (2 영역):
1. Distribute 다단의 짧은 컬럼 vpos-reset 임계값 — `pv > 5000` 임계값이
   짧은 Distribute (배분) 컬럼 (예: 지우기 3+3 분배, vpos=3000) 에서
   미달 → column-advance 미발동 → 6항목 1단 적층.
2. Page/Column break + 새 ColumnDef 미적용 — `MultiColumn` break 만
   ColumnDef 적용. shortcut.hwp p2 의 [쪽나누기]+1단 / [단나누기]+2단
   배분 패턴에서 col_count 가 이전 zone 값 유지 → 페이지 분기 폭주.

정정 (src/renderer/typeset.rs +50/-6):
- ColumnType 추적: `TypesetState.current_zone_column_type` 필드 추가
- vpos-reset trigger Distribute 한정 완화: pv > 0 (Normal/단단 영역 보존)
- Page/Column break + 새 ColumnDef 검출 후 zone 재정의:
  · Column + has_diff_col_def: process_multicolumn_break 호출
  · Page/Section + has_diff_col_def: force_new_page 후 ColumnDef 적용

영향 좁힘 (feedback_hancom_compat_specific_over_general):
- Normal (NEWSPAPER) 다단 → 기존 pv > 5000 유지 → Task #321/#418/#470 회귀 차단
- 단일 단 → 기존 cv == 0 && pv > 5000 유지

회귀 가드 (tests/issue_702.rs +102 LOC, 신규):
- shortcut_distribute_short_column_split: 페이지 수 ≤ 8
- shortcut_page2_has_three_sections: 페이지 2 SVG 에 "파일"/"편집" 섹션 헤더 모두 존재

검증:
- cargo test --release: lib 1167 + 통합 ALL GREEN, failed 0
- cargo test --release --test issue_702: 2 PASS (회귀 가드)
- cargo test --release --test exam_eng_multicolumn: PASS (Normal 다단 회귀 차단)
- cargo test --release --test issue_418: PASS (Task #321/#418 회귀 차단)
- cargo test --release --test svg_snapshot: 8/8 (form-002 PR #706 영역 보존)
- cargo clippy --release: 신규 경고 0
- 광범위 sweep 7 fixture / 170 페이지 / 회귀 0
- WASM 빌드 4,604,562 bytes

본 환경 직접 페이지 수 측정 (PR 본문 정합 입증):
- samples/basic/shortcut.hwp: 10 → 8 페이지 (PDF 권위 7, +1쪽 Issue #708 잔존)

분리된 후속:
- Issue #708: pi=94 bare [단나누기] 마지막 col 1쪽 시프트 (별개 본질)
- Issue #709: 부수 시각 결함 4건 (PUA 글자 / 탭 leader / 바탕쪽 자동번호 / 우측 정렬)

작업지시자 결정: 잔존 결함 분리 정합 → 시각 판정 면제 머지.

Closes #702

Co-Authored-By: Jaeook Ryu <jaeook.ryu@gmail.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
edwardkim added a commit that referenced this pull request May 9, 2026
- mydocs/pr/archives/pr_710_review.md (검토 문서)
- mydocs/pr/archives/pr_710_report.md (처리 보고서)
- mydocs/plans/archives/task_m100_702{,_impl}.md
- mydocs/orders/20260509.md: PR #710 행 + 본 사이클 패턴 라인 추가

처리 결과:
- 옵션 A — 2 commits 단계별 보존 cherry-pick + no-ff merge (63d3873)
- 시각 판정 면제 (작업지시자 결정 — 잔존 결함 분리 정합)
- 본 환경 직접 페이지 수 측정 정합 회복: shortcut.hwp 10 → 8 페이지
- 광범위 sweep 7 fixture / 170 페이지 / 회귀 0
- Issue #702 close 자동 정합

분리된 후속: Issue #708 OPEN (1쪽 시프트 잔존) + Issue #709 OPEN (부수 시각 결함 4건)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@edwardkim

Copy link
Copy Markdown
Owner

@planet6897 PR 머지 완료되었습니다 (devel 63d38737, --no-ff merge).

처리 결과

  • 옵션 A — 2 commits 단계별 보존 cherry-pick + no-ff merge
  • 시각 판정 게이트 면제 (작업지시자 결정 — 잔존 결함 분리 정합)
  • 충돌 0건 (auto-merging typeset.rs)

검증

본 환경 직접 페이지 수 측정 (PR 본문 정합 입증)

메모리 룰 정합

잔존 후속

처리 보고서: mydocs/pr/archives/pr_710_report.md. 감사합니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants