Skip to content

Task #598: 본문 각주 마커 이동 및 삭제#642

Closed
postmelee wants to merge 5 commits intoedwardkim:develfrom
postmelee:feature/issue-598-footnote-marker-delete
Closed

Task #598: 본문 각주 마커 이동 및 삭제#642
postmelee wants to merge 5 commits intoedwardkim:develfrom
postmelee:feature/issue-598-footnote-marker-delete

Conversation

@postmelee
Copy link
Copy Markdown
Contributor

@postmelee postmelee commented May 6, 2026

개요

#598의 본문 각주 마커 hit test, 커서 이동 단위화, Delete/Backspace 삭제 UX를 구현합니다.

이번 PR은 이슈에서 허용한 단계 분리 계획 중 (1) hit test + 커서 이동(2) 삭제 API/UI 를 한 PR에 통합한 최종 구현입니다.

Closes #598

작업 범위 충족도

#598 작업 범위 PR 반영 내용 상태
WASM: 본문 각주 마커 hit test API hitTestBodyFootnoteMarker() / hit_test_body_footnote_marker_native() 추가, FootnoteMarkerNode.control_index 를 실제 para.controls 인덱스로 보정 완료
WASM: 각주 삭제 API getFootnoteAtCursor() / deleteFootnote() 추가. 본문 footnote control 제거, ctrl_data_records 동기화, char_offsets / char_count 보정, 번호 재계산, reflow/pagination/cache 무효화 완료
WasmBridge 본문 마커 hit test, cursor 위치의 각주 조회, 각주 삭제 bridge 메서드 추가 완료
커서 이동 각주/미주 마커를 inline cursor unit 으로 처리. marker_pos 왼쪽과 marker_pos + 1 오른쪽 caret 위치 지원 완료
마우스 처리 본문 각주 마커 클릭 시 해당 각주 편집 모드로 진입 완료
입력 처리 Delete/Fn+Delete는 마커 앞, Backspace는 마커 뒤에서 각주 삭제 분기로 진입 완료
확인 다이얼로그 Delete/Fn+Delete와 Backspace 양쪽에서 동일한 showConfirm("각주 삭제", "각주를 삭제하시겠습니까?") 호출 완료
Undo/Redo 삭제는 SnapshotCommand 경로로 실행해 Ctrl+Z 복원 가능 완료

범위 밖으로 둔 항목:

  • 셀/글상자 내부 각주는 이번 이슈의 본문 각주 삭제 범위에 포함하지 않고 기존 동작을 유지했습니다.

주요 리뷰 포인트

  • 각주 삭제 분기는 일반 텍스트 삭제보다 먼저 실행됩니다.
    • Backspace: charOffset == marker_pos + 1
    • Delete/Fn+Delete: charOffset == marker_pos
  • charOffset == marker_pos 에서 Backspace를 누르는 경우는 각주 삭제가 아니라 일반 텍스트 삭제입니다.
    • 이때 marker anchor가 줄 끝으로 밀리지 않도록 delete_text_at() 의 UTF-16 삭제 길이 계산을 보정했습니다.
    • Undo 성격의 삽입이 각주 마커 뒤로 들어가지 않도록 insert_text_at() 의 inline control 앞 삽입 조건을 실제 본문 흐름 컨트롤로 제한했습니다.
  • 삭제 후 남은 각주는 section 내 문서 순서대로 재번호화합니다.
  • insert_footnote_native() 의 각주 control mask 비트도 동일 흐름에서 맞도록 보정했습니다.

검증

로컬 검증

  • cargo test --test issue_598_footnote_marker_nav (4 passed)
  • cargo test wasm_api::tests::test_save_text_only --lib -- --nocapture
  • cargo test --lib (1135 passed, 0 failed, 2 ignored)
  • cargo test navigable_text_len_counts_trailing_footnote_marker
  • cargo build
  • cd rhwp-studio && npm run build
  • docker-compose --env-file .env.docker run --rm wasm
  • 새 WASM 반영 후 cd rhwp-studio && npm run build
  • CHROME_PATH="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" node e2e/footnote-delete-confirm.test.mjs --mode=headless
  • git diff --check

rhwp-studio e2e 검증

  • 본문 각주 마커 왼쪽에서 ArrowRight → 마커 오른쪽으로 1칸 이동
  • 본문 각주 마커 오른쪽에서 ArrowLeft → 마커 왼쪽으로 1칸 이동
  • 본문 각주 마커 클릭 → 각주 편집 모드 진입 및 원본 문단/컨트롤/각주 인덱스 연결
  • 각주 마커 바로 앞 Backspace → 확인창 없이 일반 텍스트만 삭제
  • 각주 마커 바로 앞 Backspace 후 marker anchor 유지 및 Ctrl+Z 복원
  • Delete/Fn+Delete 경로 확인창 메시지 표시
  • 확인창 취소 시 각주 마커/본문/번호 유지
  • Backspace 경로에서도 동일 확인창 메시지 표시
  • 확인 시 각주 마커/본문 삭제 및 후속 각주 재번호화
  • Ctrl+Z 후 각주 마커/본문/번호 복원

