Skip to content

fix: CASES+EQALIGN 중첩 토폴로지 분수 분실 정정 (#505 / #175 후속)#507

Closed
cskwork wants to merge 3 commits into
edwardkim:develfrom
cskwork:feature/issue-505-cases-eqalign-fraction
Closed

fix: CASES+EQALIGN 중첩 토폴로지 분수 분실 정정 (#505 / #175 후속)#507
cskwork wants to merge 3 commits into
edwardkim:develfrom
cskwork:feature/issue-505-cases-eqalign-fraction

Conversation

@cskwork

@cskwork cskwork commented May 1, 2026

Copy link
Copy Markdown
Contributor

요약

PR #396 (#175/#174 정정) 이 다루지 못한 CASES+EQALIGN 중첩 토폴로지의 분수 분실 결함을 정정. all-in-one-parser fixture 의 미적분03.hwp p5 에서 g(x)= {cases{{1} over {2} x ^{2} ...}} 가 시각적으로 squashed (12r² 처럼) 출력되던 결함 해소.

closes #505

본질

src/renderer/equation/parser.rs:202parse_command 가 OVER/ATOP 단독 호출 시 EqNode::Empty 로 폐기하나, OVER/ATOP 의 중위 연산자 처리는 parse_expression/parse_group 에만 존재. parse_cases / parse_pile / parse_eqalignparse_element 직접 호출하므로 OVER 분실 → 분수 인식 실패.

정정

src/renderer/equation/parser.rs

  • try_consume_infix_over_atop() 헬퍼 추출 — 5개 호출지점(parse_expression/parse_group/parse_cases/parse_pile/parse_eqalign × 2)에서 통합. 22줄 × 2 인라인 블록 → 헬퍼 호출로 DRY (-39 / +50 net change).

src/renderer/equation/tokenizer.rs

  • skip_spaces\n, \r 추가. HWP 수식 스크립트는 #/& 으로 명시적 행/탭 구분하므로 실제 개행 문자는 의미 없는 포맷팅으로 간주.

tests/issue_505.rs (신규)

영구 회귀 테스트 4건:

  • issue_505_cases_eqalign_height_ratio — 4 fixture scale_y 가 [1/1.30 .. 1.30] 범위
  • issue_505_pi165_fraction_recognized — pi=165 의 height 가 pi=151 보다 ≥20% 큼 (분수 추가분 인식)
  • issue_505_no_internal_overlap — CASES 인접 행 쌍 y-overlap 없음
  • issue_505_eqalign_no_leading_newline_text — tokenizer skip_spaces 가 \n 건너뜀

검증

메트릭 BEFORE AFTER
pi=165 SVG y-scale 1.64 1.08
pi=165 layout height 40.49 px (분수 분실) 61.47 px
페이지 5 35 수식 중 극단 scale 1건 0건
시각 결함 12r² squashing (1/2) x² 정상

회귀

  • cargo test --lib — 1102 통과
  • cargo test --test issue_505 — 4 신규 통과
  • cargo test --test issue_418/501 — 회귀 0
  • ✓ PR fix: 수식 렌더링 개선 — TAC 높이 반영 + 한글 이탤릭 제거 (#174, #175) #396 회귀 테스트 (test_cases_korean_no_overlap, test_korean_text_width_not_italic) 통과
  • ✓ clippy 본 변경 영역 0건
  • 27 fixtures × 344 pages 일괄 회귀 점검 — panic 0, 새 극단값 도입 0
  • 동일 3 fixture 비교: 극단 그룹 4 → 3 (1.637 제거)

비-목표 (별도 이슈 후보)

  • 한컴 PDF baseline 비교 (Hancom COM 자동화 RPC 차단)
  • 인라인 CASES baseline 정렬 (페이지 6/7) — Phase A baseline 후
  • LONGDIV 미구현 (P3 백로그)
  • parse_fraction_until_rbrace 사전 존재 평행 경로 통합 (code-review 지적, 본 정정 외)

산출물

  • 수행 계획서: mydocs/plans/task_m100_505.md
  • 구현 계획서: mydocs/plans/task_m100_505_impl.md
  • 단계별 보고서: mydocs/working/task_m100_505_stage{1-4}.md
  • 최종 보고서: mydocs/report/task_m100_505_report.md
  • 1:1 정합화 전략: mydocs/tech/all_in_one_parser_fidelity_strategy.md

Test plan

본질: parse_command 의 OVER/ATOP 폐기로 parse_cases / parse_pile /
parse_eqalign / parse_matrix 의 row-collecting 루프에서 분수가 분실됨.
PR edwardkim#396 (edwardkim#175 후속) 회귀 테스트가 다루지 못한 토폴로지.

발견 경로: all-in-one-parser fixture 1:1 정합화 전략의 A' 진단 →
미적분03.hwp p5 의 g(x)= {cases{{1} over {2} x ^{2} ...}} 가
시각적으로 squashed 되어 출력 (12r² 처럼 보임). 사후 점검에서 동일
결함 클래스가 parse_matrix 에도 잠재함을 확인 (matrix{a over b}
가 fraction 으로 인식되지 않음 — 진단 테스트로 검증).

정정:
- try_consume_infix_over_atop() 헬퍼 추출 (parser.rs)
- 6개 호출지점 통합 (parse_expression / parse_group / parse_cases
  / parse_pile / parse_eqalign × 2 / parse_matrix). 22줄 × 2 인라인
  블록 → 헬퍼 호출로 DRY
- tokenizer.skip_spaces 에 \n, \r 추가 (수식 스크립트 내 의미
  없는 줄바꿈 무시)
- 신규 회귀 테스트 9건 (tests/issue_505.rs):
  · CASES+EQALIGN 픽스처 4 (height ratio / fraction recognition /
    overlap / newline)
  · matrix bare OVER/ATOP
  · pile bare OVER/ATOP
  · cases bare ATOP
  · 좌결합 다중 OVER 체인 (5 row-collecting 경로 모두)
  · orphan OVER (top/bottom 없음) panic 안전성

검증:
- 미적분03.hwp p5 pi=165 SVG y-scale 1.64 → 1.08 (수락 기준
  ≤ 1.20 충족)
- 27 fixtures × 344 pages 일괄 출력: panic 0, 새 극단값 도입 0
- 동일 3 fixture 비교: 극단 그룹 4 → 3 (1.637 제거 ★)
- cargo test --lib 1102 통과
- cargo test --test issue_505 9 신규 통과
- cargo test --test issue_418/501 회귀 0
- PR edwardkim#396 회귀 0 (test_cases_korean_no_overlap 통과)
- clippy 본 변경 영역 0건

비-목표 (별도 이슈):
- 한컴 PDF baseline 비교 (Hancom COM 자동화 RPC 차단)
- 인라인 CASES baseline 정렬 (페이지 6/7) — Phase A baseline 후
- LONGDIV 미구현 (P3 백로그)
- svg_snapshot 5/6 사전 CRLF/LF 회귀 (main 동일)
- parse_fraction / parse_fraction_in_range / parse_fraction_until_rbrace
  3개 dead code 헬퍼 정리 (call site 0건)

산출물:
- mydocs/plans/task_m100_505{,_impl}.md (계획서)
- mydocs/working/task_m100_505_stage{1-4}.md (단계별 보고서)
- mydocs/report/task_m100_505_report.md (최종 보고서)
- mydocs/tech/all_in_one_parser_fidelity_strategy.md (전략)

closes edwardkim#505
@cskwork cskwork force-pushed the feature/issue-505-cases-eqalign-fraction branch from 1eb367d to 12037a4 Compare May 1, 2026 04:34
@cskwork

cskwork commented May 1, 2026

Copy link
Copy Markdown
Contributor Author

Self-review 결과 동일 결함 클래스가 parse_matrix 에도 잠재함을 확인하여 amend (force-pushed: 1eb367d12037a4). 정정 범위 CASES+EQALIGN+MATRIX, 회귀 테스트 4건 → 9건 (matrix bare/braced OVER+ATOP, pile bare OVER+ATOP, cases bare ATOP, chained OVER 좌결합 5경로, orphan OVER 안전성 추가). cargo test --lib 1102 회귀 0.

@edwardkim edwardkim added this to the v1.0.0 milestone May 1, 2026
@edwardkim edwardkim added the bug Something isn't working label May 1, 2026
@edwardkim

Copy link
Copy Markdown
Owner

검토 감사합니다. 코드 변경(헬퍼 추출 + DRY)과 회귀 테스트 9건은 정합하게 작성되어 있습니다. cargo test 게이트는 인라인 fixture 기반이라 별도 환경 의존 없이 통과 가능합니다.

다만 본 PR의 본질이 시각 결함 정정 (12r² squashing → (1/2) x²) 이므로, 메인테이너의 시각 판정 게이트를 통과해야 머지가 가능합니다.

시각 판정 절차의 배경

본 프로젝트는 한컴 버전별로 동일 샘플의 렌더링 정답이 일치하지 않는 사례 (이슈 #345 등) 가 누적되면서, 외부 환경의 한컴/한글뷰어/PDF 출력을 정답지로 수용하지 않고 메인테이너가 한컴 2010 + 한컴 2020 으로 직접 시각 판정 하는 방식으로 전환된 상태입니다. 따라서 컨트리뷰터의 before/after 스크린샷만으로는 시각 결함 정정 게이트를 통과시킬 수 없습니다.

수정 요청

samples/ 폴더에 본 PR 이 정정 대상으로 삼는 원본 파일을 추가해주십시오.

  • 파일: samples/미적분 기출문제_03.미분계수와 도함수1-1.hwp
  • 목적: 메인테이너가 rhwp export-svg samples/미적분*.hwp -p 4 등으로 p5 를 직접 재출력하고 한컴 2010/2020 출력과 비교하여 시각 판정
  • 라이선스 절차는 불필요합니다 (단순 파일 추가)

추가 후 본 PR 에 force-push 또는 추가 commit 으로 반영해주시면, 시각 판정 후 cherry-pick 머지 절차로 진행하겠습니다.

검토 문서: mydocs/pr/pr_507_review.md

edwardkim added a commit that referenced this pull request May 1, 2026
- PR #510 (postmelee, Task #508 PageLayerTree image brightness/contrast)
  머지 완료 (cherry-pick 548df60). 검토 + 구현 계획서 + 처리 보고서 작성.
  before/after SVG byte-identical 380,804 bytes 결정적 검증 + 작업지시자 시각 판정 승인.
- PR #507 (cskwork, CASES+EQALIGN 분수 분실) 검토 문서 작성.
  수정 요청 — 시각 판정 게이트 미충족 (samples/미적분03.hwp 부재).
- mydocs/orders/20260502.md 외부 PR 처리 섹션 추가.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
edwardkim added a commit that referenced this pull request May 1, 2026
… brightness/contrast) + PR #507 검토 + 메모리 동기화

- PR #510 (postmelee, alhangeul-macos downstream) Task #508 cherry-pick
- PR #507 (cskwork, CASES+EQALIGN 분수 분실) 검토 → 수정 요청
- mydocs/manual/memory 활성↔백업 동기화

closes #508
cskwork added a commit to cskwork/rhwp that referenced this pull request May 1, 2026
PR edwardkim#507 검토에서 메인테이너가 시각 결함 정정 게이트 통과를 위해
요청한 원본 .hwp 파일을 samples/ 에 추가.

- 파일: samples/미적분 기출문제_03.미분계수와 도함수1-1.hwp (170 KB)
- 목적: rhwp export-svg samples/미적분*.hwp -p 4 로 p5 직접 재출력
        → 한컴 2010 + 2020 환경 직접 시각 판정 (12r² → (1/2) x²)
- 자체 검증: 14페이지 로드 정상, p5 SVG 143 KB 출력, panic 0
- 라이선스 절차 불필요 (단순 fixture 추가)

근거: mydocs/pr/pr_507_review.md §4.5 (수정 요청 항목)
관련: closes edwardkim#505 (PR edwardkim#507 본 PR 의 후속 요청 사항)
@cskwork cskwork marked this pull request as draft May 1, 2026 21:18
@cskwork cskwork force-pushed the feature/issue-505-cases-eqalign-fraction branch from bb5f6b3 to 12037a4 Compare May 1, 2026 21:20
원본 미적분03.hwp 저작권 이슈로 직접 작성한 fixture 패키지.
tests/issue_505.rs FIXTURES (pi=151/165/196/227) 4 개 CASES+EQALIGN
중첩 수식을 samples/equation-lim.hwp 베이스에 4 paragraph 로 복제.

- examples/build_issue_505_fixture.rs: 재현 가능한 빌더
  베이스 paragraph clone -> Equation script 만 fixture 로 교체
  -> serialize_hwp -> round-trip parse 검증 (4/4 script 일치)

- samples/issue-505-equations.hwp: 12,800 bytes, 1 섹션 / 4 문단 / 4 수식
  rhwp export-svg -> 4 페이지 SVG 정상 산출

cargo test --test issue_505 9/9 통과 (회귀 0).

메인테이너 시각 판정 게이트(한컴 2010/2020)용. PR edwardkim#507 커뮤니케이션 #issuecomment-4361332588 응답.
@cskwork cskwork marked this pull request as ready for review May 1, 2026 21:38
@cskwork

cskwork commented May 1, 2026

Copy link
Copy Markdown
Contributor Author

저작권 이슈로 원본 미적분 기출문제_03.미분계수와 도함수1-1.hwp 그대로 추가는 어렵다고 판단하여, tests/issue_505.rs 의 회귀 fixture 4 건을 직접 작성한 HWP 패키지로 대응했습니다.

추가 파일 (commit 4b1feea)

  • samples/issue-505-equations.hwp — 1 섹션 / 4 문단 / 4 수식 (12,800 bytes)
  • examples/build_issue_505_fixture.rs — 재현 가능한 빌더

베이스 samples/equation-lim.hwp 의 단일 paragraph 를 4 회 clone 하여 각 Equation.script 만 fixture (pi=151/165/196/227) 로 교체. Section.raw_stream = None + Equation.raw_ctrl_data = Vec::new() 로 재직렬화 유도. 메타데이터(char_count, char_shapes, line_segs, para_shape_id 등) 는 베이스 그대로 보존되어 한컴 호환성 위험 최소.

시각 판정 절차

cargo build --release --bin rhwp
./target/release/rhwp export-svg samples/issue-505-equations.hwp -o output/svg/issue-505/
페이지 fixture 비고
1 pi=151 CASES+EQALIGN, 분수 없음 (대조군)
2 pi=165 본 이슈 핵심{1} over {2} x ^{2}
3 pi=196 CASES+EQALIGN, x^3 -ax+bx
4 pi=227 CASES+EQALIGN, x^3 +ax+b

검증

항목 결과
round-trip parse (4 fixture script) 4/4 일치
rhwp export-svg 풀 파이프라인 4 페이지 SVG 정상 산출
cargo test --test issue_505 9/9 통과 (회귀 0)
cargo test --lib 1102 통과

draft → ready for review 전환했습니다. 한컴 2010/2020 시각 판정 결과 피드백 부탁드립니다.

edwardkim pushed a commit that referenced this pull request May 3, 2026
원본 미적분03.hwp 저작권 이슈로 직접 작성한 fixture 패키지.
tests/issue_505.rs FIXTURES (pi=151/165/196/227) 4 개 CASES+EQALIGN
중첩 수식을 samples/equation-lim.hwp 베이스에 4 paragraph 로 복제.

- examples/build_issue_505_fixture.rs: 재현 가능한 빌더
  베이스 paragraph clone -> Equation script 만 fixture 로 교체
  -> serialize_hwp -> round-trip parse 검증 (4/4 script 일치)

- samples/issue-505-equations.hwp: 12,800 bytes, 1 섹션 / 4 문단 / 4 수식
  rhwp export-svg -> 4 페이지 SVG 정상 산출

cargo test --test issue_505 9/9 통과 (회귀 0).

메인테이너 시각 판정 게이트(한컴 2010/2020)용. PR #507 커뮤니케이션 #issuecomment-4361332588 응답.
edwardkim added a commit that referenced this pull request May 3, 2026
cherry-pick:
- 7bcbe2c (12037a4): Task #505 CASES+EQALIGN+MATRIX 분수 분실 정정
- 1f65919 (4b1feea): Task #505 시각 판정용 fixture HWP 추가

검증:
- cargo test --lib 1110 passed
- cargo test --test issue_505 9/9
- cargo test --test issue_418/501 회귀 0
- cargo test --test svg_snapshot 6/6
- cargo clippy --lib / --test issue_505 0 건
- cargo build --release 정상
- WASM 빌드 4,461,235 bytes + studio 동기화

시각 판정 (작업지시자 한컴 2010/2020 직접 판정):
- 1차 (SVG export-svg) 4/4 통과
- 2차 (rhwp-studio web Canvas) 4/4 통과

산출물:
- mydocs/pr/pr_507_review.md (재검토 갱신, fixture 추가 반영)
- mydocs/pr/pr_507_review_impl.md (cherry-pick 절차)
- mydocs/pr/pr_507_report.md (처리 결과)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
edwardkim added a commit that referenced this pull request May 3, 2026
…X 분수 분실 정정 — cherry-pick @cskwork 2 commits) — closes #505

본 PR 은 외부 컨트리뷰터 @cskwork (Agentic-Worker) 의 첫 PR.
PR #396 (Task #175) 이 다루지 못한 CASES+EQALIGN+MATRIX 중첩 토폴로지의
분수 분실 결함 정정.

cherry-pick:
- 7bcbe2c (12037a4): Task #505 CASES+EQALIGN+MATRIX 분수 분실 정정
  · try_consume_infix_over_atop() 헬퍼 추출 (DRY)
  · 6 호출지점 통합 (parse_expression / parse_group / parse_cases /
    parse_pile / parse_eqalign × 2 / parse_matrix)
  · tokenizer.skip_spaces 에 \n, \r 추가
  · tests/issue_505.rs 신규 (회귀 테스트 9건)
- 1f65919 (4b1feea): Task #505 시각 판정용 fixture HWP 추가
  · samples/issue-505-equations.hwp (4 fixture pi=151/165/196/227)
  · examples/build_issue_505_fixture.rs (재현 가능 빌더)

검증:
- cargo test --lib 1110 passed
- cargo test --test issue_505 9/9 통과
- cargo test --test issue_418/501 회귀 0
- cargo test --test svg_snapshot 6/6 통과
- cargo clippy --lib / --test issue_505 0 건
- WASM 빌드 4,461,235 bytes + rhwp-studio 동기화

시각 판정 (작업지시자 한컴 2010/2020 직접):
- 1차 SVG export-svg 4/4 통과
- 2차 rhwp-studio web Canvas 4/4 통과
@edwardkim

Copy link
Copy Markdown
Owner

@cskwork 님의 PR을 cherry-pick 머지로 devel 에 반영했습니다 (devel 6657bfc).

주말에도 귀중한 시간을 들여 메인테이너가 요청한 시각 판정 샘플을 별도로 직접 만들어 세심하게 다시 작업해서 보내주신 것에 대해 깊이 감사드립니다. 저작권을 회피하면서 baseline 메타데이터를 보존하는 fixture 작성 방식 (samples/issue-505-equations.hwp + examples/build_issue_505_fixture.rs) 도 정합한 접근이었습니다.

머지된 commits (cherry-pick)

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

검증

  • cargo test --lib 1110 passed
  • cargo test --test issue_505 9/9 통과
  • cargo test --test issue_418/501 회귀 0
  • cargo test --test svg_snapshot 6/6 통과
  • cargo clippy 0 건
  • WASM 빌드 + rhwp-studio 동기화 정합

시각 판정 (한컴 2010/2020)

  • 1차 SVG (export-svg) 4/4 통과
  • 2차 rhwp-studio web Canvas 4/4 통과

처리 보고서: mydocs/pr/pr_507_report.md

이슈 #505 도 함께 close 합니다. README 기여자 목록은 본 사이클 일괄 갱신 시점에 반영하겠습니다.

@edwardkim edwardkim closed this May 3, 2026
edwardkim added a commit that referenced this pull request May 3, 2026
- mydocs/pr/pr_507_{review,review_impl,report}.md → archives/
- mydocs/orders/20260503.md 신규 (PR #507 머지 + Task #535 폐기 기록)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants