[m100] exam_eng.hwp p7 #40 글상자 사이 화살표 누락 — PUA U+F003B → ↓ 매핑 추가 (closes #588)#592
[m100] exam_eng.hwp p7 #40 글상자 사이 화살표 누락 — PUA U+F003B → ↓ 매핑 추가 (closes #588)#592planet6897 wants to merge 4 commits intoedwardkim:develfrom
Conversation
exam_eng.hwp p7 edwardkim#40 요약형 문항 글상자 사이 화살표 누락 분석. PDF 임베디드 폰트 (HCRBatang) 글리프 외곽 분석으로 ↓ 형태 확정 (1 contour 7 pts, stem 35% × arrowhead 100% solid filled). 159 샘플 광범위 통계로 본 사이클 영역 (0xF0000~0xF00CF) U+F003B 1건 + U+F0090 1건 (별개 task) 만 검출 — 회귀 차단 정합. 수행 계획서 + Stage 1 보고서.
map_pua_bullet_char 에 SPUA-A 저영역 (0xF0000..=0xF00CF) 분기 신설 + U+F003B → U+2193 ↓ 매핑 추가. 단위 테스트 +2 (down_arrow + low_range unmapped). 7/7 GREEN. 본질: exam_eng.hwp p7 edwardkim#40 요약형 문항 글상자 사이 화살표가 SPUA-A 저영역 코드포인트 (한컴 자체 PUA) 로 저장 → 매핑 표 누락으로 SVG 두부 표시. 분기 디스조인트 설계 (기존 0xF02B0~F02FF, 0xF00D0~F09FF, 0xF020~F0FF 영역과 무중첩) → 회귀 위험 0. closes edwardkim#588 (Stage 4 시각 검증 후 클로즈 예정)
13 fixture × 583 SVG byte sweep — 1건 (exam_eng/p7) 의도된 변경, 나머지 582건 byte-identical. 회귀 0. 검증 게이트 전부 통과: - cargo test --lib: 1126 passed (3 ignored, 0 failed) - svg_snapshot: 6/6 - 통합 테스트: issue_418/501/505/514/516/530/546/exam_eng_multicolumn 전부 통과 - clippy --lib -D warnings: 0 신규 - WASM: 4,529,640 bytes 정합 빌드 분기 디스조인트 설계 (0xF0000~F00CF 단독 영역) 결정적 검증.
PUA U+F003B → ↓ U+2193 매핑 추가 사이클 완료. Stage 1 (PDF 글리프 외곽 분석 + 159 샘플 통계) → Stage 2 (분기 신설 + 매핑 + 단위 테스트 +2, 7/7 GREEN) → Stage 3 (광범위 회귀 점검, 582/583 byte-identical) → Stage 4 (본 보고서). 검증 완료: - cargo test --lib: 1126 passed - svg_snapshot: 6/6 - 통합 테스트: 전부 통과 - clippy: 0 신규 - WASM: 4,529,640 bytes - 광범위 byte sweep: 582/583 byte-identical
PR #592 (Task #588, @planet6897 PR / Jaeook Ryu commit author) 1차 검토: - 본질 결함: exam_eng.hwp p7 #40 요약형 문항 글상자 사이 ↓ 화살표가 SPUA-A 저영역 (U+F003B) 미매핑으로 두부(□) 표시 - Stage 1 PDF 글리프 외곽 분석: 한컴 PDF 임베드 폰트 AAAAAL+HCRBatang 의 uF003B 1 contour 7 pts → ↓ 형태 확정 (정밀 진단) - 본질 정정: map_pua_bullet_char 에 SPUA-A 저영역 (0xF0000..=0xF00CF) 분기 신설 + U+F003B → U+2193 매핑 - 디스조인트 설계: 기존 Task #528/#509/Wingdings 영역과 완전 무중첩 - 단위 테스트 +2 (down_arrow + low_range unmapped) - PR mergeable=MERGEABLE (본 사이클 첫 케이스), 본질 cherry-pick (2788fea) 충돌 0 - 본 환경 임시 검증: cargo test --lib --release 1134 passed (baseline 1132 + 단위 테스트 +2) / clippy 0건 권장 처리: 옵션 A — 핀셋 cherry-pick + 결정적 검증 + 광범위 sweep + WASM + 작업지시자 시각 판정.
…ixture 1,614 페이지 회귀 0 + U+F003B → ↓ 정확 1건 변환
…추가 — @planet6897 / Jaeook Ryu 1 commit + 시각 판정 ★ 통과) PR #592 (Task #588, @planet6897 PR / Jaeook Ryu commit author): - 본질 결함: exam_eng.hwp p7 #40 요약형 문항 글상자 사이 ↓ 화살표가 SPUA-A 저영역 (U+F003B) 미매핑으로 두부(□) 표시 - Stage 1 PDF 글리프 외곽 분석: 한컴 PDF 임베드 폰트 AAAAAL+HCRBatang 의 uF003B 1 contour 7 pts → ↓ 형태 확정 (정밀 진단) - 본질 정정: map_pua_bullet_char 에 SPUA-A 저영역 (0xF0000..=0xF00CF) 분기 신설 + U+F003B → U+2193 매핑 - 디스조인트 설계: 기존 Task #528/#509/Wingdings 영역과 완전 무중첩 - 단위 테스트 +2 (down_arrow + low_range unmapped) - 단일 파일 본질 (paragraph_layout.rs +32) 검증: - cargo test --lib --release 1134 passed (baseline 1132 + 단위 테스트 +2) - svg_snapshot 6/6 / issue_546 1 / issue_554 12 / clippy 0 / build --release - WASM 4,581,527 bytes (PR #584 baseline +29 bytes — paragraph_layout.rs +32 정합) - 광범위 페이지네이션 회귀 sweep: 164 fixture (158 hwp + 6 hwpx) / 1,614 페이지 / 페이지 수 회귀 0 - exam_eng p7 권위 영역 정확 1건 변환 (U+F003B → U+2193 ↓) - 다른 fixture 무영향 (exam_kor / exam_math / exam_science U+F003B 0건) 시각 판정 ★ 통과 — 메인테이너 exam_eng 7 페이지 40번 화살표 출력 확인. closes #588.
|
본 PR 의 본질 commit ( 처리 결과본질 cherry-pick
결정적 검증
광범위 페이지네이션 회귀 sweep (본 환경 자동)
SVG 정량 측정 — U+F003B 두부 → ↓ 화살표 변경
→ exam_eng 단독 정확 1건 변환 — PR 본문 100% 재현 + 다른 fixture 무영향. 디스조인트 설계 ( 페이지 7 권위 케이스 검증
- <text ... fill="#000000"></text>
+ <text ... fill="#000000">↓</text>→ x/y/font/size/scale/fill 모두 동일, U+F003B → U+2193 만 변경. PR 본문 100% 재현. 시각 판정 (★ 게이트)작업지시자 시각 검증 결과:
→ ★ 통과. PR 본문 권위 영역 (exam_eng p7 #40 요약형 문항 글상자 사이 ↓ 화살표) 정합 회복 확인. 본 PR 의 본질 — Stage 1 PDF 글리프 외곽 분석
디스조인트 설계 (회귀 차단)
→ 신설 분기는 기존 영역과 완전 디스조인트 ( 잔존 영역 (PR 본문 명시, 별도 이슈 후보)Stage 1 광범위 통계로 확인된 동일 영역 미매핑 코드포인트:
→ 별도 이슈 후보로 검토 가능. 처리 보고서: 본 PR 의 4-stage 하이퍼-워터폴 + Stage 1 PDF 글리프 외곽 직접 분석 + 디스조인트 설계 + 단위 테스트 +2 의 정밀한 흐름이 메인테이너 cherry-pick 의 본질만 깨끗하게 추출 + MERGEABLE 표시 (본 사이클 첫 케이스) 가능하게 했습니다. 감사합니다. |
- 처리 보고서 추가: mydocs/pr/archives/pr_592_report.md PR #592 (Task #588, @planet6897 / @jangster77) 핀셋 cherry-pick 1 commit + 결정적 검증 + WASM 4,581,527 bytes + 광범위 페이지네이션 sweep (164 fixture / 1,614 페이지 / 회귀 0) + 시각 판정 ★ 통과 + 본 사이클 첫 MERGEABLE PR - 검토 보고서 archives 이동: mydocs/pr/pr_592_review.md → mydocs/pr/archives/pr_592_review.md - 5/5 orders 갱신: PR #592 항목 추가
PR #593 (Task #590, @planet6897 PR / Jaeook Ryu commit author) 1차 검토: - 본질 결함: layout.rs:2285-2300 (Issue #480 도입 분기) 가 모든 Square-wrap 표를 무조건 문단 좌측 가장자리 기준으로 강제 배치 → horz_rel_to 속성 무시 - 정량 측정: exam_kor p17 [A] table_x = col_area.x + effective_margin + h_offset = 117.17 + 24.67 + 9.44 = 151.28 px (사용자 보고 6.5mm 치우침) - 본질 정정: 분기 가드에 horz_rel_to=Para 한정 1줄 추가 → Column/Page/Paper 는 compute_table_x_position 명세 기반 분기로 위임 - PR mergeable=MERGEABLE (PR #592 와 함께 본 사이클 두 번째 케이스), 본질 cherry-pick (5d3b3e2) 충돌 0 - 단 1 commit 에 본질 + 보고서 + orders 모두 묶임 (이전 PR 들과 다른 패턴) - 본 환경 임시 검증: cargo test --lib --release 1134 passed (회귀 0) / clippy 0건 권장 처리: 옵션 A — 핀셋 cherry-pick + 결정적 검증 + 광범위 sweep + WASM + 작업지시자 시각 판정.
…rel_to=단 속성 정합 — @planet6897 / Jaeook Ryu 1 commit + 시각 판정 ★ 통과) PR #593 (Task #590, @planet6897 PR / Jaeook Ryu commit author): - 본질 결함: layout.rs:2285-2300 (Issue #480 도입 분기) 가 모든 Square-wrap 표를 무조건 문단 좌측 가장자리 기준으로 강제 배치 → horz_rel_to 속성 무시 - 정량 측정: exam_kor p17 [A] table_x = col_area.x + effective_margin + h_offset = 117.17 + 24.67 + 9.44 = 151.28 px (사용자 보고 6.5mm 치우침) - 본질 정정: 분기 가드에 horz_rel_to=Para 한정 1줄 추가 → Column/Page/Paper 는 compute_table_x_position 명세 기반 분기로 위임 - 단일 파일 본질 (layout.rs +5/-4) 검증: - cargo test --lib --release 1134 passed (회귀 0) - svg_snapshot 6/6 / issue_546 1 / issue_554 12 / clippy 0 / build --release - WASM 4,581,465 bytes (PR #592 baseline -62 bytes — 가드 1줄 LLVM 최적화 효과) - 광범위 페이지네이션 회귀 sweep: 164 fixture (158 hwp + 6 hwpx) / 1,614 페이지 / 페이지 수 회귀 0 - exam_kor 4 페이지 의도된 정정 (PR 본문 100% 재현): page 14 [A] x4 (Right -7.55 px 명세 정합 향상) + page 17 [A] (Left -24.7 px 사용자 보고 정정) + page 18 [B] x2 + page 19 [B] (Left 동류 정정) - page 17 [A] 글자 정량 검증: 152.28 → 127.61 px (정확 -24.67 px) 시각 판정 ★ 통과 — 작업지시자 SVG + 웹 캔바스 양쪽 검증 완료. closes #590.
PR #600 (closes #513, @oksure Hyunwoo Park) 1차 검토: - 본질 결함: Task #509 의 map_pua_bullet_char 매핑이 convert_pua_enclosed_numbers (composer) 의 CharOverlap 변환에 막혀 도달 못 함 - 본질 정정: composer.rs 에서 F02B1~F02C4 CharOverlap 제외 + paragraph_layout.rs 에 ⑩~⑳ 매핑 추가 (전체 20자 완성) - Copilot review 3개 응답 (aafe85a): ⑩~⑳ 테스트 + 주석 + 폭 계산 정합 - PR base skew (PR #571/#599 패턴) — UI MERGEABLE 표시지만 PR base diff 가 본 사이클 cherry-pick 모두 revert - 그러나 본질 commit 영역이 본 사이클 처리분과 0 중첩 (PR #592 의 SPUA-A 저영역 F0000~F00CF 와 다른 코드포인트 영역) → commit 단위 cherry-pick 가능 - 본 환경 임시 검증: 2 commits cherry-pick 충돌 0 + cargo test --lib --release 1134 passed (회귀 0) + clippy 0건 + PUA 테스트 12 passed 권장 처리: 옵션 A — commit 단위 cherry-pick (2 commits, 단순 머지 절대 금지) + 결정적 검증 + 광범위 sweep + 작업지시자 시각 판정.
…A SVG 출력 정정 — @oksure 2 commits + 시각 판정 ★ 통과) PR #600 (closes #513, @oksure Hyunwoo Park): - 본질 결함: Task #509 의 map_pua_bullet_char 매핑이 convert_pua_enclosed_numbers (composer) 의 CharOverlap 변환에 막혀 도달 못 함 - 본질 정정: composer.rs 에서 F02B1~F02C4 CharOverlap 제외 + paragraph_layout.rs 에 ⑩~⑳ 매핑 추가 (전체 20자 완성) - Copilot review 3개 응답 (aafe85a): ⑩~⑳ 테스트 + 주석 + 폭 계산 정합 PR base skew (PR #571/#599 패턴) — UI MERGEABLE 표시지만 PR base diff 가 본 사이클 cherry-pick 모두 revert. 그러나 본질 commit 영역이 본 사이클 처리분과 0 중첩 (PR #592 의 SPUA-A 저영역 F0000~F00CF 와 다른 코드포인트 영역 F02B1~F02C4) → commit 단위 cherry-pick 가능. cherry-pick 2 commits (충돌 0, author Hyunwoo Park 보존): - 34f8547 fix: Supplementary PUA-A (U+F02B1~F02C4) SVG 출력 정정 - 14f30e8 address review: ⑩~⑳ 테스트 추가 + 주석 갱신 + 폭 계산 정합 검증: - cargo test --lib --release 1134 passed (회귀 0) - cargo test --lib pua 12 passed (supplementary_pua_a_maps_circled_digits ⑩~⑳ GREEN) - svg_snapshot 6/6 / issue_546 1 / issue_554 12 / clippy 0 / build --release - 광범위 페이지네이션 sweep: 164 fixture / 1,614 페이지 / 회귀 0 - SVG 정량 (원문자 출현): pua-test 0→9 / mel-001 20→34 / kps-ai 32→34 / KTX 변경 없음 (PR 본문 100% 재현) 시각 판정 ★ 통과. 별개 영역 발견: pua-test U+F53A 옛한글 자모 시퀀스의 아래아 (U+119E ᆞ) 글리프 미렌더 — 별도 이슈 #615 등록 (옛한글 폰트 fallback 영역). closes #513.
- 처리 보고서 추가: mydocs/pr/archives/pr_600_report.md PR #600 (closes #513, @oksure) commit 단위 cherry-pick 2 commits + 결정적 검증 + 광범위 sweep (164 fixture / 1,614 페이지 / 회귀 0) + SVG 정량 (pua-test 0→9 / mel-001 +14 / kps-ai +2 / KTX 변경 없음) + 시각 판정 ★ 통과 - 검토 보고서 archives 이동: mydocs/pr/pr_600_review.md → mydocs/pr/archives/pr_600_review.md - 5/5 orders 갱신: PR #600 + Issue #615 항목 추가 별개 영역 발견 + 후속 이슈: - Issue #615: pua-test U+F53A 가 pua_oldhangul.rs:5022 에서 자모 시퀀스 (ᄒᆞᆫ) 로 임의 변환되지만 한컴 PDF 정답지는 "Basic-out, 매핑 표 외" 빈 공백 처리 — pua_oldhangul.rs 매핑 한컴 정합 안 함 PUA 회귀 패턴 인식 — 작업지시자 안내 "PUA 가 계속 회귀되는 현상": PR #587/#562/#592/#600 + Issue #615 누적의 두더지 잡기 패턴. PUA 매핑 표 통합 재검증 별도 광범위 task 후보.
v0.7.9 후속 patch 사이클 (5/4 ~ 5/6). ## 신규 기능 - **CLI 바이너리 릴리즈** (Issue #608/#612, @almet 의 요청) - 4 플랫폼 GitHub Release 자산 첨부 (Linux x86_64 / macOS x86_64+aarch64 / Windows x86_64) + SHA-256 체크섬 - **PNG raster backend** (PR #599, @seo-rii) — render P4 단계 - native Skia 기반 PageLayerTree → PNG export, native-skia feature gate - **AI 파이프라인 + VLM 연동 도입** (메인테이너 후속 정정): - --vlm-target claude (1568 longest edge / 1.15 MP, Claude Vision 정합) - --scale / --max-dimension (자동 scale 계산) - export-png CLI 명령 + 매뉴얼 (한글 + 영문 dual) - 한글 폰트 fallback chain + char 단위 fallback (공백 두부 정정) + --font-path 동적 로딩 ## 외부 PR cherry-pick (13 PR / 7 컨트리뷰터) - @planet6897 / Jaeook Ryu (협업): PR #587/#589/#561/#564/#570/#575/ #580/#584/#592/#593/#567 - @oksure (Hyunwoo Park): PR #600 (closes #513) - @seo-rii: PR #599 (refs #536) - @cskwork / @johndoekim / @nameofSEOKWONHONG / @jangster77 — 사이클 누적 ## 메인테이너 정정 Skia 폰트 영역 5개 정정 (한글 fallback / font-path / char-fallback / VLM 옵션 / export-png CLI). ## 인프라 - CI 빌드 안정성 (Cargo.toml [[example]] required-features) - 광범위 페이지네이션 회귀 sweep 도구 (164 fixture / 1,614 페이지 자동) ## 후속 이슈 - #613 (VLM 프리셋 확장) - #614 (DPI 메타데이터) - #615 (pua_oldhangul.rs U+F53A 한컴 정합) - #598 (rhwp-studio 각주 삭제, 외부 컨트리뷰터 공개) ## 잔여 PR (v0.7.11 후속 patch) PR #601, #602 (@oksure) / PR #607 (@dicebattle) / PR #609 (@jangster77, Task #604) / PR #611 (@kihyunnn). 상세: CHANGELOG.md (한글) / CHANGELOG_EN.md (영문).
본질
samples/exam_eng.hwp7페이지 40번 요약형 문항의 첫 번째 글상자(원문 passage)와 두 번째 글상자(요약) 사이에 위치한 ↓ 화살표가 SVG에 두부(□)로 렌더되는 결함 정정.원인: pi=278 의 단일 문자 U+F003B (UTF-8 `f3 b0 80 bb`) 가 SPUA-A 저영역 (`0xF0000~0xF00CF`) 으로 `map_pua_bullet_char` 매핑 표 밖. 글리프 미보유 폰트에서 두부 표시.
정정
`src/renderer/layout/paragraph_layout.rs` 의 `map_pua_bullet_char` 에 SPUA-A 저영역 분기 신설:
```rust
if (0xF0000..=0xF00CF).contains(&code) {
return match code {
0xF003B => '\u{2193}', // ↓ DOWNWARDS ARROW
_ => ch,
};
}
```
매핑 글리프 확정 근거: `samples/exam_eng.pdf` 7쪽의 임베디드 폰트 `AAAAAL+HCRBatang` 의 `uF003B` 글리프 외곽 분석 — 1 contour 7 pts (stem 35% × arrowhead 100% × solid filled) → ↓ 형태 확정.
검증
단위 테스트 (+2)
회귀 차단 설계
신설 분기 (`0xF0000..=0xF00CF`) 는 기존 분기와 완전 디스조인트:
설계 검증: 583 SVG sweep 에서 582 byte-identical → 디스조인트 설계 결정적 확인.
시각 변경
`exam_eng_007.svg:4162` 정확한 1행 변경:
```diff
```
x/y/font/size 동일.
잔존 영역 (별도 이슈 후보)
Stage 1 광범위 통계로 확인된 동일 영역 미매핑 코드포인트:
F02C5, F02CEF02D0, F02FC — Task draw_text 의 PUA 강제 변환 회귀 — 일반 텍스트의 원문자/특수문자 영역 결함 (PR #251 origin) #509 영역 default단계 사이클 (4 stages)
closes #588