Skip to content

HWPX 수식 스크립트 토큰 처리 — root/sqrt glued, rm+bar, prime glued (closes #1204)#1208

Merged
edwardkim merged 1 commit into
edwardkim:develfrom
planet6897:fix/1204-equation-tokens
Jun 1, 2026
Merged

HWPX 수식 스크립트 토큰 처리 — root/sqrt glued, rm+bar, prime glued (closes #1204)#1208
edwardkim merged 1 commit into
edwardkim:develfrom
planet6897:fix/1204-equation-tokens

Conversation

@planet6897

Copy link
Copy Markdown
Contributor

문제 (closes #1204)

samples/3-09월_교육_통합_2022.hwpx 20쪽 등에서 일부 수식이 렌더되지 않고 스크립트 토큰이 literal 텍스트로 leak (문15·24·25·26·30). 전체 수식 2207개 중 일부.

근본 원인 (실제 스크립트로 확정)

버그 내용 영향
A tokenizer glued-keyword 분리 목록에 root/sqrt 미포함 → root3 한 토큰 → "root3" leak (√3 이어야 함) 21 scripts
B parser.parse_single_or_group 가 symbol/function 외 명령을 Text 처리 → rm body 의 bar(overline) leak 28 scripts
C prime 이 글자에 붙으면(primeF) 미분리 → leak 소수

수정 (src/renderer/equation/)

모델/레이아웃/타 모듈 무변경.

검증

  • cargo test --release 전체 1897 passed, 0 failed (수식 회귀 테스트 4건 추가).
  • 20쪽 SVG leak: root3 7→0, bar 5→0, prime →0.
  • 한글 2022 PDF 20쪽 문24)·25) 의 √·overline 시각 정합.

예시 (수정 후)

  • root3 y → √3·y
  • rm bar {F prime F} → overline(F′F)
  • bar {F primeF} → F′F

@planet6897 planet6897 force-pushed the fix/1204-equation-tokens branch 3 times, most recently from 7ca8b60 to 51dca12 Compare June 1, 2026 05:26
여러 시험지 HWPX(3-09월/3-11월_*_2022)에서 일부 수식이 렌더 안 되고
스크립트 토큰이 literal 텍스트로 leak.

- A: root/sqrt + 관계연산자(GEQ/LEQ/GE/LE) 가 숫자에 붙음(`root3`,`GEQ5`) → digit-guard 분리.
- B: parser.parse_single_or_group 이 symbol/function 외 명령을 Text 처리해
     `rm` body 의 `bar` leak → parse_command 재귀 위임.
- C: prime 이 글자에 붙음(`primeF`) → alnum-guard 분리.
- D: DECORATIONS/FONT_STYLES lookup 대소문자 구분 → 대문자 명령(`RM`) 소문자 fallback
     + tokenizer 에 RM/IT/BOLD 추가.
- E: 키워드가 글자에 붙음(`tanx`,`barMH`,`LEQb`,`trianglePQR`,`rmbarFF`,`capB`)
     → glued run 에서 allowlist 키워드 최장 prefix 분리 (함수/장식/관계/도형/집합).
     over-split 가드: greek/root/arg 제외 (alphabet·rootn·argmax 유지, edwardkim#576).
- F: over/atop 가 짧은(≤2자) 글자 분모에 붙음(`overa^2`,`overdx`) → 분리(분수).
     긴 word(overlap)·keyword(overline/overset)는 유지 → edwardkim#1122 보존.

- 회귀 테스트 9건 (split 케이스 + over-split 가드)
- 검증: 09월(2207)+11월(1723) 전 스크립트 sweep leak 0, 양 파일 시각 정합
  (09월 문15-26·21쪽 / 11월 14쪽 ∩∪·19쪽 분수·21쪽 overline/△/∠), 전체 1902 통과

closes edwardkim#1204

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@planet6897 planet6897 force-pushed the fix/1204-equation-tokens branch from 51dca12 to b5742bc Compare June 1, 2026 05:55
@edwardkim edwardkim self-requested a review June 1, 2026 07:40
@edwardkim edwardkim added the enhancement New feature or request label Jun 1, 2026
@edwardkim edwardkim added this to the v1.0.0 milestone Jun 1, 2026
edwardkim added a commit that referenced this pull request Jun 1, 2026
작업지시자 지적 — cdotscdots(⋯⋯, 생략기호 연접)가 PR #1208 보정 후에도 leak.
PR 의 GLUE_SAFE allowlist 에 dots 계열 미포함이 원인(lookup_symbol 은 대소문자
무시라 cdots 단독은 이미 ⋯ 인식, 연접만 미분리).

- GLUE_SAFE 에 cdots/ldots/vdots/ddots 추가(5자 명시만, 모호 4자 dots 제외).
- test_dots_glued_split 추가.
- cdotscdots 14·18·19·20쪽 → 0, ⋯ 정상 렌더. test --tests 1907 passed.
- pr_1208_review.md / pr_1208_report.md / orders 갱신.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@edwardkim edwardkim merged commit 77c7c27 into edwardkim:devel Jun 1, 2026
7 checks passed
@edwardkim

Copy link
Copy Markdown
Owner

머지했습니다(devel 77c7c27c). 감사합니다.

20쪽 등의 수식 leak(root3/rm bar/primeF)이 정상 렌더로 전환됨을 실문서 23페이지 정량 비교로 확인했습니다(변화한 13페이지 모두 leak→정상, 오분리 회귀 0). GLUE_SAFE allowlist 로 분리 대상을 명시 제한하고 whole-keyword/longest-match 가드를 둔 설계가 견고했습니다.

두 가지 참고:

  1. 본문 범위: PR 설명은 A/B/C(root/bar/prime)만 다루었으나, 실제로는 longest_keyword_prefix(함수·도형·관계연산자 glued-split), over/atop 글자 분리, 대문자 글꼴 변형도 포함되어 있었습니다. 토크나이저 일반 동작을 바꾸는 변경이므로 향후 PR 본문에 범위를 함께 적어주시면 리뷰에 도움이 됩니다.
  2. cdots 후속 보정: cdotscdots(⋯⋯ 연접)가 GLUE_SAFE 에 dots 계열이 없어 남아있어, 메인테이너가 cdots/ldots/vdots/ddots 를 추가했습니다(5bfe3855).

전체 테스트 1907 passed.

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