수식 신규 입력: insertEquation WASM API + 입력 메뉴 항목#739
Conversation
- Rust: insert_equation_native() 추가 (object_ops.rs) - 캐럿 위치에 Control::Equation 삽입 - char_offsets 8바이트 갭 + 리플로우 + 재조판 - WASM: insertEquation(sec, para, charOffset, script, fontSize, color) 바인딩 - TS: wasm-bridge.ts insertEquation() 메서드 추가 - TS: insert:equation 명령 (insert.ts) — 빈 수식 삽입 후 편집 대화상자 자동 진입 - HTML: 입력 메뉴에 "수식 (Ctrl+N,M)" 항목 추가 Closes edwardkim#731
There was a problem hiding this comment.
Pull request overview
본문 캐럿 위치에 새 수식(Equation) 컨트롤을 삽입하고, rhwp-studio의 입력 > 수식 메뉴에서 해당 기능을 호출해 수식 편집 대화상자를 자동으로 여는 기능을 추가합니다. (Issue #731)
Changes:
- Rust: WASM API
insertEquation(...)및 native 삽입 로직insert_equation_native(...)추가 - TypeScript:
WasmBridge.insertEquation()추가 및insert:equation커맨드로 삽입 후EquationEditorDialog자동 오픈 - UI: 입력 메뉴에 “수식 (Ctrl+N,M)” 항목 추가
Reviewed changes
Copilot reviewed 5 out of 5 changed files in this pull request and generated 6 comments.
Show a summary per file
| File | Description |
|---|---|
src/wasm_api.rs |
WASM 바인딩 insertEquation 엔트리포인트 추가 |
src/document_core/commands/object_ops.rs |
커서 위치에 Control::Equation 삽입하는 native 커맨드 구현 |
rhwp-studio/src/core/wasm-bridge.ts |
프론트에서 insertEquation() 호출 래퍼 추가 |
rhwp-studio/src/command/commands/insert.ts |
insert:equation 커맨드 추가(삽입 후 편집 다이얼로그 오픈) |
rhwp-studio/index.html |
입력 메뉴에 “수식” 항목 추가 |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| execute(services) { | ||
| const ih = services.getInputHandler(); | ||
| if (!ih) return; | ||
| const pos = ih.getPosition(); | ||
| try { | ||
| const defaultFontSize = 1000; // 10pt → HWPUNIT | ||
| const defaultColor = 0x00000000; // 검정 | ||
| const result = services.wasm.insertEquation( | ||
| pos.sectionIndex, pos.paragraphIndex, pos.charOffset, | ||
| '', defaultFontSize, defaultColor | ||
| ); |
| /// 수식을 삽입한다. | ||
| #[wasm_bindgen(js_name = insertEquation)] | ||
| pub fn insert_equation( | ||
| &mut self, | ||
| section_idx: u32, | ||
| para_idx: u32, | ||
| char_offset: u32, | ||
| script: &str, | ||
| font_size: u32, | ||
| color: u32, | ||
| ) -> Result<String, JsValue> { |
| pub fn insert_equation_native( | ||
| &mut self, | ||
| section_idx: usize, | ||
| para_idx: usize, | ||
| char_offset: usize, | ||
| script: &str, | ||
| font_size: u32, | ||
| color: u32, | ||
| ) -> Result<String, HwpError> { |
| let equation = Equation { | ||
| common: CommonObjAttr { | ||
| ctrl_id: 0x65716564, // 'eqed' | ||
| treat_as_char: true, | ||
| width: 0, | ||
| height: 0, | ||
| ..Default::default() | ||
| }, | ||
| script: script.to_string(), | ||
| font_size, | ||
| color, | ||
| font_name: "HYhwpEQ".to_string(), | ||
| ..Default::default() | ||
| }; |
| paragraph.char_count += 8; | ||
| paragraph.has_para_text = true; | ||
|
|
| common: CommonObjAttr { | ||
| ctrl_id: 0x65716564, // 'eqed' | ||
| treat_as_char: true, | ||
| width: 0, |
본 환경 EditorContext (rhwp-studio/src/command/types.ts) 영역 영역 영역 `inTable` 속성 정의 영역 영역 — PR #739 영역 영역 의 `inTableCellEditing` 속성 영역 영역 부재 영역 영역 tsc 에러 (TS2339). 본 환경 영역 영역 정합 영역 영역 `inTable` 영역 영역 대체 — execute 내부 영역 영역 cellIndex 가드 영역 영역 이중 보장 보존.
PR #739 (@oksure) 옵션 A 처리 — 2 commits cherry-pick + 자기 정정 + no-ff merge. 본질 정정 (5 files, +152/-0): - src/document_core/commands/object_ops.rs (+94): insert_equation_native() — insertFootnote 패턴 정합 (controls.insert + char_offsets gap 8 + reflow + paginate). treat_as_char: true (한컴 수식 영역 영역 항상 TAC, project_equation_always_tac 정합) - src/wasm_api.rs (+22): WASM 바인딩 insertEquation(sec, para, charOffset, script, fontSize, color) - rhwp-studio/src/core/wasm-bridge.ts (+5): TypeScript 바인딩 insertEquation() - rhwp-studio/src/command/commands/insert.ts (+30): 'insert:equation' 커맨드 — 빈 수식 삽입 후 EquationEditorDialog 자동 진입 + 표 셀 내부 실행 차단 (이중 가드) - rhwp-studio/index.html (+1): 입력 메뉴 영역 영역 "수식 (Ctrl+N,M)" 항목 Copilot 리뷰 반영 (commit `e93f60dc`): 셀 내부 실행 차단 + CTRL_EQUATION 상수 사용 + control_mask |= 1<<11 비트 설정. 본 환경 자기 정정 (commit `76f9ade6`): EditorContext.inTableCellEditing 영역 영역 부재 영역 영역 본 환경 영역 영역 정의 영역 영역 inTable 영역 영역 대체 (tsc 에러 정정). 인프라 재사용: - insertFootnote 패턴 (object_ops.rs) - EquationEditorDialog (PR #738 closes #144) - Control::Equation IR + 기존 API (renderEquationPreview / getEquationProperties / setEquationProperties) 자기 검증: - cherry-pick 충돌 0건 - cargo build/test --release ✅ ALL GREEN - tsc --noEmit ✅ 통과 (자기 정정 후) - 광범위 sweep 7 fixture / 170 페이지 / 회귀 0 ✅ - WASM 빌드 4.65 MB (cargo clean wasm target 후 강제 재빌드 — insertEquation API 노출 정합) 작업지시자 웹 검증: - 메뉴 클릭 경로: 본문 캐럿 위치 영역 빈 수식 삽입 + 대화상자 자동 진입 ✅ 정합 동작 - 두 별 결함 발견 (PR #739 본질 영역 영역 무관, 후속 별 PR 영역 영역 정정): · Issue #766 — 수식 객체 backspace 삭제 시 "지정된 컨트롤이 Shape이 아닙니다" 오류 (input-handler-keyboard.ts 영역 picture-object selection ref dispatch 영역 영역 Equation 분기 부재) · Issue #767 — Ctrl+N+M 단축키 영역 chordMapN 영역 'm' 매핑 부재 → 브라우저 새 창 발생 (input-handler-keyboard.ts:chordMapN 영역 영역 등록 부재) 처리 결정 (feedback_pr_supersede_chain (c) 패턴 정합): - PR #739 머지 유지 (insertEquation API + 메뉴 항목 + 대화상자 자동 진입 본질 보존) - Issue #766/#767 영역 별 후속 PR 영역 영역 통합 처리 closes #731 관련 후속: Issue #766 / Issue #767
…속 명시 - mydocs/pr/archives/pr_739_review.md: 검토 문서 archives 이동 - mydocs/pr/archives/pr_739_report.md: 처리 보고서 작성 · 수식 신규 입력 (insertEquation WASM API + 메뉴 항목 + EquationEditorDialog 자동 진입, Issue #731 closes) · 본 환경 자기 정정 (`inTableCellEditing` → `inTable`, tsc TS2339 정정) · 작업지시자 웹 검증 ✅ 메뉴 클릭 경로 정합 + 두 별 결함 발견 · WASM 빌드 caching 한계 학습 (강제 재빌드 영역 영역 insertEquation API 노출 정합) · feedback_pr_supersede_chain (c) 패턴 — Issue #766/#767 영역 별 후속 PR 영역 영역 통합 처리 - mydocs/orders/20260510.md: PR #739 항목 추가 (5/10 사이클 영역 영역 12건 처리) 후속 OPEN 이슈: - Issue #766 — 수식 객체 backspace 삭제 시 "지정된 컨트롤이 Shape이 아닙니다" 오류 - Issue #767 — Ctrl+N+M 단축키 영역 chordMapN 'm' 매핑 부재 → 브라우저 새 창 발생
|
@oksure 님, 검토 + 머지 완료했습니다. 처리 결과옵션 A (2 commits cherry-pick + 자기 정정 + no-ff merge `d0a75656`) 로 처리. 본 환경 자기 정정 (commit `76f9ade6`)PR 영역 영역 `EditorContext.inTableCellEditing` 속성 영역 영역 본 환경 영역 영역 부재 영역 영역 (현재 정의 영역 영역 `inTable`) → 본 환경 정합 영역 영역 `inTable` 영역 영역 대체. tsc TS2339 에러 정정. execute 내부 영역 영역 cellIndex 가드 영역 영역 이중 보장 보존. 자기 검증
작업지시자 웹 검증 ✅ 메뉴 클릭 경로 통과dev server 영역 영역 입력 → 수식 메뉴 클릭 영역 영역 본문 캐럿 위치 영역 영역 빈 수식 삽입 + EquationEditorDialog 자동 진입 ✅ 정합 동작. 두 별 결함 발견 → 별 후속 PR 영역 영역 처리 ((c) 패턴)PR #739 본질 (insertEquation API + 메뉴 항목 + 대화상자 자동 진입) 영역 영역 무관 영역 영역 두 별 결함 영역 발견 영역 영역 별 PR 영역 영역 후속 정정 영역 영역: Issue #766 — 수식 객체 backspace 삭제 시 "지정된 컨트롤이 Shape이 아닙니다" 오류
Issue #767 — Ctrl+N+M 단축키 영역 chordMapN 영역 'm' 매핑 부재 → 브라우저 새 창 발생
`feedback_pr_supersede_chain` (c) 패턴 정합 — PR #723 → PR #732 동일 패턴 (머지 + 별 후속 PR 영역 영역 정정 통합). 본질 정합
처리 보고서: `mydocs/pr/archives/pr_739_report.md`. @oksure 님 20+ 사이클 컨트리뷰션 영역 — 5/10 사이클 영역 영역 PR #720/#723/#725/#728/#729/#730/#732/#734/#735/#737/#738/#739 영역 12건 처리 완료 영역. |
… 오류 수정 PR #739 (수식 신규 입력) 후속 발견 결함 2건 정정 + 본 환경 자기 정정 4건 (Chrome reserved shortcut 회피 + IME 합성 중 chord 활성화). 본 PR cherry-pick (2 commits): - 4a8772b: Issue #767 (Ctrl+N,M 단축키 매핑) + Issue #766 (수식 객체 삭제 오류) 정정 - a86668e: Copilot 리뷰 — reflow_paragraph_line_segs Equation 높이 반영 본 환경 자기 정정 commits (4건): - 7bc2dc0: setupGlobalShortcuts Ctrl+N chord 시작 보강 시도 (Chrome reserved shortcut 영역 영역 효과 없음) - fb1a22c: 7bc2dc0 revert (정합성 회복) - 924ca0f: chord 키 Ctrl+N → Ctrl+M 변경 (작업지시자 결정 — Chrome reserved shortcut 회피) - e906c1b: Ctrl+M chord IME 합성 중 활성화 (한글 IME e.code 판별) 본질 — Chrome / Edge 영역 영역 Ctrl+N (새 창) 영역 영역 OS-level reserved shortcut 영역 영역 JS preventDefault() 차단 불가 영역 영역 chord 키 영역 영역 Ctrl+M 영역 영역 변경. 한글 IME 합성 중 영역 영역 e.key === 'Process' 영역 영역 e.code (KeyM/KeyN/KeyS/KeyF/KeyK) 판별 영역 영역 chord 활성화. 정정 영역: - input-handler-keyboard.ts: chordMapN → chordMapM, _pendingChordN → _pendingChordM, chord 1/2번째 키 영역 영역 Ctrl+M + IME 합성 중 e.code 판별 - shortcutLabel: Ctrl+N,? → Ctrl+M,? (insert/table/edit/page) - delete_equation_control_native + WASM export deleteEquationControl 신규 - 키보드 핸들러 4개소 영역 'equation' 분기 추가 검증: - cargo build/test/clippy --release ALL GREEN - tsc --noEmit ✅ - 광범위 sweep 170/170 same - WASM 4.68 MB 재빌드 - 작업지시자 웹 에디터 시각 검증 ✅ 통과 (수식 객체 삭제 + Ctrl+M,M 영문/한글 IME) closes #767 + #766
PR #786 (closes #767+#766) — PR #739 후속 발견 결함 정정 + 본 환경 자기 정정 4 commits (Chrome reserved shortcut 회피 영역 chord 키 Ctrl+N → Ctrl+M 변경 + IME 합성 중 chord 활성화). Merge commit: ea9531d Cherry-pick: 4a8772b + a86668e 자기 정정: 7bc2dc0 (revert 7bc2dc0 → fb1a22c) + 924ca0f (chord Ctrl+N→Ctrl+M) + e906c1b (IME 합성 중 chord) 5/11 사이클 시작 — orders/20260511.md 신규 등록 (5/10 사이클 27 PR 후 첫 PR).
변경 사항
본문 캐럿 위치에 새 수식 객체를 삽입하는 기능을 구현합니다.
Rust (백엔드)
insert_equation_native(): 캐럿 위치에Control::Equation컨트롤 삽입treat_as_char: true(글자처럼 취급)char_offsets8바이트 갭 생성 + 리플로우 + 재조판insertFootnote패턴과 동일한 삽입 로직insertEquation(sec, para, charOffset, script, fontSize, color)TypeScript (프론트엔드)
wasm-bridge.ts:insertEquation()메서드 추가insert.ts:insert:equation명령 — 빈 수식 삽입 후 수식 편집 대화상자 자동 진입index.html: 입력 메뉴에 "수식 (Ctrl+N,M)" 항목 추가기존 인프라 활용
renderEquationPreview,getEquationProperties,setEquationProperties기존 API 보존EquationEditorDialog기존 편집 대화상자 재사용테스트
cargo test: 전체 통과cargo clippy -- -D warnings: 경고 없음npx tsc --noEmit: 에러 없음 (WASM 모듈 제외)Closes #731
감사합니다.