Skip to content

fix: Task #279 — 목차 리더 도트 렌더링 + 소제목 페이지번호 탭 정렬#282

Merged
edwardkim merged 8 commits into
edwardkim:develfrom
seanshin:feature/task279-toc-leader-tab
Apr 25, 2026
Merged

fix: Task #279 — 목차 리더 도트 렌더링 + 소제목 페이지번호 탭 정렬#282
edwardkim merged 8 commits into
edwardkim:develfrom
seanshin:feature/task279-toc-leader-tab

Conversation

@seanshin

Copy link
Copy Markdown

Summary

  • 리더 도트 렌더링 (svg.rs, web_canvas.rs): fill_type=3(점선) 리더가 사각 대시선으로 렌더되던 버그 수정. stroke-dasharray="0.1 3" stroke-linecap="round"로 한컴과 동등한 원형 점(···) 표현.
  • 소제목 페이지번호 탭 정렬 (text_measurement.rs): find_next_tab_stop에서 type=1(오른쪽) 탭을 available_width로 클램핑하지 않도록 수정. 들여쓰기(left_margin)가 있는 소제목 문단에서 right tab이 column 기준 절대 위치로 올바르게 유지됨.

Root Cause (탭 정렬)

TabStop.position = 단(column) 기준 절대 px
available_width  = col_width - effective_margin_left - margin_right

effective_margin_leftleft_margin이 포함되어, 들여쓰기 문단(소제목)에서 available_width가 작아짐 → 오른쪽 탭 위치가 잘못 클램핑됨.

Fix: ts.tab_type != 1 조건 추가 — left/center 탭(0/2)만 클램핑, right 탭(1)은 제외.

Before / After (KTX.hwp 목차)

항목 수정 전 수정 후
소제목 페이지번호 x ~700px 717.9px
장제목 페이지번호 x 717.5px 717.5px
차이 ~17px 0.4px

Test

  • cargo test: 793 passed, 0 failed
  • KTX.hwp 목차 SVG 시각 확인 완료

Closes #279

@edwardkim

Copy link
Copy Markdown
Owner

@seanshin 님, PR #282 검토 요청 감사합니다.

현재 이 PR은 devel과 충돌(CONFLICTING) 상태이며, #279와 무관한 커밋/파일이 다수 포함되어 있어 리베이스 정리 후 재요청 부탁드립니다.

확인된 이슈

1. Merge Conflict

mergeStateStatus: DIRTY — devel에 이후 머지된 변경사항과 충돌이 발생했습니다.

2. #279와 무관한 파일이 포함됨

PR diff에서 아래 파일들이 #279 작업 범위를 벗어납니다:

요청 사항

feature/task279-toc-leader-tab 브랜치를 최신 devel에서 깨끗하게 재분기해주시기 바랍니다.

권장 절차:

# 1. 최신 devel fetch
git fetch upstream devel   # (또는 origin devel)

# 2. 새 브랜치를 devel 기준으로 생성
git checkout -b feature/task279-toc-leader-tab-v2 upstream/devel

# 3. #279 핵심 커밋만 cherry-pick (리더 도트 + 탭 정렬)
git cherry-pick d48af5c   # fix: Task #279 Stage 2+3
git cherry-pick 76436df   # docs: Task #279 Stage 3+4 보고서
git cherry-pick 5d1c80f   # docs: Task #279 수행계획서

# 4. 강제 push 후 PR 갱신 (혹은 새 PR 생성)
git push --force-with-lease origin feature/task279-toc-leader-tab

#279의 최종 변경 범위 (이것만 있으면 됩니다)

  • src/renderer/svg.rs, src/renderer/web_canvas.rs — fill_type=3 리더 도트 렌더링
  • src/renderer/layout/text_measurement.rs — right tab 클램핑 제외
  • mydocs/plans/task_m100_279.md — 수행 계획서
  • mydocs/working/task_m100_279_stage3.md — 단계별 보고서

참고

정리 후 다시 알려주시면 우선순위로 검토하겠습니다. 감사합니다!

@edwardkim