GitHub Checks

  • Analyze (javascript-typescript)
  • Analyze (python)
  • Analyze (rust)
  • Build & Test
  • Canvas visual diff
  • CodeQL
  • WASM Build: skipped 조건 확인

컨트리뷰터 안내 대응

#598 진행 시 참고 대응
한컴 동작이 권위 기준 한컴 2010/2022 직접 실행 환경은 없어 로컬 웹서버와 e2e로 검증했습니다. PR에는 메인테이너가 한컴 환경에서 확인하기 쉬운 수동 판정 포인트를 남겼습니다.
단계 분리 가능, (1)+(2) → (3) 권장 최초 댓글처럼 hit test/커서 이동을 먼저 구현하고, 이어 삭제 API/UI/Undo를 추가했습니다. 최종 PR은 세 영역을 한 PR에 묶었습니다.
확인 다이얼로그는 단일 컴포넌트 Delete/Fn+Delete와 Backspace 양쪽 모두 동일 showConfirm() 호출을 사용합니다.
WASM footnote 관련 모듈 참고 footnote 조회/삭제는 src/document_core/commands/footnote_ops.rs 와 WASM API에 배치했습니다.
insert:footnote 패턴 참고 삭제도 rhwp-studio command/snapshot 흐름에 맞춰 연결했습니다.
본문 → 각주 영역 커서 이동 본문 마커 hit 후 기존 각주 편집 모드와 각주 cursor rect 경로로 연결했습니다.
프로젝트 워크플로우 계획서, 단계별 완료보고서, 최종 보고서를 mydocs/ 에 작성했습니다.

수동 검증 자료

1. 본문 각주 마커 클릭 -> 각주 편집 모드 진입

2026-05-06.14.49.19.mov

2. Backspace 로 본문 각주 삭제 / Ctrl+Z → 각주 복원

gakju_delete.mov

3. Fn+Delete 로 본문 각주 삭제 / Ctrl+Z → 각주 복원

2026-05-06.15.41.30.mov

확인 기준:

  • 본문 첫 번째 1) 각주 마커 삭제
  • 하단 첫 번째 각주 본문 삭제
  • 기존 두 번째 각주가 1) 로 재번호화

PR open 전 점검

  • upstream/devel 기준 최신: behind 0, ahead 5
  • 최신 head: 7e5b763
  • 로컬 미커밋 변경 없음 (AGENTS.md untracked 로컬 파일은 PR 범위에서 제외)
  • GitHub Checks 통과

문서

  • mydocs/plans/task_m100_598.md
  • mydocs/plans/task_m100_598_impl.md
  • mydocs/plans/task_m100_598_delete_impl.md
  • mydocs/working/task_m100_598_stage*.md
  • mydocs/working/task_m100_598_report.md
  • mydocs/orders/20260506.md

