선택·Range·오프셋

캐럿·선택은 DOM에 있고 Rust 모델은 별도 위치를 씁니다. 인덱스 규약을 하나로 고정하지 않으면 오프바이원·IME 버그가 납니다.

개요

에디터 → 위치·선택JS ↔ WASM 경계와 함께 읽으세요. 여기서는 숫자 오프셋Range 끝점에 초점을 둡니다.

UTF-16 vs UTF-8

JS 문자열은 UTF-16 코드 유닛 인덱스이고, Rust String은 UTF-8 바이트입니다. 이모지·다국어·IME 구간에서 JS의 “문자” 인덱스와 Rust char 경계가 다를 수 있습니다.

  • API마다 UTF-16 오프셋·스칼라 인덱스·Rust 바이트 오프셋 중 무엇을 쓰는지 문서화.
  • range.startOffset을 Rust 문자 인덱스와 동일하다고 가정하지 않기.

JS Selection·Range

WASM에서 히트 테스트를 다시 구현하기보다, JS에서 정규화한 위치(경로·노드 id·플랫 버퍼 오프셋)를 넘기는 편이 일반적입니다.

getTargetRanges

beforeinput과 함께 쓸 때 브라우저가 바꾸려는 범위를 알려줄 수 있습니다. 지원·동작은 환경별로 다릅니다. 시나리오를 참고하세요.

조합 중에는 Range가 잠정적일 수 있어 compositionend 이후 정합이 안전한 경우가 많습니다.

Rust 모델 매핑

블록/인라인 안정 id, 선택만 얇게 직렬화, Rust에 단일 캐논 커서를 두고 DOM에 투영 등 패턴이 있습니다.

모바일·터치

터치 핸들·선택 지연은 데스크톱과 다릅니다. 가능하면 실기기·터치 자동화로 검증하세요.