Copy link
Copy Markdown
Owner

@seanshin 님, 검토 코멘트 후 응답이 없으셔서 본 PR 은 close 처리하고, 메인테이너 측에서 #279 를 직접 마무리하기로 결정했습니다.

처음 제출하신 두 핵심 수정 (리더 도트 stroke-dasharray="0.1 3" stroke-linecap="round" + right tab 클램핑 제외) 자체는 좋은 분석이었습니다. 다만 PR 정리(범위 분리, devel rebase) 작업이 길어지는 동안 본 이슈를 더 두면 다른 의존 작업이 막힙니다.

기여 의사 감사드립니다. 다음 PR 에서 다시 뵙겠습니다.

@edwardkim edwardkim closed this Apr 25, 2026
@edwardkim edwardkim reopened this Apr 25, 2026
@edwardkim

Copy link
Copy Markdown
Owner

@seanshin 님, close 처리는 정정합니다 — 본 PR 을 다시 열고 메인테이너가 직접 정리해서 마무리하겠습니다.

PR 자체를 close 하면 기여 인정이 어려워지고, 대신 새 PR 을 여는 것보다 본 PR 을 정리해서 머지하는 쪽이 깔끔합니다. maintainerCanModify=true 설정 덕분에 메인테이너가 작성자 브랜치에 직접 push 가능하므로 다음과 같이 진행합니다.

진행 계획

  1. 본 PR 의 목차 right tab 리더 점 렌더링 + 소제목 페이지 번호 정렬 불일치 #279 핵심 3 커밋 만 origin/devel 기반 새 head 로 정리
    • 5d1c80f 수행계획서
    • d48af5c Stage 2+3 (svg.rs / web_canvas.rs / text_measurement.rs)
    • 76436df Stage 3+4 보고서
  2. 메인테이너가 구현계획서 + 회귀 검증 + 최종 보고서 보강
  3. force-push 로 본 PR 갱신
  4. CI + 시각 검증 후 admin merge

기여 인정

3 커밋의 author 정보 (seanshin) 를 보존합니다. 머지 후에도 commit log 에 본인 이름으로 남게 됩니다.

분석 자체 (리더 도트 dasharray + right tab 클램핑 제외) 가 정확하셨던 부분을 그대로 살립니다. 마무리 후 알려드리겠습니다.

기여 감사합니다.

hyoun mouk shin and others added 8 commits April 25, 2026 14:39
이슈: edwardkim#279
브랜치: local/task279

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- svg.rs, web_canvas.rs: fill_type=3(점선) 리더를 round cap 원형 점으로 변경
  stroke-dasharray="0.1 3" stroke-linecap="round" stroke-width="1.0"
- text_measurement.rs: find_next_tab_stop — type=1(오른쪽) 탭은
  available_width 클램핑 제외. 들여쓰기 문단에서 오른쪽 탭 위치가
  column-relative 절대 위치로 올바르게 유지됨.
  (이전: 소제목 페이지번호 ~9px 좌편; 수정 후: 717.5±0.5px 동일 정렬)

closes edwardkim#279

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 작성자 @seanshin 의 본 task 분석을 바탕으로 메인테이너가 인수.
- 수행계획서: 인수 경위 + 7가지 기여 인정 항목 (cherry-pick author
  보존, Co-Authored-By 체인, CHANGELOG, 위키 등재, HWP Spec Errata,
  PR/이슈 코멘트, 최종 보고서 명시) 명문화.
- 구현계획서 신규 작성: 4단계 (cherry-pick / 빌드 검증 / 좌표 측정 +
  회귀 / 최종 보고서·인정 산출물 + force-push + admin merge), 커밋
  스킴, 리스크 대응 명세.

