"디스크의 문자가 에디터의 문자야. 나머지는 전부 그 위에 칠한 레이어야."
두 문서가 아니라 하나의 텍스트
에디터가 문서를 쥐는 방식은 두 가지야. WYSIWYG 에디터는 rich-text 트리를 쥐어. bold 가 노드, 헤딩이 노드, 그리고 ** 나 # 문자는 데이터로 존재하지 않아 — 추론되고, export 할 때만 마크다운으로 다시 뱉어져. Rekindle 은 반대로 해. 그 모델은 마크다운 소스 문자열 그 자체야. 네 헤딩의 # 는 문서 안 실제 offset 에 있는 진짜 문자야. 텍스트는 하나고, 그게 소스야.
렌더된 모습은 레이어지 모델 전환이 아냐
그럼 bold 는 어떻게 bold 로 보여? decoration 레이어가 소스를 안 바꾸고 그 위에 모습을 칠해. **fire** 라는 단어는 모델 안에서 다섯 더하기 넷 문자로 남아. decoration 이 그걸 bold 로 렌더하고 inactive 줄에선 별표를 흐리게 해. 아무것도 변환 안 되고, 아무것도 안 잃고, 소스가 두 번째 표현으로 버려지는 일이 없어.
모델 (디스크와 에디터에 있는 것): The **fire** catches.
decoration 레이어 (저장 아님, 칠하기): The [bold 로 된 fire] catches.
# 모델은 절대 안 변해. 모든 decoration 을 꺼도
# 밑엔 바이트 동일한 마크다운이 그대로 있어.
왜 이게 하류 전부에 중요한가
source-as-model 선택은 화장이 아냐 — 아키텍처를 결정해. 모델이 순수 마크다운 텍스트라서, 디스크의 파일이 진실이고 (트랙 7), diff 가 진짜 텍스트 diff 고, grep 이 진짜 문자를 찾고, 모든 soul 기능 (voice underline, CMD+K) 이 독점 트리의 노드가 아니라 소스로의 offset 위에서 동작해. 추론할 표현이 딱 하나라서 에디터 전체가 단순해져. WYSIWYG 의 rich-text 트리라면 보는 것, 저장하는 것, Pippa 가 읽는 것 사이에 번역 레이어를 강제해 — 하나 대신 셋을 동기화 상태로 유지해야 해.