배경
크롬 확장 사용자들의 별점 리뷰에서 각주 삭제 기능 요청이 다수 접수되었습니다.
현재 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~686 의 hitTestFootnote / 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~115 의 insert:footnote 패턴 참고
- 본문 → 각주 영역 커서 이동은 기존
getCursorRectInFootnote (wasm-bridge.ts:683) 재사용 가능
- 확인 다이얼로그는 본 환경의 기존 dialog 패턴 (
rhwp-studio/src/dialog/) 정합 권장
- 본 프로젝트 워크플로우는 CLAUDE.md 참조 (이슈 → 브랜치 → 계획서 → 단계별 보고서)
배경
크롬 확장 사용자들의 별점 리뷰에서 각주 삭제 기능 요청이 다수 접수되었습니다.
현재 rhwp-studio 는 각주 삽입만 구현되어 있고, 삽입된 각주를 편집 영역에서 선택하여 삭제하는 기능이 없습니다.
한컴 정합 UX 명세
본 기능은 한컴 워드프로세서의 각주 동작과 동일하게 구현합니다.
1. 본문 각주 마커 hit test → 각주 영역으로 커서 이동
2. 커서 이동 단위에 각주 마커 포함
3. 각주 삭제 — 양방향 + 확인창 (양쪽 동일 UI)
한컴은 본문 각주 마커의 앞/뒤 양쪽에서 키 입력으로 삭제 가능하며, 두 경우 모두 동일한 확인 다이얼로그를 띄웁니다.
3-A. 각주 앞 위치 + Delete 키
3-B. 각주 뒤 위치 + Backspace 키
4. 각주 번호 재계산
5. Undo/Redo 지원
commands/undo.ts정합)현재 결함 (관찰된 동작)
A. 본문 각주 마커 hit test 미구현
wasm-bridge.ts:673~686의hitTestFootnote/hitTestInFootnote는 각주 영역 zone 내부 처리에 사용 중. 본문 인라인 각주 마커 hit test 는 별도 미구현 영역)B. 커서가 본문의 각주 마커를 건너뜀
현재 구현 상태
구현됨
rhwp-studio/src/command/commands/insert.ts:94(insert:footnote명령) →WasmBridge.insertFootnote()(rhwp-studio/src/core/wasm-bridge.ts:636)hitTestFootnote/hitTestInFootnote/getCursorRectInFootnote(wasm-bridge.ts:673~686) — 각주 영역 안쪽 동작getPageFootnoteInfo(wasm-bridge.ts:666)미구현
rhwp-studio/src/dialog/정합 패턴, 양방향 호출 시 동일 컴포넌트)WasmBridge.deleteFootnote(sec, para, controlIdx)— Document IR 에서 footnote control 제거 + 본문 inline 마커 제거 + 후속 번호 재계산)작업 범위
src/)delete_footnoteAPI 추가 — Document IR control 제거 + 본문 텍스트 동기화 + 후속 각주 번호 재계산rhwp-studio/src/core/wasm-bridge.ts)deleteFootnote(sec, para, controlIdx)메서드 추가rhwp-studio/src/engine/cursor.ts)engine/input-handler-mouse.ts)getCursorRectInFootnote재사용 가능)engine/input-handler-keyboard.ts)delete:footnote(2) Backspace 처리에 "직전 char 가 각주 마커" 분기 추가 → 확인창 →delete:footnote(Delete 와 동일 컴포넌트 호출)rhwp-studio/src/dialog/)rhwp-studio/src/command/commands/)delete:footnote신규 명령 + Undo 통합검증
rhwp-studio/e2e/):사용자 출처
크롬 확장 (Chrome Web Store) 별점 리뷰에서의 사용자 요청. 각주 작성 후 잘못 삽입한 각주를 제거할 수 없는 점이 워크플로우 차단 요인으로 지적됨.
마일스톤
M100 (v1.0.0) — v1.0.0 진입 전 해결.
컨트리뷰터 안내
본 이슈는 외부 컨트리뷰터의 PR 을 환영합니다. 작업 시작 전 댓글로 의향 알려주시면 메인테이너가 assignee 지정 + base 동기화 (
devel기준) 안내드립니다.진행 시 참고
delete_footnote구현은src/의 footnote 관련 모듈 검색 권장 (insert 측과 동일 영역)commands/insert.ts:94~115의insert:footnote패턴 참고getCursorRectInFootnote(wasm-bridge.ts:683) 재사용 가능rhwp-studio/src/dialog/) 정합 권장