Skip to content

rhwp-studio: 각주 삭제 기능 구현 (편집 영역에서 각주 선택 → 삭제) #598

@edwardkim

Description

@edwardkim

배경

크롬 확장 사용자들의 별점 리뷰에서 각주 삭제 기능 요청이 다수 접수되었습니다.

현재 rhwp-studio 는 각주 삽입만 구현되어 있고, 삽입된 각주를 편집 영역에서 선택하여 삭제하는 기능이 없습니다.

한컴 정합 UX 명세

본 기능은 한컴 워드프로세서의 각주 동작과 동일하게 구현합니다.

1. 본문 각주 마커 hit test → 각주 영역으로 커서 이동

  • 본문 각주 마커를 클릭하면, 페이지 하단 각주 영역 (footnote zone) 내 해당 번호 위치로 커서 이동
  • 한컴의 본문 → 각주 영역 네비게이션 동작 정합

2. 커서 이동 단위에 각주 마커 포함

  • 본문에서 좌우 화살표로 커서를 이동할 때, 각주 마커도 한 개의 이동 단위로 처리
  • 즉 각주 마커를 가로질러 커서가 한 칸 단위로 이동 (현재는 건너뜀)

3. 각주 삭제 — 양방향 + 확인창 (양쪽 동일 UI)

한컴은 본문 각주 마커의 앞/뒤 양쪽에서 키 입력으로 삭제 가능하며, 두 경우 모두 동일한 확인 다이얼로그를 띄웁니다.

3-A. 각주 앞 위치 + Delete 키

  • 본문에서 글자와 글자 사이에 각주가 정의된 경우, 각주 마커 바로 앞에 커서가 있을 때 Delete 누르면
  • "각주를 삭제하시겠습니까?" 확인창 표시
  • 확인 누르면 각주 마커 + 각주 영역의 해당 footnote 모두 제거

3-B. 각주 뒤 위치 + Backspace 키

  • 본문에서 각주 마커 바로 뒤에 커서가 있을 때 Backspace 누르면
  • 3-A 와 동일한 확인창 표시 ("각주를 삭제하시겠습니까?")
  • 확인 누르면 동일하게 각주 마커 + 각주 영역의 해당 footnote 제거

4. 각주 번호 재계산

  • 삭제 후 후속 각주 번호 자동 재정렬

5. Undo/Redo 지원

  • 삭제 후 Ctrl+Z 로 복원 (commands/undo.ts 정합)

현재 결함 (관찰된 동작)

A. 본문 각주 마커 hit test 미구현

  • 본문 영역에서 각주 마커를 클릭해도 hit 으로 인식되지 않음 → 각주 영역으로 커서 이동 동작 자체가 없음
  • (참고: wasm-bridge.ts:673~686hitTestFootnote / hitTestInFootnote 는 각주 영역 zone 내부 처리에 사용 중. 본문 인라인 각주 마커 hit test 는 별도 미구현 영역)

B. 커서가 본문의 각주 마커를 건너뜀

  • 좌우 화살표로 본문 커서 이동 시, 각주 마커가 한 칸 단위로 처리되지 않고 글자와 글자 사이의 각주를 건너뜀
  • 한컴 정합 동작과 불일치 (한컴은 각주 마커 1 char_offset 단위 통과)
  • 본 동작이 정합되어야 "각주 앞/뒤 위치에서 Delete/Backspace" 라는 한컴 정합 삭제 UX 의 전제 조건이 성립

현재 구현 상태

구현됨

  • 각주 삽입: rhwp-studio/src/command/commands/insert.ts:94 (insert:footnote 명령) → WasmBridge.insertFootnote() (rhwp-studio/src/core/wasm-bridge.ts:636)
  • 각주 영역 (zone) 내부 hit test / 커서 처리: hitTestFootnote / hitTestInFootnote / getCursorRectInFootnote (wasm-bridge.ts:673~686) — 각주 영역 안쪽 동작
  • 각주 페이지 정보 조회: getPageFootnoteInfo (wasm-bridge.ts:666)

미구현

  • 본문 각주 마커 hit test (위 결함 A) — hit 시 각주 영역으로 커서 이동
  • 본문 커서 이동 단위에 각주 마커 포함 (위 결함 B)
  • Delete 처리 분기 — 각주 마커 바로 앞 위치에서 Delete 키 → 확인창 → 각주 삭제
  • Backspace 처리 분기 — 각주 마커 바로 뒤 위치에서 Backspace 키 → 확인창 → 각주 삭제 (Delete 와 동일 UI)
  • 삭제 확인 다이얼로그 — "각주를 삭제하시겠습니까?" UI (rhwp-studio/src/dialog/ 정합 패턴, 양방향 호출 시 동일 컴포넌트)
  • WASM 측 각주 삭제 API (예: WasmBridge.deleteFootnote(sec, para, controlIdx) — Document IR 에서 footnote control 제거 + 본문 inline 마커 제거 + 후속 번호 재계산)

