Skip to content

Task #555: 옛한글 PUA → 자모 변환 후 폰트 매트릭스 갱신 (closes #555)#562

Closed
planet6897 wants to merge 7 commits into
edwardkim:develfrom
planet6897:pr-task555
Closed

Task #555: 옛한글 PUA → 자모 변환 후 폰트 매트릭스 갱신 (closes #555)#562
planet6897 wants to merge 7 commits into
edwardkim:develfrom
planet6897:pr-task555

Conversation

@planet6897

Copy link
Copy Markdown
Contributor

Summary

본질

Task #528 의 정정 (Option A — 렌더러 draw_text 시점 변환):

  • run.text 는 IR 와 동일하게 PUA char 1글자 보존
  • run.display_text 에 자모 시퀀스 (3-4 char) 저장
  • svg.rs / web_canvas.rs 는 display_text 사용 → visual OK ✅

폰트 매트릭스 측정이 run.text (PUA) 기준이라 자모 시퀀스 와 불일치:

영역 호출처 본 cycle 정정
LineSeg 검증 composer.rs:920 헬퍼 적용
Square wrap host est_x layout.rs:3444 char-by-char PUA → jamo 변환
TAC leading width (full run) layout.rs:3510/3522 헬퍼 적용
TAC leading width (partial run) layout.rs:3516 partial PUA → jamo 변환
셀 max width / 분할 추적 table_layout.rs:860/1825/1851 헬퍼 적용
셀 inline shape text_before table_layout.rs:1659/1935 text PUA → jamo 변환

5 단계 진행

Stage 본질 산출물
1 진단 — PUA 영향 fixture (15+) + 호출처 매핑 + symptom 분석 mydocs/working/task_m100_555_stage1.md
2 TDD RED — 헬퍼 STUB + 단위 테스트 3건 (2 RED + 1 GREEN) mydocs/working/task_m100_555_stage2.md
3 본질 정정 — 헬퍼 fix + 9 호출처 적용 (Stage 4 와 통합)
4 광범위 sweep — 13 fixture 481 페이지 byte-identical mydocs/working/task_m100_555_stage4.md
5 최종 보고서 + 새 PR 등록 mydocs/report/task_m100_555_report.md

Test plan

결과 해석

본 fix 는 conservative:

  • visual char positioning 은 IR 기반 → estimate_text_width 영향 없음
  • PUA + (TAC 표 / Square wrap / 셀 inline shape) 동거 케이스가 현 13 fixture 에 부재
  • 비-PUA 영역 fallback 으로 동일 동작 (회귀 0)

잠재적 효과 (현재 비활성, 미래 fixture 에서 자동 정합):

  • TAC inline 표 앞 PUA 텍스트
  • wrap=Square 호스트 PUA 텍스트 overflow
  • 셀 안 PUA + inline TAC Shape

메모리 룰 적용

  • feedback_no_pr_accumulation — 새 PR 로 등록 (PR Layout Phase 0~2 + 옛한글 PUA + 누적 task fix (Task #435~#528, #549/#550) #551 잔존 누적 회피)
  • feedback_per_task_pr_branchplanet6897:pr-task555 별도 fork branch
  • feedback_essential_fix_regression_risk — 13 fixture 481 페이지 광범위 검증
  • feedback_rule_not_heuristic — 단일 룰 (분기/허용오차 없음, fallback 패턴)
  • feedback_visual_regression_grows — byte-identical 이므로 시각 판정 auto-pass

처리 보고서

  • mydocs/report/task_m100_555_report.md
  • mydocs/plans/task_m100_555.md / task_m100_555_impl.md
  • mydocs/working/task_m100_555_stage1.md / _stage2.md / _stage4.md

🤖 Generated with Claude Code

planet6897 and others added 7 commits May 4, 2026 09:57
… 산식 정정)

paragraph_layout.rs:
1. inner_pad 분기 제거 (line 693~717 → 693~700, -22 LOC)
   - has_visible_stroke / bs_left_px / bs_right_px / inner_pad_left/right 변수 모두 제거
   - margin_left = box_margin_left (단일 룰, 텍스트 inset 한 번만)
2. box_x/w 산식 정정 (line 2687~2691)
   - override 케이스: (ox, ow) — margin 미적용
   - 일반 케이스: (col_area.x, col_area.width) — margin 미적용
   - paragraph border outline = col_area 전체 (PDF 한컴 2010 정합)

integration_tests.rs:
- test_544_passage_box_coords_match_pdf_p4 의 #[ignore] 제거 → GREEN
- test_547_passage_text_inset_match_pdf_p4 의 #[ignore] 제거 → GREEN

검증:
- cargo test --lib: 1121 passed / 3 ignored (baseline 1119/5 → +2 GREEN, -2 ignored)
- 회귀 0건
- test_552_passage_box_top_gap_p2_4_6 (--ignored) GREEN 유지
  → Task edwardkim#552 가 Task edwardkim#544 (2) 효과 흡수 (Stage 1 finding 확정)

측정값:
- test_544: box_left_x 128.51 → 117.0 (PDF 117.0 ±2), box_width 425.1
- test_547: min_x 139.89 → 128.5 (PDF 128.5 ±2)

작업지시자 보고 증상 (글상자 우측 시프트) 직접 fix.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…y-pick @planet6897 1 commit)

옵션 A2 채택 — `05beb208` (Task edwardkim#544 v2 Stage 2) 단독 cherry-pick.
B1 진단 결과 본 devel 의 Task edwardkim#479 미적용 trailing-ls 모델 확인 →
당초 옵션 A3 (edwardkim#552 + v2 + v3) 의 모델 전환 위험 회피 → 최소 fix 채택.

- mydocs/pr/pr_551_review_v3_544_a2.md (검토 문서)
- mydocs/pr/pr_551_v3_544_a2_report.md (처리 보고서)
- mydocs/orders/20260504.md (오늘할일 신규)

closes edwardkim#544

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
… (옵션 A2 — passage 글상자 우측 시프트 정정 — @planet6897 1 commit)

작업지시자 보고: "21_언어_기출_편집가능본.hwp 1/2/4/5/7/8/11/13/14 페이지
글상자가 오른쪽으로 밀려있음".

이슈 edwardkim#544 (closed) 재오픈 후 PR edwardkim#551 잔존 cherry-pick. 당초 옵션 A3
(edwardkim#552 + v2 + v3) 검토했으나 B1 진단 결과 본 devel 의 Task edwardkim#479 미적용
(pre-edwardkim#479 trailing-ls 항상 가산 모델) 확인 → edwardkim#552/v3 cherry-pick 시
모델 전환 위험. 옵션 A2 (`05beb208` 단독, edwardkim#547+edwardkim#544(1) 통합) 채택.

본질 정정 (paragraph_layout.rs):
1. box_x = col_area.x / box_w = col_area.width (margin 미적용,
   paragraph border outline = col_area 전체).
2. inner_pad 분기 제거 (visible-stroke + bs=0 인 경우 margin_left =
   box_margin_left + inner_pad_left 이중 적용 → 단일 적용).

측정 (페이지 4 [7~9]):
- 박스 left x: 128.51 → 117.17 (PDF 117.0)
- 박스 width: 402.5 → 425.17 (PDF 425.1)
- 본문 첫 글자 '평' x: 153.12 → 128.51 (PDF 128.5)
- 9 박스 (col 0/1) 모두 정합

검증:
- cargo test --lib 1120 / test_544+test_547 +2 GREEN / 회귀 0건
- clippy 0 신규 (pre-existing 2건 동일 baseline)
- 5 샘플 58 페이지 광범위 sweep: 38 differ (의도된 paragraph border
  정합 변경, visible-stroke paragraph text -11.33 px 좌측 시프트 의도)
- 회귀 검출 가능 영역 (비-border paragraph text) 0 변경
- 작업지시자 시각 판정 통과

cherry-pick 1 commit:
- 457d5f3 Task edwardkim#544 v2 Stage 2 (`05beb208` from @planet6897)

처리 보고서: mydocs/pr/pr_551_v3_544_a2_report.md
검토 문서: mydocs/pr/pr_551_review_v3_544_a2.md

closes edwardkim#544

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- mydocs/pr/pr_551_review_v3_544_a2.md → archives/
- mydocs/pr/pr_551_v3_544_a2_report.md → archives/
- mydocs/orders/20260504.md: 처리 상태 갱신 (devel merge f6039f3 push + 이슈 edwardkim#544 close)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- mydocs/plans/task_m100_555.md (수행 계획서)
- mydocs/plans/task_m100_555_impl.md (구현 계획서, 5 단계)
- mydocs/working/task_m100_555_stage1.md (진단 보고서)

작업지시자 승인 게이트:
- 수행 계획 승인 (옵션 A — display_text 우선 사용)
- 구현 계획 승인 (5 단계)
- Stage 1 진단 승인

본질: 옛한글 PUA → 자모 변환 후 폰트 매트릭스 (estimate_text_width 등)
계산이 PUA 1글자 기준 (run.text) 으로 유지 → 자모 시퀀스 (3-4 char) 와 정합 안 됨.

옵션 A: 호출처 ~10건에 effective_text_for_metrics 헬퍼 적용
(display_text.as_deref().unwrap_or(&run.text)). 인덱싱 불변성 유지.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
본질 정정:
- composer.rs: effective_text_for_metrics 헬퍼 추가
  (display_text.as_deref().unwrap_or(&run.text))
- composer.rs:920 estimate_composed_line_width 헬퍼 적용
- layout.rs:3444 Square wrap host est_x: PUA char per-char 변환
- layout.rs:3510/3522 compute_tac_leading_width run-level 헬퍼
- layout.rs:3516 partial run: PUA → jamo 변환
- table_layout.rs:860/1825/1851 셀 분할/max width 헬퍼
- table_layout.rs:1659/1935 셀 inline shape text_before:
  PUA → jamo 변환

단위 테스트 (composer/tests.rs +69 LOC, 3 신규):
- test_555_effective_text_for_metrics_uses_display_text_when_present
- test_555_effective_text_for_metrics_multi_jamo_cluster
- test_555_effective_text_for_metrics_no_display_text_falls_back_to_text

검증:
- cargo test --lib --release: 1123 passed (baseline 1120 + 3 신규 GREEN)
- cargo clippy: 0 신규 결함 (pre-existing 2건 동일 baseline)
- 광범위 SVG sweep (13 fixture, 481 페이지, PUA char 334개):
  481/481 byte-identical — 회귀 0
- Task edwardkim#544/edwardkim#547/edwardkim#548 회귀 가드 GREEN 유지

본 fix 는 conservative — 비-PUA fallback + PUA 영역 매트릭스 정확도
향상 (잠재적 결함 차단). 현 fixture 의 visual 출력 변화 없음
(IR 기반 char positioning 영역과 무관).

작업지시자 시각 판정 통과 (byte-identical auto-pass).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- mydocs/report/task_m100_555_report.md (최종 보고서)
- mydocs/orders/20260504.md: Task edwardkim#555 추가 + 메모리 정합 갱신

closes edwardkim#555

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
edwardkim added a commit that referenced this pull request May 4, 2026
…v2 + Task #555)

cherry-pick (작업지시자 옵션 A — 7 commits 모두):
- a30dca7 (457d5f3): Task #544 v2 Stage 2 paragraph border 좌표/inset
- f30b352 (b146b83): PR #551 Task #544 핀셋 처리 보고서 + 검토 문서
- (skip) (f6039f3): merge commit — 이미 적용된 영역
- f45f6a0 (f807378): PR #551 Task #544 처리 후속 archives 이동
- af556a5 (096b573): Task #555 수행/구현 + Stage 1 진단
- f44a721 (beade38): Task #555 Stage 2-4 옛한글 PUA 폰트 매트릭스 정정 (옵션 A)
- 4af03b7 (eac36f2): Task #555 최종 보고서

검증:
- cargo test --lib 1123 passed (Task #555 단위 테스트 +3 GREEN)
- cargo test --test issue_546/530/505/418/501 회귀 0
- cargo test --test svg_snapshot 6/6 passed
- cargo clippy --lib 0 건
- WASM 4,585,998 bytes (+42,568 from Task #528, Task #544 v2 + #555 반영) + studio 동기화

작업지시자 시각 판정 (web Canvas):
- "웹 에디터에서 옛한글 매트릭스 개선이 시각적으로 확인되었습니다.
   아직 미진한 점이 있지만 분할 정복 전략에 맞는 접근법입니다."

본 PR 의 본질:
- Task #555 (closes #555): 옛한글 PUA → 자모 변환 후 폰트 매트릭스 갱신
  · effective_text_for_metrics 헬퍼 + 호출처 10건 패치
  · 13 fixture 481 페이지 481/481 byte-identical (PR 본문)
  · Conservative fix (현재 visual 영향 없음, 잠재적 결함 차단)
- Task #544 v2: paragraph border 좌표/inset 산식 (PR #560 사이클 영역, 본 환경 처음 적용)

컨트리뷰터 메모리 룰 적용 정합:
- feedback_no_pr_accumulation, feedback_per_task_pr_branch
- feedback_essential_fix_regression_risk, feedback_rule_not_heuristic

산출물:
- mydocs/pr/pr_562_report.md (처리 결과)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
edwardkim added a commit that referenced this pull request May 4, 2026
…PUA 폰트 매트릭스 — @planet6897 6 commits) — closes #555

본 PR 은 외부 컨트리뷰터 @planet6897 (Jaeuk Ryu) 의 PR. Task #528 후속 결함
(이슈 #555: 옛한글 PUA → 자모 변환 후 폰트 매트릭스 갱신) 정정.

작업지시자 결정으로 옵션 A (7 commits 모두 cherry-pick) 진행 — Task #555 의
본질 외에 PR #551 Task #544 v2 처리 영역 (PR #560 사이클 영역) 도 함께 본
환경에 적용.

cherry-pick (6 commits + merge commit 1건 skip):
- Task #544 v2 Stage 2: paragraph border 좌표/inset 산식 정정
  · paragraph_layout.rs box_x/w 산식 + inner_pad 분기 제거
- PR #551 Task #544 핀셋 처리 보고서 + 검토 + archives
- Task #555: 옛한글 PUA → 자모 변환 후 폰트 매트릭스 갱신 (3 commits)
  · effective_text_for_metrics 헬퍼 (composer.rs)
  · 호출처 10건 패치 (composer / layout / table_layout)
  · Task #555 단위 테스트 +3 GREEN

본질 (Task #555):
- Task #528 의 Option A (렌더러 시점 변환) 의 인덱싱 불변성 trade-off 로
  run.text 가 PUA char 1글자 보존 → 폰트 매트릭스가 자모 시퀀스와 정합 안 됨
- effective_text_for_metrics(run) = run.display_text.as_deref().unwrap_or(&run.text)
  fallback 패턴 + 호출처 10건 패치
- Conservative fix: 13 fixture 481 페이지 481/481 byte-identical (PR 본문)

검증:
- cargo test --lib 1123 passed (Task #555 단위 테스트 +3 GREEN)
- cargo test --test issue_546/530/505/418/501 회귀 0
- cargo test --test svg_snapshot 6/6 passed
- cargo clippy --lib 0 건
- WASM 4,585,998 bytes + rhwp-studio 동기화

시각 판정 (작업지시자):
- "웹 에디터에서 옛한글 매트릭스 개선이 시각적으로 확인되었습니다.
   아직 미진한 점이 있지만 분할 정복 전략에 맞는 접근법입니다."

미진한 영역은 향후 별도 task 로 분할 정복 정합.

컨트리뷰터의 메모리 룰 적용 정합:
- feedback_no_pr_accumulation: 새 PR 로 등록 (PR #551 잔존 누적 회피)
- feedback_per_task_pr_branch: 별도 fork branch (pr-task555)
- feedback_essential_fix_regression_risk: 481 페이지 광범위 sweep
- feedback_rule_not_heuristic: 단일 fallback 패턴
@edwardkim

Copy link
Copy Markdown
Owner

@planet6897 님의 PR 을 cherry-pick 머지로 devel 에 반영했습니다 (devel `19119c2`).

작업지시자 결정으로 옵션 A (7 commits 모두 cherry-pick) 진행 — Task #555 본질 외에 PR #551 Task #544 v2 처리 영역도 함께 적용.

머지된 commits (6 + 1 skip)

author 는 @planet6897 으로 보존되었습니다.

검증

시각 판정 (작업지시자, web Canvas)

✅ 통과 — 작업지시자 인용:

웹 에디터에서 옛한글 매트릭스 개선이 시각적으로 확인되었습니다. 아직 미진한 점이 있지만 분할 정복 전략에 맞는 접근법입니다.

컨트리뷰터께 감사 + 정합한 영역 인정

본 PR 의 정합한 영역이 매우 인상적이었습니다:

  1. Task 옛한글 PUA → KS X 1026-1:2007 자모 변환 (HncPUAConverter 정합) — exam_kor 17p 고어 미렌더 #528 → Task 옛한글 PUA → 자모 변환 후 폰트 매트릭스 (글자폭/줄간격) 계산 갱신 필요 (Task #528 후속) #555 의 분할 정복 — Task 옛한글 PUA → KS X 1026-1:2007 자모 변환 (HncPUAConverter 정합) — exam_kor 17p 고어 미렌더 #528 의 본질 정정 (PUA → 자모 매핑) 후 후속 결함 (폰트 매트릭스 정합) 을 별도 task 로 분리 + Conservative fix 진행
  2. 메모리 룰 명시 인용 + 적용 — PR 본문에 `feedback_no_pr_accumulation` / `feedback_per_task_pr_branch` / `feedback_essential_fix_regression_risk` / `feedback_rule_not_heuristic` 모두 명시. 본 사이클의 작업지시자 피드백을 정합하게 학습 + 적용한 모범 사례
  3. 새 PR + 별도 fork branch (`pr-task555`) — PR Layout Phase 0~2 + 옛한글 PUA + 누적 task fix (Task #435~#528, #549/#550) #551 의 fork 누적 패턴과 다른 정합한 분리 워크플로우
  4. Conservative fix + 481/481 byte-identical — 현재 visual 영향 없이 잠재적 결함 차단 (광범위 회귀 0)
  5. Fallback 패턴 단일 룰 — `run.display_text.as_deref().unwrap_or(&run.text)` 의 분기 없는 정합한 룰

미진한 영역 (향후 분할 정복)

작업지시자 평가에서 "아직 미진한 점이 있지만" 명시 — 본 사이클 외 후속 task 로 분할 정복 진행 예정. Task #528 → Task #555 → 향후 task 의 단계적 정정 패턴 정합.

이슈 #555 close

본 PR closes #555 명시 + 정정 적용으로 자동 close 처리 (수동 close 도 진행).

base 차이 영역 (메인테이너 작업)

본 PR base (`b84c5e9`) 와 본 환경 devel (`d1dbd85`) 사이에 메인테이너의 PR #553 rollback 처리 (1 commit) 가 있어 fork 가 미동기화 상태였으나, 컨트리뷰터의 잘못 아닌 메인테이너 작업으로 인한 차이 — cherry-pick 으로 정합하게 처리되었습니다.

처리 보고서: `mydocs/pr/archives/pr_562_report.md`

다음 PR 도 본 사이클 패턴 (별도 fork branch + 새 PR + 광범위 회귀 sweep) 으로 부탁드립니다. 매우 모범 사례입니다.

@edwardkim edwardkim closed this May 4, 2026
edwardkim added a commit that referenced this pull request May 4, 2026
- mydocs/pr/pr_562_report.md → archives/

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
edwardkim added a commit that referenced this pull request May 4, 2026
cherry-pick:
- 773ac95 (391dd6d): fix: 수식 위첨자 baseline 배치 개선 — 분수/괄호 base (#532)

본질:
- src/renderer/equation/layout.rs +44/-7 (단일 파일)
- sup_shift 부호 기반 분기 정합:
  · 양수 (일반): sup 상단, base 하단
  · 음수 (tall sup, 분수형): sup 상단, base 를 |sup_shift| 만큼 하단으로
- 위첨자가 항상 base 위에 위치 (수학 조판 규칙)

검증:
- cargo test --lib 1124 passed (신규 test_superscript_fraction_baseline GREEN)
- cargo test --test issue_505/530/546/418/501 회귀 0
- cargo test --test svg_snapshot 6/6 passed
- cargo clippy --lib 0 건
- WASM 4,588,360 bytes (+2,362 from PR #562) + studio 동기화

작업지시자 시각 판정:
- "svg 와 웹 에디터 모두에서 지수 처리가 개선되었음을 메인테이너가 확인"

작성자: @oksure (Hyunwoo Park) — 두 번째 PR

closes #532

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@edwardkim edwardkim mentioned this pull request May 4, 2026
4 tasks
edwardkim added a commit that referenced this pull request May 5, 2026
- 처리 보고서 추가: 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 후보.
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