Skip to content

수식 신규 입력: insertEquation WASM API + 입력 메뉴 항목#739

Closed
oksure wants to merge 2 commits into
edwardkim:develfrom
oksure:contrib/insert-equation
Closed

수식 신규 입력: insertEquation WASM API + 입력 메뉴 항목#739
oksure wants to merge 2 commits into
edwardkim:develfrom
oksure:contrib/insert-equation

Conversation

@oksure

@oksure oksure commented May 9, 2026

Copy link
Copy Markdown
Contributor

변경 사항

본문 캐럿 위치에 새 수식 객체를 삽입하는 기능을 구현합니다.

Rust (백엔드)

  • insert_equation_native(): 캐럿 위치에 Control::Equation 컨트롤 삽입
    • treat_as_char: true (글자처럼 취급)
    • char_offsets 8바이트 갭 생성 + 리플로우 + 재조판
    • insertFootnote 패턴과 동일한 삽입 로직
  • WASM 바인딩: 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

감사합니다.

- 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
Copilot AI review requested due to automatic review settings May 9, 2026 11:56

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment on lines +86 to +96
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
);
Comment thread src/wasm_api.rs
Comment on lines +2512 to +2522
/// 수식을 삽입한다.
#[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> {
Comment on lines +3647 to +3655
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> {
Comment on lines +3666 to +3679
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()
};
Comment on lines +3706 to +3708
paragraph.char_count += 8;
paragraph.has_para_text = true;

Comment on lines +3667 to +3670
common: CommonObjAttr {
ctrl_id: 0x65716564, // 'eqed'
treat_as_char: true,
width: 0,
edwardkim added a commit that referenced this pull request May 10, 2026
본 환경 EditorContext (rhwp-studio/src/command/types.ts) 영역 영역 영역 `inTable` 속성 정의 영역 영역 — PR #739 영역 영역 의 `inTableCellEditing` 속성 영역 영역 부재 영역 영역 tsc 에러 (TS2339).

본 환경 영역 영역 정합 영역 영역 `inTable` 영역 영역 대체 — execute 내부 영역 영역 cellIndex 가드 영역 영역 이중 보장 보존.
edwardkim added a commit that referenced this pull request May 10, 2026
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
edwardkim added a commit that referenced this pull request May 10, 2026
…속 명시

- 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' 매핑 부재 → 브라우저 새 창 발생
@edwardkim

Copy link
Copy Markdown
Owner

@oksure 님, 검토 + 머지 완료했습니다.

처리 결과

옵션 A (2 commits cherry-pick + 자기 정정 + no-ff merge `d0a75656`) 로 처리.

본 환경 자기 정정 (commit `76f9ade6`)

PR 영역 영역 `EditorContext.inTableCellEditing` 속성 영역 영역 본 환경 영역 영역 부재 영역 영역 (현재 정의 영역 영역 `inTable`) → 본 환경 정합 영역 영역 `inTable` 영역 영역 대체. tsc TS2339 에러 정정. execute 내부 영역 영역 cellIndex 가드 영역 영역 이중 보장 보존.

자기 검증

  • cherry-pick 충돌 0건
  • `cargo build/test --release` ✅ ALL GREEN
  • `tsc --noEmit` ✅ 통과 (자기 정정 후)
  • 광범위 sweep (7 fixture / 170 페이지) ✅ 170 same / 0 diff
  • WASM 빌드 ✅ 4.65 MB (caching 영역 영역 영역 `cargo clean --target wasm32-unknown-unknown` + Docker 강제 재빌드 영역 영역 `insertEquation` API 노출 정합)

작업지시자 웹 검증 ✅ 메뉴 클릭 경로 통과

dev server 영역 영역 입력 → 수식 메뉴 클릭 영역 영역 본문 캐럿 위치 영역 영역 빈 수식 삽입 + EquationEditorDialog 자동 진입 ✅ 정합 동작.

두 별 결함 발견 → 별 후속 PR 영역 영역 처리 ((c) 패턴)

PR #739 본질 (insertEquation API + 메뉴 항목 + 대화상자 자동 진입) 영역 영역 무관 영역 영역 두 별 결함 영역 발견 영역 영역 별 PR 영역 영역 후속 정정 영역 영역:

Issue #766 — 수식 객체 backspace 삭제 시 "지정된 컨트롤이 Shape이 아닙니다" 오류

  • 본질: `input-handler-keyboard.ts` picture-object selection ref dispatch 영역 영역 `ref.type === 'image'` 외 영역 `deleteShapeControl` 호출 → `Control::Equation` 영역 영역 매칭 실패
  • 처리 방향: `delete_equation_control_native` 신규 + WASM API + TS dispatch 분기

Issue #767 — Ctrl+N+M 단축키 영역 chordMapN 영역 'm' 매핑 부재 → 브라우저 새 창 발생

  • 본질: `input-handler-keyboard.ts:chordMapN` 영역 영역 `m: 'insert:equation'` 매핑 부재. PR 영역 영역 `shortcutLabel: 'Ctrl+N,M'` 명시 영역 영역, 코드 영역 영역 미반영
  • 처리 방향: `chordMapN['m'] = 'insert:equation'` + `'ㅡ'` (한글 IME) 추가

`feedback_pr_supersede_chain` (c) 패턴 정합 — PR #723 → PR #732 동일 패턴 (머지 + 별 후속 PR 영역 영역 정정 통합).

본질 정합

  • 인프라 재사용 (insertFootnote 패턴 + EquationEditorDialog) — `feedback_process_must_follow` 정합
  • `project_equation_always_tac` 정합 — `treat_as_char: true`
  • WASM 빌드 caching 한계 학습 — 향후 `src/wasm_api.rs` 변경 시 영역 영역 강제 재빌드 권장

처리 보고서: `mydocs/pr/archives/pr_739_report.md`.

@oksure20+ 사이클 컨트리뷰션 영역 — 5/10 사이클 영역 영역 PR #720/#723/#725/#728/#729/#730/#732/#734/#735/#737/#738/#739 영역 12건 처리 완료 영역.

@edwardkim edwardkim closed this May 10, 2026
edwardkim added a commit that referenced this pull request May 10, 2026
… 오류 수정

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
edwardkim added a commit that referenced this pull request May 10, 2026
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 7bc2dc0fb1a22c) + 924ca0f (chord Ctrl+N→Ctrl+M) + e906c1b (IME 합성 중 chord)

5/11 사이클 시작 — orders/20260511.md 신규 등록 (5/10 사이클 27 PR 후 첫 PR).
@edwardkim edwardkim mentioned this pull request May 10, 2026
4 tasks
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.

3 participants