Skip to content

fix: right tab 선행 공백 처리 — 경로 1/2/3 통일 (Issue #267)#273

Merged
edwardkim merged 10 commits intoedwardkim:develfrom
seanshin:feature/task267
Apr 24, 2026
Merged

fix: right tab 선행 공백 처리 — 경로 1/2/3 통일 (Issue #267)#273
edwardkim merged 10 commits intoedwardkim:develfrom
seanshin:feature/task267

Conversation

@seanshin
Copy link
Copy Markdown

Summary

  • KTX.hwp 목차 2페이지에서 소제목 페이지 번호가 ~9.33px 밀리는 버그 수정
  • right tab 처리 경로 3개의 선행 공백 처리를 통일

Root Cause

right tab 정렬 코드가 3경로로 분산되어 있고 탭 직후 선행 공백 처리가 불일치:

경로 케이스 파일
1 탭이 run 중간 (소제목) text_measurement.rs compute_char_positions
2 탭이 run 끝, 추정 패스 (장제목) paragraph_layout.rs:809 pending_right_tab_est
3 탭이 run 끝, 렌더 패스 (장제목) paragraph_layout.rs:1177 pending_right_tab_render

한컴 동작: right tab 직후 선행 공백을 무시하고 실질 텍스트의 우측 끝을 tab_pos에 맞춤.

Changes

text_measurement.rs — 경로 1 (3곳):

// right tab 분기에서만 leading space skip (center tab은 i+1 유지)
let seg_start = { let mut s = i + 1; while s < chars.len() && chars[s] == ' ' && cluster_len[s] != 0 { s += 1; } s };
let seg_w = measure_segment_from(&chars, &cluster_len, seg_start, &char_width);
  • EmbeddedTextMeasurer inline_tabs right tab
  • EmbeddedTextMeasurer tab_stops right tab (+ 잔류 eprintln![DEBUG_TAB_POS] 제거)
  • WasmTextMeasurer tab_stops right tab

paragraph_layout.rs — 경로 2·3 (2곳):

// right tab match arm에서만 trim_start 적용
1 => { let run_w = estimate_text_width(run.text.trim_start(), &ts); ... }
2 => { let run_w = estimate_text_width(&run.text, &ts); ... }  // center tab 유지

Test Results

  • cargo test: 963 passed, 0 failed
  • cargo clippy --lib -- -D warnings: 0 warnings
  • KTX visual diff: 5/5 PASS, 평균 96.40%
  • Golden SVG: issue-267/ktx-toc-page.svg 등록 (samples/KTX.hwp page 1)

Closes #267

hyoun mouk shin added 9 commits April 24, 2026 08:39
수정 대상 5개 위치 확정:
- text_measurement.rs: EmbeddedTextMeasurer L324/L345, WasmTextMeasurer L656
- paragraph_layout.rs: pending_right_tab_est L809, pending_right_tab_render L1177
- 추가: eprintln!("[DEBUG_TAB_POS]") L347-348 제거 대상 확인
Stage 2-4 상세 수정 방안:
- text_measurement.rs: seg_start 헬퍼 패턴 (3곳) + eprintln 제거
- paragraph_layout.rs: match arm 분리 + trim_start (2곳)
- 검증: cargo test / clippy / KTX visual diff
3경로 모두 right tab 직후 선행 공백을 무시하고 실질 텍스트 폭으로 tab_pos 정렬:

경로 1 (compute_char_positions): seg_start 인덱스에서 공백 skip 후 measure_segment_from 호출
  - EmbeddedTextMeasurer inline_tabs L324
  - EmbeddedTextMeasurer tab_stops L345 (+ eprintln![DEBUG_TAB_POS] 제거)
  - WasmTextMeasurer tab_stops L656

경로 2 (pending_right_tab_est): right tab match arm에서 run.text.trim_start() 전달
경로 3 (pending_right_tab_render): right tab match arm에서 run.text.trim_start() 전달

center tab은 현행 동작 유지.
KTX.hwp 2페이지(목차) golden 추가:
- samples/KTX.hwp 추가
- tests/svg_snapshot.rs: issue_267_ktx_toc_page 테스트 추가
- tests/golden_svg/issue-267/ktx-toc-page.svg: golden 생성
- README: devel 섹션 추가 (edwardkim#157/edwardkim#267/edwardkim#256 PR 반영)
- plans/ → plans/archives/: task_m100_267{,_impl}.md 이동
# Conflicts:
#	mydocs/orders/20260424.md
Copy link
Copy Markdown
Owner

@edwardkim edwardkim left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

리베이스 + devel 병합 후 재승인 — orders 문서 충돌만 메인테이너가 해결.

@edwardkim edwardkim merged commit 0aed531 into edwardkim:devel Apr 24, 2026
5 checks passed
edwardkim added a commit that referenced this pull request Apr 24, 2026
- 작성자: @seanshin (Task #267, PR #273)
- Merge commit: 0aed531 (admin merge, orders 문서 충돌 직접 해결)
- 이슈 #267 closed

처리 절차:
- PR 브랜치에 origin/devel 머지 → orders 문서 충돌 해결
- seanshin/feature/task267에 push (maintainerCanModify 허용)
- 재승인 + admin merge

검증: cargo test --lib 964 passed, clippy clean, svg_snapshot 5 passed

별도 관찰: KTX.hwp 2단 구성 TAC 표 위치 회귀 (본 PR 무관, 후속 핀셋 처리 예정)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
edwardkim added a commit that referenced this pull request Apr 24, 2026
…r 복구 (closes #275)

- 작성자: @planet6897 (Task #275, PR #278)
- Merge commit: 2a27b36 (admin merge, orders 문서 충돌 직접 해결)
- 이슈 #275 closed
- 커뮤니티 리뷰: @seanshin APPROVED

처리 절차:
- PR 브랜치에 origin/devel 머지 → orders 문서 충돌 해결 (Task #275 섹션 "## 5" 재배치)
- planet6897/local/task275에 push (maintainerCanModify 허용)
- 재승인 + admin merge

검증:
- cargo test --lib svg_fragment: 19 passed / 0 failed
- cargo test --lib: 983 passed / 0 failed / 1 ignored (+19 신규 svg_fragment)
- cargo clippy + wasm32 check: clean
- svg_snapshot: 6 passed

파급 효과: WASM canvas 에서 OLE 네이티브 이미지/EMF/OOXML 차트/Placeholder 모두 복구

===== 오늘 처리 5개 PR 완료 =====
#284 (#280) @planet6897 - 수식 폰트 스택
#285 (#283) @planet6897 - 수식 파렌 글리프
#266 (#157/#103) @seanshin - 비-TAC 표 out-of-flow
#273 (#267) @seanshin - right tab 공백 처리
#277 (#147) @seanshin - MEMO 바탕쪽 오분류
#278 (#275) @planet6897 - WASM OLE RawSvg/Placeholder

별도 추적: 이슈 #291 (KTX.hwp 2단 TAC 표 회귀, 핀셋 처리 예정)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
edwardkim added a commit that referenced this pull request Apr 24, 2026
 #297)

- 작성자: @planet6897 (Task #297, PR #300, 오늘 6번째 기여)
- Merge commit: 0e3fb02 (admin merge, orders 3구간 충돌 직접 해결)
- 이슈 #297 CLOSED

처리 절차:
- PR 브랜치에 origin/devel 머지 → orders 섹션 3구간 해결 (#295 "## 7", #296 "## 8", #297 "## 9")
- planet6897/task297 에 push
- 재승인 + admin merge

변경 (1파일):
- src/renderer/layout/table_layout.rs +5 -2:
  - VertRelTo::Page => (col_area.y, col_area.height)  [쪽 본문 영역]
  - VertRelTo::Paper => (0, page_h_approx)  [용지 전체, 유지]
  - HWP 스펙 Page=쪽 본문, Paper=용지 전체 반영

성과:
- pi=22 "* 확인 사항" 박스 y: 1371.5 → 1224.07 (PDF 1226.5 ±2 일치)
- 145 샘플 중 본문 Page 표 13건 + 바탕쪽 5건 회귀 스캔 완료 (의도 범위 외 무회귀)

검증:
- cargo test --lib: 992 passed
- svg_snapshot: 6 passed (golden 유지)
- 실제 SVG y 좌표 확인: 1224.07px (PDF 일치)

#295#297 연결 모범 사례: PR #298 리뷰 중 사전 존재 버그로 분리 → 1시간 만에 PR #300 해결.
초기 가설(바탕쪽 Paper) 폐기 → pdftotext 실측으로 근본 원인(enum 미구분) 발견 → 1줄 수정.

===== 오늘 9번째 PR 머지 =====
#284 #285 #266 #273 #277 #278 #289 #292 #298 #300
+ 메인테이너 핀셋 #296

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
seanshin pushed a commit to seanshin/rhwp that referenced this pull request Apr 26, 2026
- 최근 변경: 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 동일 내용 영문 반영
edwardkim added a commit that referenced this pull request Apr 30, 2026
mydocs/feedback/:
  - manual_currency_audit.md (매뉴얼 현행화 감사 결정 요청 — 2026-04-23)
  - open_issues_priority.md (열린 이슈 37건 우선순위 — 2026-04-22)
  - pr165_merge_decisions.md (PR #165 Skia + Layered Renderer 머지 충돌 결정 — 2026-04-21)
  - self_censor_audit.md (외부 공개 문서 자기검열 감사 — 2026-04-22)

mydocs/pr/:
  - archives/pr_256_review.md + review_impl.md (PR #256 검토 + 구현 계획)
  - pr_273_review.md (PR #273 Task #267 right tab 처리 검토)

이전 사이클 작성 후 미커밋 보관 — devel 머지 + push 진행 시 함께 커밋.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
jangster77 pushed a commit to jangster77/rhwp that referenced this pull request Apr 30, 2026
mydocs/feedback/:
  - manual_currency_audit.md (매뉴얼 현행화 감사 결정 요청 — 2026-04-23)
  - open_issues_priority.md (열린 이슈 37건 우선순위 — 2026-04-22)
  - pr165_merge_decisions.md (PR edwardkim#165 Skia + Layered Renderer 머지 충돌 결정 — 2026-04-21)
  - self_censor_audit.md (외부 공개 문서 자기검열 감사 — 2026-04-22)

mydocs/pr/:
  - archives/pr_256_review.md + review_impl.md (PR edwardkim#256 검토 + 구현 계획)
  - pr_273_review.md (PR edwardkim#273 Task edwardkim#267 right tab 처리 검토)

이전 사이클 작성 후 미커밋 보관 — devel 머지 + push 진행 시 함께 커밋.

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

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants