수식 ATOP 파싱 및 렌더링 보정#397
Conversation
c8ea466 to
d212857
Compare
|
PR 검토 결과 안내드립니다. 코드 자체는 ATOP 의 의미 (분수선 없이 위/아래 배치) 를 정확히 분리한 합리적인 정정입니다 — Fraction / Atop 의 LayoutKind 분리 + 파서/레이아웃/렌더 일관성 모두 양호합니다. 본 검토에서 dry-run merge 도 자동 성공했고 cargo test --lib 1033 passed 검증도 통과했습니다. 다만 본 저장소의 PR 처리 절차상 다음 항목이 추가로 필요합니다. 첫 PR 이시라 향후 지속적인 기여를 위해 절차 안내드리니 양해 부탁드립니다. 1. devel 기반 rebase 필요현재 PR 의 base 가 `94d9347` 입니다. 그 이후 devel 에 PR #395 (그림 밝기/대비) + PR #396 (수식 렌더링 — TAC 높이 + 한글 이탤릭) 이 머지되어 BEHIND 상태입니다. 특히 PR #396 이 본 PR 과 같은 파일 (`equation/{layout,svg_render,canvas_render}.rs`) 을 변경했으니, devel 위로 rebase 후 충돌 확인 + 재제출 부탁드립니다: ```bash 충돌 발생 시 해결 후git push --force-with-lease origin fix/atop-equation-parser 2. 시각 검증 자료 첨부 요청본 저장소의 PR 처리 정책상 외부 컨트리뷰터 PR 은 한컴 출력 (정답지) 과 rhwp 출력의 시각 비교 를 PR 본문 또는 댓글에 첨부해야 머지 가능합니다. ATOP 수식이 포함된 hwp 샘플 (예: 한컴 편집기에서 `a atop b` 수식 입력 후 저장) 로 다음을 비교:
두 출력의 분수선 유무 / 텍스트 위치 일치 여부 시각 비교 자료를 첨부해 주세요. 작성자 환경에 한컴 편집기가 없으면 알려주세요 — 메인테이너가 시각 판정 보조 가능합니다. 3. CI 실행 확인현재 PR 의 CI status 가 비어있습니다. rebase 후 push 시 CI 가 자동으로 실행될 것입니다. 머지 전 모든 check 가 SUCCESS 인지 확인 부탁드립니다. 4. clippy 정황PR 본문에 명시된 `clippy::uninlined_format_args` 716건 정황은 clippy 버전 차이로 추정됩니다. 본 저장소의 CI 환경 (Rust stable) 에서는 `cargo clippy --lib -- -D warnings` 가 통과합니다. rebase 후 CI 가 정상 실행되면 작성자 환경의 clippy 정황은 별도 처리 불필요합니다. 정리
본 PR 은 OPEN 유지합니다. 위 3가지 (rebase + 시각 자료 + CI 통과) 완료 후 알려주시면 다시 검토 후 머지 진행하겠습니다. 좋은 기여 감사합니다. |
139d539 to
a26a181
Compare
a26a181 to
8be4940
Compare
|
검토 감사합니다. 지시 항목을 처리하여 보고드립니다. 1. devel 기반 rebase 완료
2. 시각 검증 자료 (export-svg 풀 파이프라인)본 환경에 한컴 정품 편집기 (HWP 2010/2022) 가 없어 한컴 정답지 첨부는 메인테이너 보조 옵션을 부탁드립니다. 대신 본 저장소의 산출물은 cskwork fork 의 결과 요약
2-1. ATOP —
|
| 명령 | 결과 |
|---|---|
cargo test --lib |
1033 passed, 0 failed, 1 ignored |
cargo test renderer::equation |
52 passed |
cargo test test_atop_svg_has_no_fraction_line |
passed |
cargo test test_fraction_svg (회귀) |
passed |
rhwp export-svg (3 케이스) |
ATOP 0줄, OVER 1줄, GROUP 0줄 확인 |
정리
| 단계 | 상태 |
|---|---|
| devel 기반 rebase | 완료 (8be4940, PR #395 + #396 위) |
| 시각 검증 자료 | export-svg 풀 파이프라인 SVG 3종 첨부 (pr397-visuals 브랜치) |
| CI 실행 | "Approve and run" 승인 대기 |
| 로컬 테스트 | 1033 passed |
추가 검토 요청드립니다.
- PR #397 (수식 ATOP, @cskwork) 본 저장소 첫 외부 컨트리뷰터 PR cherry-pick 머지 완료 - 작성자 절차 안내 모두 대응 (rebase + 시각 자료 + CI 승인) - 메인테이너 GitHub Actions API 로 첫 외부 PR CI 승인 → SUCCESS - samples/atop-equation-01.hwp 작업지시자 추가 (ATOP / OVER / GROUP 시각 판정용) - 1044→1046 passed + svg_snapshot 6/6 + clippy 0 + WASM 빌드 + 작업지시자 시각 판정 통과 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
완료. `devel` 에 cherry-pick (작성자 attribution 보존) 으로 머지됨 (commit `76a97e9`). @cskwork 님은 본 저장소의 첫 번째 외부 컨트리뷰터 이십니다. 의미 있는 첫 기여를 환영하고, 깊이 감사드립니다. ATOP / OVER 의 의미를 정확히 분리한 정정 (`EqNode::Atop`, `LayoutKind::Atop`, `layout_atop()`) 도 합리적이었고, 1차 검토 후 절차 안내에 대해서도 모든 항목 (devel 기반 rebase, 시각 검증 자료, CI 정황) 을 정확하게 대응해 주셨습니다. 본 저장소의 처리 흐름을 빠르게 익혀주신 점이 양호합니다. 시각 판정 — 작업지시자 전용 샘플 추가작업지시자가 ATOP 회귀 검증을 위해 `samples/atop-equation-01.hwp` 전용 샘플을 본 저장소에 추가했습니다 (3 가지 케이스 포함):
작업지시자가 직접 확인하여 시각 판정 통과했습니다 — 정정 의도가 정확히 반영됐다는 의미입니다. 머지 commit작성자 attribution 보존:
검증
향후 PR 작성 안내향후 PR 의 CI 도 자동 실행될 것입니다 (첫 PR 의 "action_required" 정황은 GitHub 의 정책으로, 첫 머지 후 신뢰 컨트리뷰터로 인식됩니다). 저장소 자체 이슈로 발견하신 정황 외에도 외부 binding / RAG 작업에서 발견한 정황을 이슈로 자유롭게 등록해 주세요. 본 저장소의 정황은 `mydocs/manual/dev_environment_guide.md` 에 정리되어 있고, 단계별 절차는 `CLAUDE.md` 와 `CONTRIBUTING.md` 에 있습니다. 다시 한 번 첫 기여 감사드립니다. 앞으로 좋은 협업이 이어지기를 기대합니다. |
요약
a ATOP b를EqNode::Atop으로 파싱하도록 보정Atop레이아웃을Fraction과 분리해 분수선 없이 위/아래 항만 배치하도록 구현LayoutKind::Atop을 별도 처리하도록 추가배경
한컴 수식 문법에서
ATOP은OVER와 비슷하게 두 항을 위아래로 배치하지만,OVER와 달리 가운데 분수선을 그리지 않는다.예:
기대 렌더링은
a가 위,b가 아래에 배치되는 형태이며,a OVER b처럼 분수선이 들어가면 안 된다.현상
기존 코드에는 이미
EqNode::Atop { top, bottom }AST 타입이 있었지만 실제 파싱·레이아웃·렌더링 흐름이 완성되어 있지 않았다.그 결과
a ATOP b입력 시:ATOP명령을 독립 명령으로 만나면 빈 노드로 처리a ATOP b를 위/아래 구조로 결합하지 못함EqNode::Atop이 만들어져도 레이아웃 단계에서Fraction레이아웃으로 대체되어 분수선이 생길 수 있음LayoutKind::Atop처리 분기가 없었음근본 원인
OVER는parse_expression()과 그룹 파싱 내부에서 중위 연산자로 처리되어 직전 요소를 분자, 직후 요소를 분모로 결합한다.반면
ATOP은 문법적으로 같은 중위 연산자 계열임에도 해당 처리 흐름에 포함되어 있지 않았다.또한 레이아웃 단계에서
EqNode::Atop을layout_fraction()으로 넘기고 있었기 때문에,Atop의 의미인 “분수선 없는 위/아래 배치”가 유지되지 않았다.해결책
1. ATOP 중위 연산자 파싱
src/renderer/equation/parser.rs에서OVER처리 경로에ATOP을 함께 포함했다.a OVER b→EqNode::Fraction { numer, denom }a ATOP b→EqNode::Atop { top, bottom }동일한 처리를 최상위 표현식과
{ ... }그룹 내부 파싱 양쪽에 적용했다.2. Atop 전용 레이아웃 추가
src/renderer/equation/layout.rs에LayoutKind::Atop과layout_atop()을 추가했다.layout_atop()은layout_fraction()과 유사하게 위/아래 항을 중앙 정렬하지만, 분수선 영역을 만들거나 렌더러에 선을 요구하지 않는다.핵심 차이:
Fraction: 위/아래 항 + 분수선Atop: 위/아래 항만 배치, 분수선 없음3. SVG/Canvas 렌더링 분기 추가
src/renderer/equation/svg_render.rs와src/renderer/equation/canvas_render.rs에LayoutKind::Atop분기를 추가했다.렌더러는 이미 계산된
top,bottom위치에 각각 텍스트/수식 박스를 렌더링하며, 별도의<line>또는 Canvas line stroke를 만들지 않는다.검증
신규 회귀 테스트
src/renderer/equation/parser.rs:test_atopa atop b가EqNode::Atop으로 파싱되는지 확인a, 아래 항이b로 보존되는지 확인src/renderer/equation/svg_render.rs:test_atop_svg_has_no_fraction_linea atop bSVG에<text>가 출력되는지 확인<line>이 없어 분수선이 그려지지 않는지 확인기존 회귀 확인:
test_fraction_svgOVER수식은 기존처럼 분수선을 유지하는지 확인테스트 실행 결과
cargo test renderer::equation::parser::tests::test_atop통과cargo test renderer::equation::svg_render::tests::test_atop_svg_has_no_fraction_line통과cargo test renderer::equation::svg_render::tests::test_fraction_svg통과cargo test통과git diff --check통과cargo clippy -- -D warnings는 기존 코드의clippy::uninlined_format_args716건으로 실패cargo clippy -- -D warnings -A clippy::uninlined_format_args통과의도된 동작 변경
ATOP수식이 더 이상 빈 노드로 사라지거나 분수선 있는 분수처럼 렌더링되지 않는다.앞으로:
a OVER b는 분수선 있는 분수로 렌더링a ATOP b는 분수선 없는 위/아래 배치로 렌더링이는 한컴 수식 문법의 의미에 맞는 동작 변경이다.
변경 파일
src/renderer/equation/parser.rsATOP을OVER와 같은 중위 연산자 흐름으로 파싱,EqNode::Atop생성, 파서 테스트 추가src/renderer/equation/layout.rsLayoutKind::Atop추가, 분수선 없는layout_atop()구현src/renderer/equation/svg_render.rsLayoutKind::AtopSVG 렌더링 분기 추가, 분수선 없음 회귀 테스트 추가src/renderer/equation/canvas_render.rsLayoutKind::AtopCanvas 렌더링 분기 추가Test plan
cargo test renderer::equation::parser::tests::test_atopcargo test renderer::equation::svg_render::tests::test_atop_svg_has_no_fraction_linecargo test renderer::equation::svg_render::tests::test_fraction_svgcargo testgit diff --checkcargo clippy -- -D warnings -A clippy::uninlined_format_args메타
develcskwork:fix/atop-equation-parserd212857—fix: 수식 ATOP 파싱 및 렌더링 보정