"디스크의 문자가 에디터의 문자야. 나머지는 전부 그 위에 칠한 레이어야."
두 문서가 아니라 하나의 텍스트
에디터가 문서를 쥐는 방식은 크게 두 가지야. WYSIWYG 에디터는 rich-text 트리를 쥐어. bold 도 노드, 헤딩도 노드고, ** 나 # 같은 문자는 데이터로 아예 존재하지 않아. 트리에서 추론될 뿐이고, export 할 때 마크다운으로 다시 뱉어지지. Rekindle 은 정반대야. 모델이 마크다운 소스 문자열 그 자체거든. 헤딩 앞의 # 는 문서 안 실제 위치에 박혀 있는 진짜 문자야. 텍스트는 하나뿐이고, 그게 곧 소스야.
렌더된 모습은 레이어지 모델 전환이 아냐
그럼 bold 는 어떻게 bold 로 보이는 걸까? decoration 레이어가 소스를 건드리지 않고 그 위에 모습만 칠해줘. **fire** 라는 단어는 별표까지 포함해서 모델 안에 문자 그대로 남아 있어. decoration 이 그걸 bold 로 렌더하고, 커서가 없는 줄에선 별표를 흐리게 하지. 변환되는 것도 없고, 잃는 것도 없고, 소스가 두 번째 표현에 밀려 버려지는 일도 없어.
모델 (디스크와 에디터에 있는 것): The **fire** catches.
decoration 레이어 (저장 아님, 칠하기): The [bold 로 된 fire] catches.
# 모델은 절대 안 변해. 모든 decoration 을 꺼도
# 밑엔 바이트 동일한 마크다운이 그대로 있어.
이 선택이 아래쪽 전부를 결정해
소스를 모델로 삼는 건 겉모습 문제가 아니라 아키텍처를 결정하는 선택이야. 모델이 순수 마크다운 텍스트니까 디스크의 파일이 곧 진실이 되고 (트랙 7), diff 가 진짜 텍스트 diff 가 되고, grep 이 진짜 문자를 찾아내. voice underline 이든 CMD+K 든 모든 soul 기능이 독자 트리의 노드가 아니라 소스 상의 위치를 기준으로 동작하고. 따져야 할 표현이 하나뿐이니까 에디터 전체가 단순해져. WYSIWYG 의 rich-text 트리였다면 네가 보는 것과 저장되는 것과 Pippa 가 읽는 것 사이에 번역 레이어가 끼어들어서, 하나가 아니라 셋을 계속 맞춰줘야 했을 거야.