원본 분석·구현: @seanshin (PR edwardkim#282)

Co-Authored-By: hyoun mouk shin <hyounmoukshin@hyounui-MacBookPro.local>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- @seanshin5d1c80f / d48af5c / 76436df cherry-pick 완료, author 보존
- 메인테이너 강화 수행계획서 + 구현계획서 별도 커밋 추가
- 코드 변경 3 파일 적용 확인 (svg.rs / web_canvas.rs / text_measurement.rs)

Co-Authored-By: hyoun mouk shin <hyounmoukshin@hyounui-MacBookPro.local>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- 빌드/lib 992/clippy/wasm32: 모두 통과
- svg_snapshot: 의도된 2건 (KTX 목차, aift 3페이지 leader) UPDATE_GOLDEN 갱신
- KTX 목차 소제목 페이지번호: 709.76 → 727.47 (장제목과 동일 우측 edge)
- aift 표 안 leader: dasharray 통일 (좌표 동일)

Co-Authored-By: hyoun mouk shin <hyounmoukshin@hyounui-MacBookPro.local>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
작성자 @seanshin 의 핵심 분석 (리더 도트 dasharray + tab_type != 1
클램핑 가드) 위에 메인테이너가 6가지 추가 결함 식별 및 보강:

1. trailing 공백 \t 케이스 가드 정밀화 (`\t ` → cross-run 진입 활성화)
2. resolve_last_tab_pending 시그니처에 fill_type 추가
3. leader-RIGHT 탭 시멘틱 (셀 inner 우측 끝 강제) — 셀 padding 침범 해소
4. 페이지번호 폭별 leader 길이 차등화 (cross-run take 시 leader.end_x
   단축, leader-bearing TextRun 검색)
5. 공백 only run carry-over (정렬 단위 아님)
6. trim_start 제거 (선행 공백 시각 보정)

검증:
- KTX 목차 모든 페이지번호 right edge ≈ 700.0 으로 정렬 통일
- 992 lib + 6/6 svg_snapshot + 1 issue_301 + clippy + wasm32 통과
- 7 핵심 샘플 페이지 수 무변화
- 작업지시자 WASM 시각 검증 통과

산출물:
- mydocs/working/task_m100_279_stage3.md (보강된 stage3 보고서)
- mydocs/troubleshootings/toc_leader_right_tab_alignment.md
- tests/golden_svg/issue-267/ktx-toc-page.svg (UPDATE_GOLDEN)

Co-Authored-By: hyoun mouk shin <hyounmoukshin@hyounui-MacBookPro.local>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- mydocs/report/task_m100_279_report.md (최종 보고서, 머리말에 @seanshin
  원본 분석·구현 + PR edwardkim#282 명시)
- CHANGELOG.md Unreleased 섹션 — "분석·구현 by [@seanshin]" 항목
- mydocs/tech/hwp_spec_errata.md entry 30 추가 — TabDef.position 의
  시멘틱 재해석 + 발견·구현 본인 명기
- mydocs/orders/20260425.md Task edwardkim#279 섹션 추가

핵심 교훈: HWP 스펙은 데이터 포맷 정의일 뿐이고 한컴 조판 알고리즘은
비공개. 스펙 충실 구현 ≠ 한컴 호환. rhwp 는 "한컴 조판 결과를
재현하는 엔진" 이어야 한다 (errata entry 30 + report § 학습 1).

closes edwardkim#279

Co-Authored-By: hyoun mouk shin <hyounmoukshin@hyounui-MacBookPro.local>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@edwardkim edwardkim force-pushed the feature/task279-toc-leader-tab branch from 76436df to 046a35f Compare April 25, 2026 08:41
@edwardkim

Copy link
Copy Markdown
Owner

@seanshin 님 — PR 정리 + 메인테이너 보강이 완료되었습니다. CI 통과 후 admin merge 진행하겠습니다.

본 PR 의 최종 변경 (8 commits)

commit author 내용
f27477e @seanshin 수행계획서
2eb1be5 @seanshin 핵심 수정 (svg.rs / web_canvas.rs / text_measurement.rs)
4770a8a @seanshin Stage 3 보고서
cfb8ba6 edward (Co-Authored-By: @seanshin) 메인테이너 강화 plans
942811c edward (Co-Authored-By: @seanshin) Stage 1 cherry-pick 보고서
9099759 edward (Co-Authored-By: @seanshin) Stage 2 빌드 검증 + svg_snapshot 갱신
7322447 edward (Co-Authored-By: @seanshin) Stage 3 — 6가지 추가 결함 식별 + 보강 + 트러블슈팅 등록
046a35f edward (Co-Authored-By: @seanshin) Stage 4 — 최종 보고서 + 기여 인정

메인테이너 추가 보강 (6가지 추가 결함)

본인 핵심 분석 (리더 도트 dasharray + RIGHT 탭 클램핑 제외) 위에 시각 검증 사이클로 6가지 추가 결함 식별·보강:

  1. trailing 공백 \t 케이스 (\t ) 가드 정밀화 — cross-run RIGHT 진입 활성화
  2. resolve_last_tab_pending 시그니처 확장 (fill_type 추가)
  3. 리더 시멘틱 — leader 있는 RIGHT 탭은 cell inner 우측 끝으로 강제 (셀 padding 인지)
  4. 페이지번호 폭별 leader 길이 차등화 — leader-bearing TextRun 검색 + leader.end_x 단축
  5. 공백 only run carry-over — 정렬 단위 아님
  6. trim_start 제거 — 선행 공백 시각 보정 (장제목 두 자리 케이스)

KTX 목차 모든 페이지번호 right edge ≈ 700.0 으로 정렬 통일 (한컴 결과와 동등).

기여 인정 산출물 (7가지)

  1. Cherry-pick author 보존 (3 커밋, hyoun mouk shin)
  2. Co-Authored-By 체인 (메인테이너 신규 5 커밋)
  3. CHANGELOG.md "분석·구현 by @seanshin"
  4. HWP Spec Errata entry 30 (TabDef.position 시멘틱 — 발견·구현 본인 명기)
  5. 위키 페이지 신규: HWP Tab Leader Rendering (본인 크레딧 머리말)
  6. 트러블슈팅 문서 (외부 기여 인정 섹션) — mydocs/troubleshootings/toc_leader_right_tab_alignment.md
  7. 최종 보고서 머리말 + 본인 stage3 보고서 인용 보존 — mydocs/report/task_m100_279_report.md

핵심 교훈 (errata 30 + 보고서 § 학습)

HWP 스펙은 데이터 포맷 정의일 뿐, 한컴 조판 알고리즘은 비공개다. 스펙 충실 구현 ≠ 한컴 호환. rhwp 는 "한컴 조판 결과를 재현하는 엔진" 이어야 한다.

본인의 분석이 이 원칙의 정확한 적용 (tab_type != 1 클램핑 제외 + 리더 도트 round cap 시멘틱) 이라 본 task 의 본질적 통찰을 제공해 주셨습니다. 감사합니다.

CI 통과 직후 admin merge 진행하겠습니다.

@edwardkim edwardkim left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

Stage 4 마무리 완료. 모든 검증 통과 (992 lib + 6/6 svg_snapshot + clippy + wasm32 + 7 샘플 무변화 + 작업지시자 시각 확인). admin merge 진행합니다.

@edwardkim edwardkim merged commit edcf361 into edwardkim:devel Apr 25, 2026
6 checks passed
edwardkim added a commit that referenced this pull request Apr 25, 2026
- @seanshin 의 PR 인수 후 메인테이너 마무리 + admin merge (commit edcf361)
- 이전 close-only 보고서를 인수·머지 결과 보고서로 정정 + archive

본 처리는 인수의 모범 사례:
- 작성자 fork force-push 활용 (maintainerCanModify=true)
- author 정보 보존 (cherry-pick + Co-Authored-By 체인)
- 7가지 기여 인정 산출물 (CHANGELOG/Errata/Wiki/트러블슈팅/보고서/PR/Issue 코멘트)

Co-Authored-By: hyoun mouk shin <hyounmoukshin@hyounui-MacBookPro.local>
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 25, 2026
…ADME 업데이트

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
edwardkim added a commit that referenced this pull request Apr 26, 2026
라이브러리 버전 동기화 (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>
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 동일 내용 영문 반영
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