feat: 쪽 새 번호로 시작 — insertNewNumber WASM API + dialog UI (#791)#809
feat: 쪽 새 번호로 시작 — insertNewNumber WASM API + dialog UI (#791)#809oksure wants to merge 3 commits into
Conversation
- Rust: insert_new_number_native — Control::NewNumber(Page) 삽입 - char_offset 기반 controls 배열 삽입 위치 결정 - char_offsets +8 조정, control_mask 갱신 - reflow + recompose + paginate 후처리 - WASM: insertNewNumber(sec, para, charOffset, startNum) 바인딩 - TypeScript: NewNumberDialog (시작 번호 입력, ModalDialog 패턴) - Command: page:new-page-num stub → 실동작으로 교체 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Implements the “쪽 > 새 번호로 시작” feature end-to-end by adding a Rust-side WASM mutation API to insert a Control::NewNumber(Page, startNum) at the current cursor position, and wiring a Studio command + modal dialog UI to collect the start number and invoke the WASM API.
Changes:
- Added WASM API
insertNewNumber(sec, para, charOffset, startNum)that forwards to a new native core command. - Implemented
DocumentCore::insert_new_number_native(...)to insert theNewNumbercontrol and trigger reflow/recompose/pagination. - Added Studio UI (
NewNumberDialog) and connectedpage:new-page-numcommand +WasmBridge.insertNewNumber().
Reviewed changes
Copilot reviewed 5 out of 5 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
src/wasm_api.rs |
Exposes insertNewNumber to JS/WASM callers. |
src/document_core/commands/object_ops.rs |
Implements native insertion of Control::NewNumber and post-edit layout invalidation. |
rhwp-studio/src/ui/new-number-dialog.ts |
Adds modal dialog UI for choosing the start page number and calling WASM. |
rhwp-studio/src/core/wasm-bridge.ts |
Adds insertNewNumber(...) wrapper on the Studio side. |
rhwp-studio/src/command/commands/page.ts |
Replaces the stub command with real dialog invocation at cursor position. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| para_idx as usize, | ||
| char_offset as usize, | ||
| start_num as u16, | ||
| ) |
| if !paragraph.char_offsets.is_empty() { | ||
| let text_len = paragraph.text.chars().count(); | ||
| let safe_offset = char_offset.min(text_len); | ||
| for co in paragraph.char_offsets[safe_offset..].iter_mut() { | ||
| *co += 8; | ||
| } | ||
| } |
| this.eventBus.emit('document:changed'); | ||
| this.eventBus.emit('recompose:request'); |
| canExecute: (ctx) => ctx.hasDocument, | ||
| execute(services) { | ||
| const ih = services.getInputHandler(); | ||
| if (!ih) return; | ||
| const cursor = (ih as any).cursor; | ||
| if (!cursor) return; | ||
| const pos = cursor.getPosition(); |
| pub fn insert_new_number_native( | ||
| &mut self, | ||
| section_idx: usize, | ||
| para_idx: usize, | ||
| char_offset: usize, |
- wasm_api.rs: start_num 0 또는 >65535 시 에러 반환 (u16 overflow 방지) - new-number-dialog.ts: 'document:changed' → 'document-changed' (프로젝트 표준 이벤트명 사용, 존재하지 않는 'recompose:request' 제거) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
표 셀 내부에서는 body paragraph 전용 insertNewNumber API가 동작하지 않으므로 canExecute에서 차단.
|
Copilot 리뷰 반영 (05f487d): canExecute에 !inTable 가드 추가 (표 셀 내부에서 body 전용 API 호출 차단) |
…dialog UI @oksure — Issue #791 (PR #755 close 후속): page:new-page-num (쪽 > 새 번호로 시작) stub → 실동작 구현. PR #755 의 setNumberingRestart (paragraph numbering) 잘못 매핑 close 후 NewNumber 컨트롤 영역 신규 insertNewNumber API 영역 정확 본질. 본질 (3 commits, 5 files, +174/-1): - Rust: insert_new_number_native (object_ops.rs +63) + insertNewNumber WASM 바인딩 (wasm_api.rs +21) — find_control_text_positions 영역 삽입 인덱스 + char_offsets +8 조정 + control_mask 갱신 + reflow/recompose/paginate 후처리 - TypeScript: NewNumberDialog 신규 (+65) + wasm-bridge.ts 래퍼 (+5) + page.ts 커맨드 교체 (+19/-1) 리뷰 반영 commits: - 05a3f5e: start_num 범위 검증 (1~65535, u16) + 이벤트명 정정 - f285df1: Copilot 리뷰 — !inTable 가드 (표 셀 삽입 금지) PR #745 (Task #634 NewNumber Page 표시) 정합 — typeset.rs 영역 Control::NewNumber 스캔 + new_page_numbers 적재 + 페이지 렌더링 영역 해당 번호부터 표시. 본 환경 충돌 수동 해결 (2 파일): - rhwp-studio/src/command/commands/page.ts: import 양쪽 보존 (ColumnSettingsDialog devel 측 + NewNumberDialog incoming) - rhwp-studio/src/core/wasm-bridge.ts: 두 메서드 모두 보존 (getColumnDef devel 측 + insertNewNumber incoming) 자기 검증: tsc + cargo test/clippy ALL GREEN + 광범위 sweep 7 fixture / 170 페이지 / 회귀 0 (신규 API opt-in 영역 영역 기존 동작 무영향 입증) + WASM 4.5 MB 재빌드 시각 판정: 작업지시자 인터랙션 검증 ✅ 통과
|
@oksure 머지 완료 (commit PR #755 close 후속 영역 NewNumber 컨트롤 신규 리뷰 반영 commits (start_num 범위 검증 + !inTable Copilot 가드) 정합. 본 환경 충돌 2 파일 수동 해결 — page.ts import / wasm-bridge.ts 두 메서드 양쪽 보존. 자기 검증 tsc + cargo test/clippy ALL GREEN + 광범위 sweep 7 fixture / 170 페이지 / 회귀 0 (신규 API opt-in 영역 영역 기존 동작 무영향 입증) + WASM 4.5 MB. 작업지시자 인터랙션 검증 통과 (메뉴 + dialog + 페이지 번호 갱신). 수고하셨습니다. |
…im#810 후속 (5/11 orders 갱신) # Conflicts: # mydocs/orders/20260511.md
… 후속 (5/11 orders 갱신) # Conflicts: # mydocs/orders/20260511.md
변경 내용
page:new-page-num(쪽 > 새 번호로 시작) 커맨드를 stub에서 실동작으로 구현.구현 범위
Rust (WASM API)
insert_new_number_native: 현재 커서 위치에Control::NewNumber(Page, startNum)삽입find_control_text_positions로 삽입 인덱스 결정char_offsets+8 조정 +control_mask갱신reflow_paragraph→recompose_section→paginate_if_needed후처리insertNewNumber(sec, para, charOffset, startNum)TypeScript (Dialog + Command)
NewNumberDialog: ModalDialog 패턴, 시작 번호 입력 (1~65535)wasm-bridge.ts:insertNewNumber메서드 추가page.ts:page:new-page-numstub → NewNumberDialog 호출로 교체연동
PR #745 (Task #634)에서 구현된 NewNumber 페이지 번호 표시 로직과 연동:
typeset.rs가Control::NewNumber를 스캔하여new_page_numbers벡터에 적재테스트
cargo test+cargo clippy -- -D warnings통과tsc --noEmit통과 (WASM 모듈 제외)closes #791
감사합니다.