상태와 텍스트
구조와 상호작용 상태는 서로 다른 사실을 소유합니다. 현재 위치 이동과 선택 변경은 각각의 규칙으로 처리하고, 가지를 펼칠 때도 원래 계층을 유지합니다.
현재 위치
현재 위치는 논리 식별자 하나 또는 비어 있는 값입니다.
text
Cursor<ID> = ID | none항목이 바뀌면 기존 식별자를 우선 유지하고, 해당 항목이 사라지면 미리 정한 대체 위치를 고릅니다. 선택은 선택 상태가, 운영체제 포커스는 실행 환경이 맡습니다.
선택
선택은 고른 식별자의 유한한 집합과 필요할 때 사용하는 기준점을 소유합니다.
text
Selection<ID> = {
selected: Set<ID>
anchor: ID | none
}하나만 고르는 경우 선택 수는 0 또는 1입니다. 여러 개를 고를 때는 현재 항목 안에서만 선택할 수 있습니다. 기준점은 연속 범위 선택의 시작을 정합니다. 현재 위치 이동에 따라 선택도 바꿀지는 컴포넌트가 명시적으로 고르는 규칙입니다.
펼침
펼침은 계층에서 열린 가지 식별자의 집합입니다.
text
Expansion<Tree> = Set<branchID>
visible(Tree, Expansion) → Sequence<ID>사라진 식별자와 마지막 항목을 정리한 뒤, 전체 계층의 순서를 유지한 화면용 항목을 한 번씩 돌려줍니다.
텍스트
텍스트는 올바른 UTF-16 문자열, 코드 단위 위치, 선택 방향, 치환 규칙과 한글 조합 입력의 기준 상태를 함께 다룹니다.
text
replace(text, start, end, inserted)
length(result)
= length(text) - (end - start) + length(inserted)조합 입력 중에는 시작 전 문자열과 바꿀 범위를 보존합니다. 입력기가 새 조합 문자열을 보낼 때마다 같은 기준 범위를 교체해 글자 수를 정확히 유지합니다. 확정하면 조합 결과를 채택하고, 취소하면 시작 전 상태로 돌아갑니다.
유니코드 정규화, 단어 나누기, 글자 단위 이동, 맞춤법 검사, 클립보드와 화면상의 입력 위치 계산은 실행 환경이나 별도 기능이 명시적으로 맡습니다.
