fix: CASES+EQALIGN 중첩 토폴로지 분수 분실 정정 (#505 / #175 후속)#507
Conversation
본질: 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
1eb367d to
12037a4
Compare
|
검토 감사합니다. 코드 변경(헬퍼 추출 + DRY)과 회귀 테스트 9건은 정합하게 작성되어 있습니다. cargo test 게이트는 인라인 fixture 기반이라 별도 환경 의존 없이 통과 가능합니다. 다만 본 PR의 본질이 시각 결함 정정 ( 시각 판정 절차의 배경본 프로젝트는 한컴 버전별로 동일 샘플의 렌더링 정답이 일치하지 않는 사례 (이슈 #345 등) 가 누적되면서, 외부 환경의 한컴/한글뷰어/PDF 출력을 정답지로 수용하지 않고 메인테이너가 한컴 2010 + 한컴 2020 으로 직접 시각 판정 하는 방식으로 전환된 상태입니다. 따라서 컨트리뷰터의 before/after 스크린샷만으로는 시각 결함 정정 게이트를 통과시킬 수 없습니다. 수정 요청
추가 후 본 PR 에 force-push 또는 추가 commit 으로 반영해주시면, 시각 판정 후 cherry-pick 머지 절차로 진행하겠습니다. 검토 문서: |
- 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>
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 의 후속 요청 사항)
bb5f6b3 to
12037a4
Compare
원본 미적분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 응답.
|
저작권 이슈로 원본 추가 파일 (commit
|
| 페이지 | 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 시각 판정 결과 피드백 부탁드립니다.
원본 미적분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 응답.
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>
…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 통과
|
@cskwork 님의 PR을 cherry-pick 머지로 devel 에 반영했습니다 (devel 주말에도 귀중한 시간을 들여 메인테이너가 요청한 시각 판정 샘플을 별도로 직접 만들어 세심하게 다시 작업해서 보내주신 것에 대해 깊이 감사드립니다. 저작권을 회피하면서 baseline 메타데이터를 보존하는 fixture 작성 방식 ( 머지된 commits (cherry-pick)
author 는 @cskwork 으로 보존되었습니다. 검증
시각 판정 (한컴 2010/2020)
처리 보고서: 이슈 #505 도 함께 close 합니다. README 기여자 목록은 본 사이클 일괄 갱신 시점에 반영하겠습니다. |
요약
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:202의parse_command가 OVER/ATOP 단독 호출 시EqNode::Empty로 폐기하나, OVER/ATOP 의 중위 연산자 처리는parse_expression/parse_group에만 존재.parse_cases/parse_pile/parse_eqalign은parse_element직접 호출하므로 OVER 분실 → 분수 인식 실패.정정
src/renderer/equation/parser.rstry_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.rsskip_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 건너뜀검증
12r²squashing(1/2) x²정상회귀
cargo test --lib— 1102 통과cargo test --test issue_505— 4 신규 통과cargo test --test issue_418/501— 회귀 0test_cases_korean_no_overlap,test_korean_text_width_not_italic) 통과비-목표 (별도 이슈 후보)
parse_fraction_until_rbrace사전 존재 평행 경로 통합 (code-review 지적, 본 정정 외)산출물
mydocs/plans/task_m100_505.mdmydocs/plans/task_m100_505_impl.mdmydocs/working/task_m100_505_stage{1-4}.mdmydocs/report/task_m100_505_report.mdmydocs/tech/all_in_one_parser_fidelity_strategy.mdTest plan