Skip to content

fix: 문자 컨트롤 0x18/0x1E 매핑 swap (하이픈 ↔ 묶음 빈칸)#587

Closed
planet6897 wants to merge 1 commit into
edwardkim:develfrom
planet6897:pr-task-ctrl-char-swap
Closed

fix: 문자 컨트롤 0x18/0x1E 매핑 swap (하이픈 ↔ 묶음 빈칸)#587
planet6897 wants to merge 1 commit into
edwardkim:develfrom
planet6897:pr-task-ctrl-char-swap

Conversation

@planet6897

Copy link
Copy Markdown
Contributor

요약

HWP 5.0 스펙 표 7 (문자 컨트롤) 과 반대로 매핑되어 있던 두 코드를 정정합니다.

코드 스펙 (표 7) 수정 전 수정 후
0x18 하이픈 U+00A0 (nbsp) - (hyphen)
0x1E 묶음 빈칸 - (hyphen) U+00A0 (nbsp)

자체 테스트 (src/parser/body_text/tests.rs:117,120) 의 주석은 이미 정답을 가리키고 있었습니다 — 구현만 swap 되어 있던 상태입니다.

증상

samples/exam_eng.hwp, samples/exam_kor.hwp 등 시험지 문서에서 문제 번호 다음에 하이픈이 잘못 표시되었습니다. 한컴 PDF (samples/exam_eng.pdf 등) 와 비교 시 확인 가능합니다.

수정 전: "1.- 다음을 듣고, 여자가 하는 말의 목적으로 가장 적절한 것을 고르시오."
수정 후: "1.\u{a0} 다음을 듣고, 여자가 하는 말의 목적으로 가장 적절한 것을 고르시오."

rhwp dump samples/exam_eng.hwp -s 0 -p 2 로 확인.

회귀 검증

export-svg 결과의 >-</text> 글리프 출현 횟수 비교:

샘플 수정 전 수정 후 제거된 잘못된 '-'
exam_eng 366 39 327
exam_kor 444 33 411
exam_science 37 18 19
exam_math 42 42 0
exam_social 2 2 0

수정 후 남은 - 글리프는 영어 단어 내 실제 하이픈, 표 구분자 등 정상 케이스입니다. exam_math / exam_social 은 해당 코드를 미사용하는 문서라 변화 없음.

변경 파일

  • src/parser/body_text.rs:328-348 — 0x18 ↔ 0x1E 매핑 swap (parse_para_text)
  • src/parser/tags.rs:128-131CHAR_HYPHEN / CHAR_NBSPACE 상수 swap (외부 참조 없음)

테스트 계획

  • cargo test --release --lib 1125 passed
  • cargo test --release --lib parser::body_text 22 passed
  • rhwp dump samples/exam_eng.hwp -s 0 -p 2 결과 확인
  • exam_eng / exam_kor / exam_math / exam_science / exam_social SVG 회귀 비교

🤖 Generated with Claude Code

HWP 5.0 스펙 표 7 (문자 컨트롤) 과 반대로 매핑되어 있던 두 코드를 정정:

| 코드   | 스펙 (표 7) | 수정 전          | 수정 후          |
|--------|-------------|------------------|------------------|
| 0x18   | 하이픈      | U+00A0 (nbsp)    | '-' (hyphen)     |
| 0x1E   | 묶음 빈칸   | '-' (hyphen)     | U+00A0 (nbsp)    |

자체 테스트 (src/parser/body_text/tests.rs:117,120) 의 주석은 이미 정답을
가리키고 있었음 — 구현만 swap 되어 있었다.

증상: exam_eng.hwp / exam_kor.hwp 등 시험지 문서에서 문제 번호("1.", "①" 등)
다음의 묶음 빈칸이 하이픈으로 잘못 표시됨. 한컴 PDF 와 비교하여 확인.

회귀 검증 (export-svg `>-</text>` 글리프 출현 횟수):
- exam_eng:    366 → 39  (-327)
- exam_kor:    444 → 33  (-411)
- exam_science: 37 → 18  (-19)
- exam_math/exam_social: 변화 없음 (해당 코드 미사용)

남은 '-' 글리프는 영어 단어 내 실제 하이픈 등 정상 케이스.

src/parser/tags.rs 의 CHAR_HYPHEN / CHAR_NBSPACE 상수도 같이 swap.

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

Copy link
Copy Markdown
Owner

본 PR 의 단일 commit 1cbf7c8 을 본 환경 devel 에 cherry-pick 으로 통합했습니다 (5d52d1d merge commit).

통합 결과

2 file (+10/-10) — 충돌 0.

본질 평가

HWP 5.0 스펙 표 7 정합 + 자체 테스트 주석 (src/parser/body_text/tests.rs:117,120) 이 이미 정답을 가리키고 구현만 swap 되어 있던 결함. 외부 참조 0건이라 상수 swap 영향 0.

결정적 검증

게이트 결과
cargo test --lib --release ✅ 1129 passed (회귀 0)
cargo test ... parser::body_text ✅ 22 passed
cargo test --test svg_snapshot ✅ 6/6
cargo clippy --lib --release ✅ 0 warnings
CI ✅ All SUCCESS

시각 회귀 측정 — 100% 재현

>-</text> 글리프 출현 횟수 (PR 본문 표 와 모두 일치):

샘플 Before After 제거
exam_eng 366 39 327
exam_kor 444 33 411
exam_science 37 18 19
exam_math 42 42 0
exam_social 2 2 0

757 개의 잘못된 하이픈 제거.

시각 판정 ★ 통과

WASM 빌드 (4,582,545 bytes) + studio sync 후 SVG 와 웹 에디터 양쪽에서 메인테이너가 직접 확인했습니다. exam_eng/exam_kor 의 "1." 문제 번호 다음의 잘못된 하이픈이 묶음 빈칸으로 정합 회복되었습니다.

본 PR 은 cherry-pick 통합 완료로 close 합니다.

@edwardkim edwardkim closed this May 4, 2026
edwardkim added a commit that referenced this pull request May 4, 2026
본 환경의 rhwp.js 가 이미 tracked 상태인 것과 일관성 정합 — WASM
빌드 산출물 sync 시 .d.ts 도 함께 tracked. PR #587 처리 사이클의
WASM 빌드 sync 중 누락 발견.
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 후보.
edwardkim added a commit that referenced this pull request May 5, 2026
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 (영문).
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