작업 범위

영역 변경
WASM (src/) (1) 본문 각주 마커 hit test API 추가 — hit 시 각주 영역 내 해당 번호 좌표 반환 (2) delete_footnote API 추가 — Document IR control 제거 + 본문 텍스트 동기화 + 후속 각주 번호 재계산
WasmBridge (rhwp-studio/src/core/wasm-bridge.ts) 본문 각주 마커 hit test 메서드 + deleteFootnote(sec, para, controlIdx) 메서드 추가
커서 이동 (rhwp-studio/src/engine/cursor.ts) 좌우 이동 시 각주 마커를 한 개 이동 단위로 처리 (현재 건너뜀 → 정합 처리)
마우스 처리 (engine/input-handler-mouse.ts) 본문 각주 마커 클릭 시 hit 분기 → 각주 영역 내 해당 번호 위치로 커서 이동 (getCursorRectInFootnote 재사용 가능)
입력 처리 (engine/input-handler-keyboard.ts) (1) Delete 처리에 "직후 char 가 각주 마커" 분기 추가 → 확인창 → delete:footnote (2) Backspace 처리에 "직전 char 가 각주 마커" 분기 추가 → 확인창 → delete:footnote (Delete 와 동일 컴포넌트 호출)
다이얼로그 (rhwp-studio/src/dialog/) "각주를 삭제하시겠습니까?" 확인 다이얼로그 신규 추가 — 단일 컴포넌트, 양방향 호출 정합
명령 (rhwp-studio/src/command/commands/) delete:footnote 신규 명령 + Undo 통합

검증

  • 단위 테스트: 각주 삽입 → 삭제 라운드트립 (cargo test)
  • e2e 테스트 (rhwp-studio/e2e/):
    • 각주 삽입 → 본문 각주 마커 클릭 → 페이지 하단 각주 영역 해당 번호로 커서 이동
    • 좌우 화살표로 각주 마커 가로질러 이동 (한 칸 단위, 건너뛰지 않음)
    • 각주 앞 커서 위치에서 Delete → 확인창 표시 → 확인 → 각주 삭제 + 페이지 재렌더링
    • 각주 뒤 커서 위치에서 Backspace → 동일 확인창 표시 → 확인 → 각주 삭제
    • 확인창에서 취소 누르면 삭제되지 않음 (양방향 모두 검증)
    • Ctrl+Z → 각주 복원
  • 시각 판정 (★ 게이트): 각주 영역 후속 번호 재정렬 정합 (한컴 비교) + 확인창 UI 가 Delete/Backspace 양쪽에서 동일하게 보이는지 검증

사용자 출처

크롬 확장 (Chrome Web Store) 별점 리뷰에서의 사용자 요청. 각주 작성 후 잘못 삽입한 각주를 제거할 수 없는 점이 워크플로우 차단 요인으로 지적됨.

마일스톤

M100 (v1.0.0) — v1.0.0 진입 전 해결.

컨트리뷰터 안내

본 이슈는 외부 컨트리뷰터의 PR 을 환영합니다. 작업 시작 전 댓글로 의향 알려주시면 메인테이너가 assignee 지정 + base 동기화 (devel 기준) 안내드립니다.

진행 시 참고

  • 한컴 (한컴오피스 2010 / 2022) 의 본문 각주 마커 hit test + 커서 이동 + 삭제 동작이 본 이슈의 권위 기준입니다. 한컴 환경 미보유 시 작업지시자에게 시각 판정 요청.
  • 본 이슈는 (1) hit test (2) 커서 이동 단위 (3) Delete/Backspace 삭제 + 확인창 — 3 영역의 통합 작업입니다. 한 PR 에 묶을 수도, 여러 단계로 분리할 수도 있습니다 (단계 분리 시 (1)+(2) → (3) 순서 권장).
  • 확인 다이얼로그는 단일 컴포넌트로 구현하여 Delete/Backspace 양쪽에서 동일하게 호출해야 합니다. 두 분기 별로 다른 다이얼로그 인스턴스를 만들지 않습니다.
  • WASM 측 delete_footnote 구현은 src/ 의 footnote 관련 모듈 검색 권장 (insert 측과 동일 영역)
  • rhwp-studio 측은 commands/insert.ts:94~115insert:footnote 패턴 참고
  • 본문 → 각주 영역 커서 이동은 기존 getCursorRectInFootnote (wasm-bridge.ts:683) 재사용 가능
  • 확인 다이얼로그는 본 환경의 기존 dialog 패턴 (rhwp-studio/src/dialog/) 정합 권장
  • 본 프로젝트 워크플로우는 CLAUDE.md 참조 (이슈 → 브랜치 → 계획서 → 단계별 보고서)

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions