fix: Task #321~#332 통합 정리 + vpos/cell padding 회귀 해소 (#342)#343
fix: Task #321~#332 통합 정리 + vpos/cell padding 회귀 해소 (#342)#343edwardkim merged 7 commits intoedwardkim:develfrom
Conversation
devel 기준으로 task321~task332 누적 작업을 정리. - Task edwardkim#321: 문단간 vpos-reset, body-wide TopAndBottom reserve, Paper 도형 가드, pi=0 block-table drift 보정, 문단 border 시각 병합/inset (v2~v6) - Task edwardkim#331: trailing line_spacing 누적 drift 시도 → revert - Task edwardkim#332: typeset advance 를 height_for_fit 기반으로 변경, layout per-paragraph advance 정합, vpos_end trail_ls 제외, vpos correction 양방향 + collapse 가드, typeset fit 검사 안전 마진, clamp pile 제거, vpos correction 가드 완화 소스 변경: - src/renderer/typeset.rs - src/renderer/layout.rs, layout/paragraph_layout.rs, layout/shape_layout.rs - src/document_core/commands/text_editing.rs 골든 SVG 갱신: issue-147, issue-157 계획서/보고서/트러블슈팅 문서 일괄 포함.
3건의 렌더링 회귀를 수정. 1) layout.rs: Task edwardkim#332 stage3a/3b revert - stage3a: vpos_end 의 trailing line_spacing 제외 → 다음 문단 시작이 trail_ls(716 HU=9.55px) 만큼 앞당겨져 줄간격 압축. HWP 가 명시한 다음 문단 vpos = prev.vpos + prev.lh + prev.ls 와 불일치. - stage3b: vpos correction 의 backward 가드를 line_height*3 으로 완화 하여 collapse 가드 무력화. 다음 문단이 이전 문단과 겹치는 회귀. - 두 변경을 핀포인트로 역적용 (stage4a/4b/5 는 다른 파일/위치라 영향 없음). - 증상: * exam_math.hwp p2 우측 pi=66 이 pi=64 와 같은 y 로 겹침 (160.43) * 21_언어 p1 좌측 pi=7→pi=8 줄간격 13.92px (정상 24.21px) 2) table_layout.rs: Task edwardkim#13 의 resolve_cell_padding aim 무시 revert - apply_inner_margin=false 일 때 셀 고유 패딩이 아니라 표 기본 패딩을 사용하도록 HWP 스펙에 맞게 복원. - height_measurer 는 aim 플래그를 존중하는데 layout 만 무시하여 측정/렌더 사이 padding 불일치 → 셀 visible height 보다 콘텐츠가 pad_top + pad_bottom 만큼 커짐. - 증상: 21_언어 p2 좌측 표 셀 마지막 줄 "해결하고자 한다" 가 cell-clip 밖으로 밀려 잘림. 검증: cargo test --lib 992 passed, 회귀 없음.
- issue-147 (aift-page3): 셀 height 가 cell.padding 미적용 (aim=false 로 spec 복원) 으로 실제 콘텐츠 크기에 맞춰 축소 - issue-157 (page-1): vpos correction 의 trailing line_spacing 복원으로 후속 셀 y 가 devel 방향으로 보정 (8px 만큼 stage3a-shift 회복) - issue-267 (ktx-toc-page): 표 셀 inner 영역이 aim=false 시 표 padding 을 따라 우측이 넓어짐 (TOC 점선 우측 끝까지 확장) 직전 4d74550 에서 갱신했어야 할 골든 누락분.
문단 border 가 적용된 본문이 두 컬럼 또는 두 페이지에 걸쳐 wrap 될 때, 각 컬럼/페이지 부분의 wrap 지점 inner edge (이전 컬럼에서 이어진 부분의 top, 다음 컬럼으로 이어지는 부분의 bottom) 를 그리지 않도록 수정. PDF 기준과 일치 — 좌·우 컬럼에 걸친 본문 박스가 시각적으로 이어지는 것처럼 보인다. 구현: - para_border_ranges 튜플에 is_partial_start, is_partial_end 플래그 추가. start_line > 0 → partial_start, end < composed.lines.len() → partial_end. - build_single_column 의 그룹 병합 시 첫 range 의 partial_start 와 마지막 range 의 partial_end 를 그룹 단위로 전파. - 두 플래그 모두 false 면 기존 단일 Rectangle 경로 유지 (회귀 없음). - 어느 쪽이라도 true 면 fill 만 Rectangle 로, stroke 는 면별 LineNode 4 개로 분해 후 skip_top / skip_bottom 적용. 검증 케이스: samples/21_언어_기출_편집가능본.hwp 1 페이지 - 좌측 컬럼 박스 (pi=7..pi=10 partial): top + left + right (bottom 없음) - 우측 컬럼 박스 (pi=10 partial..pi=12): left + right + bottom (top 없음) - 좌·우 수직선 4 개 모두 정상 렌더 회귀 검증: cargo test 전체 통과 (1000 lib + 6 svg_snapshot + 통합 14+25 등). 기존 비-wrap 케이스는 단일 Rectangle 경로를 그대로 사용해 골든 변동 없음.
|
@planet6897 님 — Task #321~#332 누적 정리 + 회귀 핀포인트 revert 작업 감사합니다. 큰 통합 PR 이라 머지 전에 몇 가지 확인을 부탁드립니다. 메인테이너 자체 검토 결과골든 SVG 변경 3건 분석:
확인 부탁 (4가지)Q1. KTX 목차 페이지번호 위치 변경 의도
|
|
메인테이너 검토에 정직하게 응답합니다. Q1. KTX 목차 페이지번호 +17.01px 우측 이동커밋 추적 결과: 변동은 해당 커밋 메시지가 명시적으로 변경 사유 기재:
근본 원인 — Task #279 vs Task #342 의 의미론 충돌:
Q1 답변:
해결 방향 (제안): aim=false 의 의미가 (a) 표 padding 으로 cell 외부 위치 정렬, (b) 셀 padding 으로 텍스트 좌·우 inset 적용, 같이 분리되어야 할 수 있음. Task #279 와 Task #342 의 양립 가능 케이스를 따져 PDF 비교 후 재결정 필요. Q2. issue-157 page-1 −9.6px shift마찬가지로 Q2 답변: PDF 비교 검증 없음. revert 에 따른 기계적 골든 갱신이며, 해당 stage 보고서에 시각 검증 결과 포함되지 않음. 한컴 PDF 와의 일치 방향인지 확인 필요. Q3. 추가 회귀 의심 영역 검증solid 답변: 진행하지 않았습니다.
본 PR 의 시각 검증은 작업지시자가 보고한 3 영역 (`exam_math p2 pi=66`, `21_언어 p1 좌측`, `21_언어 p2 좌측 셀`) 으로 한정되었고, 추가 회귀 가능 영역의 적극적 점검은 누락되었습니다. Q4. 통합 PR 검증 범위현 상태: 3 영역만 시각 확인. Task #342 의 본질이 cell padding 의미론 변경이라 광범위 회귀 가능성을 충분히 다루지 않은 결정. 제안 조치 (우선순위):
작업지시자 우선순위 결정 후 진행 예정. |
Q1 분석 결과 — 한컴 의도는 cell padding 적용 (right edge ≈ 700)데이터 근거KTX 목차 표 셀[10] (samples/KTX.hwp pi=12, 5×3 표의 r=4,c=0,cs=3 병합):
작성자가 의도적으로 R 만 비대칭 1417 HU 로 설정 — 페이지번호용 우측 여백 확보 목적이 명백. Task #279 검증 컨텍스트
Task #279 시점은 layout 이 cell.padding 을 항상 적용 (aim 무시) 하던 상태. inner_right = Task #342 의 부수효과
결론 — 한컴은 cell.padding 명시값을 우선작성자가 cell.padding R=1417 HU 를 비대칭 설정한 것 + Task #279 의 한컴 동등 검증 결과 → 한컴은 aim=false 에서도 명시된 cell.padding 을 적용 한다는 결론. Task #342 의 aim=false→table padding 엄격 해석은 부정확 — 한컴 호환성을 깨뜨림. 제안 수정 방향
fn resolve_cell_padding(cell, table) -> (L,R,T,B) {
// aim 플래그와 무관하게 cell.padding 의 명시값(0 아님) 우선,
// 0 이면 table.padding fallback. 한컴 동작 + height_measurer 일관성 확보.
let pad_left = if cell.padding.left != 0 { cell.padding.left } else { table.padding.left };
let pad_right = if cell.padding.right != 0 { cell.padding.right } else { table.padding.right };
// ... (top, bottom 동일)
}이로써:
영향 범위 확인 필요이 수정 시 영향받는 골든:
진행 승인 시 단계 수정 후 시각 검증 (KTX TOC, 21_언어 p2) 까지 보고 드립니다. |
Task edwardkim#342 의 aim=false→table padding 엄격 해석이 Task edwardkim#279 의 KTX 목차 페이지번호 우측 정렬 결과를 깨뜨렸다. 원인: KTX 목차 표 셀[10] 가 padding=(141,1417,141,141) 비대칭 + aim=false. 한컴은 aim 무관하게 cell.padding 명시값을 적용 (Task edwardkim#279 시각 검증 + toc_leader_right_tab_alignment.md 의 "한컴 의도 재해석" 원칙). 수정: - table_layout.rs::resolve_cell_padding — aim=false 분기 제거, cell.padding 명시값(0 아님) 우선 + table.padding fallback 단일 흐름 - height_measurer.rs (2곳) — 동일 정책으로 통일하여 layout 과 일관성 영향: - issue-267 ktx-toc-page 골든: page number x=707.77→690.76 복원 (Task edwardkim#279 결과 그대로). md5 가 Task edwardkim#279 시점(7322447) 과 정확히 일치 - 21_언어 p2 좌측 셀 (Task edwardkim#342 트리거): height_measurer 와 layout 이 같은 cell.padding 사용으로 일관성 유지 (회귀 없음) - 다른 골든 영향 없음
Q1 (KTX 목차 회귀): cell padding 명시값 우선 정책으로 Task edwardkim#279 결과 복원 — 골든 md5 가 edwardkim#279 시점과 정확히 일치. Q2 (issue-157 -9.6px shift): PDF 미확보로 직접 비교 불가. HWP line_seg vpos 일관성 + 다음 문단 vpos 공식 일치로 'correct' 잠정 판정. Q3 (광범위 회귀 점검): - 21_언어 / exam_math (p2) / KTX TOC / form-002 (Task edwardkim#324): 회귀 없음 - aift / biz_plan / exam_kor / exam_eng: p1 명백한 이상 없음 - exam_math p1 좌측: 별도 layout drift 의심 — Task edwardkim#342 와 무관 가능성, 별도 이슈 분리 권고 Q4: stage 5 보고서로 통합 검증 범위 정리.
Q1~Q4 응답 완료 — 단계 5 보고서 첨부Q1 — 해소됨 ✅
Q2 — HWP 스펙 일치 판정 ⚠issue_157.hwpx 의 한컴 PDF 가 저장소에 없어 직접 비교 불가. HWP line_seg vpos 일관성 + 다음 문단 vpos 공식 ( Q3 — 광범위 점검 결과
Q4 — 단계 5 보고서
잔존 / 후속
본 PR 머지 가부 결정 부탁드립니다. |
|
@planet6897 님 — 답변 + 자체 수정 모두 감사합니다. 메인테이너 재검증
머지 결정작업지시자께서 "기여자 작업을 수용한 후 메인테이너가 작업한 것을 재구현하는 방향이 생산성 측면에서 더 낫다" 고 판단하셨습니다. KTX TOC 결과는 이미 본인 자체 수정( 광범위 누적 작업 (Task #321~#332) + 메인테이너 4가지 질문에 대한 정직한 분석 + 자체 수정까지, 이번에도 인상적이었습니다. 후속본 PR 검증 중 메인테이너가 발견한 exam_eng.hwp 9 → 8 페이지 회귀 는 본 PR 머지 후 별도 이슈로 분리해 추적하겠습니다. 작성자의 Q3 점검에서는 "p1 명백한 이상 없음" 으로 페이지 수까지는 확인 안 하셨던 것으로 보입니다 — 이는 메인테이너 측 자체 점검 항목으로 보강하겠습니다. issue_157 PDF 확보 시 Q2 재검증, exam_math p1 layout drift 도 별도 이슈 후보. 본 PR 머지 후 정리 진행. admin merge 진행합니다 🙏 |
@planet6897 의 누적 통합 PR. 메인테이너 4가지 질문 (Q1~Q4) 에 정직한 분석 + Q1 자체 수정 (782a5a7) 으로 KTX TOC Task #279 결과 복원. admin merge (commit bed276c). 작업지시자 결정: "기여자 작업을 수용한 후 메인테이너 재구현하는 방향이 생산성 측면에서 더 낫다". 작성자 자체 수정으로 추가 재구현 불필요. 후속: - exam_eng.hwp 9 → 8 페이지 회귀 별도 이슈 #345 등록 - issue_157 PDF 확보 시 -9.6px shift 재검증 - exam_math p1 layout drift 별도 이슈 후보 Co-Authored-By: Jaeuk Ryu <planet6897@users.noreply.github.com> Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
라이브러리 버전 동기화 (Cargo.toml / rhwp-vscode / npm/editor / rhwp-studio): 0.7.3 → 0.7.6 브라우저 확장 (rhwp-firefox): 0.2.1 → 0.2.2 (AMO 재제출용) - manifest strict_min_version 142 + viewer 번들 보안 sanitize 반영 본 사이클 외부 기여 PR: - #268/#334 (@oksure): replaceOne API - #279/#282 (@seanshin): 목차 리더 + 페이지번호 정렬 - #324/#327 (@planet6897): form-002 인너 표 페이지 분할 - #335 (@oksure): SVG/HTML draw_image base64 임베딩 - #338/#339 (@postmelee): Firefox AMO 워닝 해결 - #340/#341 (@planet6897): typeset 경로 정합 - #342/#343 (@planet6897): Task #321~#332 통합 + 회귀 해소 rhwp-firefox/README.md 에 v0.2.2 변경 이력 + 기여자 감사 섹션 추가 (@postmelee, @seanshin 인정). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@planet6897 의 PR #323 (Task #321 vpos-reset) 은 메인테이너 회귀 통보 후 작성자가 자체 close 하고 PR #343 으로 후속 정리 통합. 본 PR 은 not merged 로 archive. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- 최근 변경: v0.7.3 → v0.7.6 (2026-04-26) 교체 - PR edwardkim#266 (Task edwardkim#157), edwardkim#273 (Task edwardkim#267), edwardkim#282 (Task edwardkim#279) by @seanshin - PR edwardkim#256, edwardkim#327, edwardkim#341, edwardkim#343 by @planet6897 - PR edwardkim#334, edwardkim#335 by @oksure, PR edwardkim#339 by @postmelee - devel 섹션: 머지된 항목 제거, 현재 분석 중(edwardkim#362/edwardkim#345) + 계획 중(edwardkim#150/edwardkim#253) 반영 - 테스트 수: 891+ → 1000+ - README_EN.md 동일 내용 영문 반영
Summary
(exam_math p2 글자 겹침, 21_언어 p1 줄간격 압축)
resolve_cell_paddingaim 플래그 무시 회귀 revert(21_언어 p2 표 셀 마지막 줄 잘림)
Closes #342
변경 파일
src/renderer/layout.rs(-8/+3) — stage3a/3b 핀포인트 revertsrc/renderer/layout/table_layout.rs(-2/+11) —apply_inner_margin=false일 때 표 기본 패딩 사용하도록 HWP 스펙 복원
Test plan
cargo test --lib— 992 passed, 0 failedcell-clip 내부 (baseline 702.81 < clip_bottom 705.0)