@postmelee postmelee marked this pull request as ready for review May 6, 2026 09:39
edwardkim added a commit that referenced this pull request May 6, 2026
- @postmelee (Taegyu Lee) 첫 PR 검토 — Issue #598 본문 각주 마커 이동 및 삭제
- 32 파일 +2,751/-34 (본질 src 9 + rhwp-studio TS 4 + tests 1 + 컨트리뷰터 fork plans/working 11)
- 본 환경 검증: cargo test 1141 passed / issue_598_footnote_marker_nav 4/4 / clippy 0
- rhwp-studio npm run build 정합 / Docker WASM 4,587,318 bytes (PR #620 baseline -3,219)
- 광범위 sweep: 167 fixture / 1,687 페이지 / 차이 0
- cherry-pick 충돌 영역: orders add/add 만 발생, src 영역 0 (합본 patch 방식 적용 시 깨끗)
- Issue assignee 정합 (작업지시자 직접 지정), Issue #598 5 영역 모두 본질 정정
- 옵션 A (합본 cherry-pick + 작업지시자 web 환경 직접 각주 동작 테스트) 권장

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
edwardkim added a commit that referenced this pull request May 6, 2026
- postmelee 영역 정합 (첫 PR → 활발한 컨트리뷰터 13 PR 누적)
- 9.5.1 합본 cherry-pick (17434e9, author postmelee 보존, 16 파일 +959/-34)
- 9.5.2 결정적 재검증 (1141 passed / issue_598_footnote_marker_nav 4/4 / clippy 0)
- 9.5.4 web 시각 판정 자료 안내 (8가지 권위 영역 명시 + 실행 명령)
- WASM: 4,587,318 bytes (PR #620 baseline -3,219)
- 처리 결정 갱신 (검토 중 → 옵션 A 진행 중 web 시각 판정 게이트 대기)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
edwardkim added a commit that referenced this pull request May 6, 2026
@edwardkim
Copy link
Copy Markdown
Owner

검토 + 합본 cherry-pick 머지 완료. 감사합니다.

처리 결과

본 환경 cherry-pick 시 발견 — mydocs/orders/20260506.md add/add 충돌만 발생, src/* 영역 충돌 0. 본 환경 5/6 orders 는 ours 보존했습니다 (이전 PR 처리 누적과 정합).

결정적 재검증 (본 환경)

검증 결과
cargo test --lib --release 1141 passed (회귀 0)
cargo test --release --test issue_598_footnote_marker_nav 4/4 passed (PR 본문 명시 4 영역 정합)
cargo test --release --test svg_snapshot 6/6 passed
cargo clippy --release --lib 0건
rhwp-studio npm run build (tsc && vite build) TypeScript 타입 체크 통과 + dist 빌드 (index-CKsYNtwg.js 691,386 bytes)
Docker WASM 빌드 4,587,318 bytes (PR #620 baseline 4,590,537 -3,219 — composer.rs / paragraph_layout.rs 영역 정합 보강)

광범위 페이지네이션 회귀 sweep

  • 총 167 fixture (161 hwp + 6 hwpx) / 1,687 페이지 / 차이 0

메인테이너 시각 판정 결과 (web 환경 + samples/footnote-01.hwp 권위 샘플)

4 권위 영역 모두 통과 — 작업지시자 평가:

영역 결과
각주 hitTest 판정 ✅ 성공
각주 캐럿 이동 판정 ✅ 성공
각주 앞에서 Del 키 판정 ✅ 성공
각주 뒤에서 Backspace 키 판정 ✅ 성공

samples/footnote-01.hwp 가 권위 샘플로 사용됨 (이미 본 환경 git tracked 영역).

본 PR 의 본질

본 PR 의 처리 본질에서 가장 우수한 점:

  1. Issue rhwp-studio: 각주 삭제 기능 구현 (편집 영역에서 각주 선택 → 삭제) #598 5 영역 모두 본질 정정 — hit test / 커서 이동 단위 / Delete/Backspace 양방향 동일 확인창 / 번호 재계산 / Undo
  2. WASM API 신규 정합hitTestBodyFootnoteMarker / getFootnoteAtCursor / deleteFootnote (+ native 영역 동일 함수) 명료한 영역 분리
  3. HWP IR 표준 직접 정합delete_footnote 가 본문 footnote control + ctrl_data_records 동기화 + char_offsets/char_count 보정 + 번호 재계산 모두 정합 처리
  4. 확인 다이얼로그 단일 컴포넌트 — Delete/Backspace 양쪽 동일 showConfirm() 호출 (Issue rhwp-studio: 각주 삭제 기능 구현 (편집 영역에서 각주 선택 → 삭제) #598 명세 정합)
  5. SnapshotCommand 경로 Undo 통합 — Ctrl+Z 복원 정합
  6. 회귀 차단 가드 — 4 신규 통합 테스트 (issue_598_footnote_marker_nav.rs) + Puppeteer e2e (footnote-delete-confirm.test.mjs)
  7. 한컴 권위 영역 인지 — "한컴 2010/2022 직접 실행 환경은 없어 로컬 웹서버와 e2e로 검증" + "메인테이너가 한컴 환경에서 확인하기 쉬운 수동 판정 포인트" 명시 (reference_authoritative_hancom 정합)
  8. 단계 분리 (1)+(2) → (3) 권장 정합 — Issue rhwp-studio: 각주 삭제 기능 구현 (편집 영역에서 각주 선택 → 삭제) #598 의 단계 분리 권장을 한 PR 에 통합 정합으로 우수

크롬 확장 사용자분들이 별점 리뷰에서 요청해주셨던 각주 삭제 기능 의 본질 영역 (Issue #598) 을 한컴 정합 UX 5 영역 모두 정정해주셨습니다. v1.0.0 진입 직전 핵심 사용성 영역의 본질 정합 우수.

후속 영역 (별도 task 후보)

PR 본문 명시 — 셀/글상자 내부 각주는 본 PR 범위 외, 별도 후속 영역으로 분리 검토 예정입니다.

수고하셨습니다.

@edwardkim edwardkim closed this May 6, 2026
edwardkim added a commit that referenced this pull request May 6, 2026
- mydocs/pr/archives/pr_642_report.md 신규 (처리 보고서, 본 사이클 두 번째 web editor 본질 정정 PR)
- mydocs/pr/pr_642_review.md → mydocs/pr/archives/pr_642_review.md 이동
- mydocs/orders/20260507.md 갱신 (PR #642 항목 추가, 잔존 PR 14 → 13)
- feedback_assign_issue_before_work + reference_authoritative_hancom 메모리 권위 영역 강화

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
edwardkim added a commit that referenced this pull request May 7, 2026
- 13.1 핀셋 cherry-pick (0059557, author Hyunwoo Park 보존)
- 13.2 결정적 재검증 (1141 passed / clippy 0 / WASM 4,588,023 bytes)
- 13.3 작업지시자 안내 영역 (aift.hwp 페이지 수 47/77 차이 + 시각적 개선 미발현 본 환경 fixture 영역)
- 13.4 권장 처리 방향 정합 (옵션 A-1 권위 샘플 도입 / A-2 그대로 머지 + 후속 / A-3 close + 후속 PR 권유)
- 13.5 WASM 산출물 정합 (PR #642 baseline +705 bytes)

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