This document explains how to design and implement Extensions in BaroCSS Editor step by step.
This document explains how @barocss/model transactions integrate with DataStore's lock system and transactional overlay.
When a model transaction is executed via transaction(editor, ops).commit(), it orchestrates DataStore's lock and overlay systems to ensure atomic, concurrent-safe operations.
์ด ๋ฌธ์๋ Editor์ Model๊ณผ DOM ๊ฐ Selection ๋๊ธฐํ๋ฅผ ์ํ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ค๋ช ํฉ๋๋ค. ํนํ ํ ์คํธ ๋ ธ๋ ๋ถํ , offset ๋งคํ, selection ๋ณํ ์๊ณ ๋ฆฌ์ฆ์ ๋ค๋ฃน๋๋ค.
RangeOperations.replaceText() ๋ฉ์๋๋ ํ
์คํธ ๋ฒ์๋ฅผ ๊ต์ฒดํ ๋ ํด๋น ๋
ธ๋์ ๋ชจ๋ marks๋ฅผ ์๋์ผ๋ก ์กฐ์ ํฉ๋๋ค. ์ด ๋ฌธ์๋ ํ
์คํธ ๊ต์ฒด ์์
์ด marks์ ๋ฏธ์น๋ ์ํฅ์ ์์ธํ ์ค๋ช
ํฉ๋๋ค.
๋ณธ ๋ฌธ์๋ @barocss/editor-view-dom ํจํค์ง์ ๊ธฐ์ ์คํ์ด๋ค. ๊ตฌํ๊ณผ ํ
์คํธ๋ ๋ณธ ๋ฌธ์๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋ค.
๋ณธ ๋ฌธ์๋ @barocss/renderer-dom ํจํค์ง์ ๊ธฐ์ ์คํ์ด๋ค. ๊ตฌํ๊ณผ ํ
์คํธ๋ ๋ณธ ๋ฌธ์๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋ค.
| ๋จ๊ณ | Render Phase (renderFiberNode) |
Commit Phase (commitFiberNode) |
๊ฒฐ๊ณผ |
|---|---|---|---|
| DOM ์ค๋น | Fiber ํธ๋ฆฌ๋ฅผ ์ํํ๋ฉฐ Text/Host DOM ์์ฑ๋ง ์ํ (๋ถ๋ชจ์ ์ฝ์ ํ์ง ์์) | effectTag(PLACEMENT/UPDATE/DELETION)์ ๋ฐ๋ผ ์ค์ DOM ์ฝ์ /์ฌ๋ฐฐ์น/์ ๊ฑฐ | React completeWork + commitMutationEffects์ ๋์ผ |
| ์์ ๊ฒฐ์ | Fiber child/sibling ๋งํฌ๋ง ๊ตฌ์ฑ | getHostSibling์ผ๋ก ๋ค์ ํ์ DOM ์ฐพ์ ๋ค insertBefore |
DOM ์์ ์์ |
| ์์ฑ/์คํ์ผ | ์ค์ ํ์ง ์์ | dom.updateAttributes / dom.updateStyles๊ฐ diff๋ฅผ ๊ณ์ฐํด Insert/Update/Delete ์ํ |
React commitUpdate์ ๋์ผ |
| ํ ์คํธ | Text node ์์ฑ๋ง | handleVNodeTextProperty๊ฐ ์ต์ข
ํ
์คํธ ์ปค๋ฐ |
Text-only VNode ์ฒ๋ฆฌ |
ContentEditable ๊ธฐ๋ฐ ์๋ํฐ์ ์ด์ค ๋ชจ๋ ๋ ๋๋ง ์ ๋ต: View ๋ชจ๋์ Edit ๋ชจ๋์ ํ์ด๋ธ๋ฆฌ๋ Per-Character Rendering
๋ณธ ๋ ผ๋ฌธ์ ContentEditable ๊ธฐ๋ฐ ์๋ํฐ์์ View ๋ชจ๋์ Edit ๋ชจ๋๋ฅผ ๋ถ๋ฆฌํ์ฌ ๊ด๋ฆฌํ๋ ์ด์ค ๋ชจ๋ ๋ ๋๋ง ์ ๋ต์ ์ ์ํฉ๋๋ค. ๋ชจ๋ ๊ฒฐ์ ์ Model Range๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ํ๋๋ฉฐ, ์ด๋ ๋ ๋๋ง๋ DOM ์ํ์ ๋ฌด๊ดํ๊ฒ ํ์ฌ inline-text๊ฐ View ๋ชจ๋์ธ์ง Edit ๋ชจ๋์ธ์ง๋ฅผ ๊ฒฐ์ ํ ์ ์๊ฒ ํฉ๋๋ค. ๋ํ ๋ ๋๋ง ์ดํ DOM์์ ์์ ๋กญ๊ฒ ์ปค์๋ฅผ ์ฎ๊ฒจ๋ Model Range๊ฐ ๋์ผํ๋ฉด ๋ชจ๋ธ์ ๋์ผํ๊ฒ ์ ์ง๋ฉ๋๋ค. Edit ๋ชจ๋์์๋ ์ปค์๊ฐ ์์นํ inline-text๋ฅผ ๋ฌธ์ ๋จ์๋ก ๋ถ๋ฆฌํ์ฌ ๋ ๋๋งํจ์ผ๋ก์จ, mark์ decorator๊ฐ ์ค์๊ฐ์ผ๋ก ์ถ๊ฐ๋์ด๋ ํ ์คํธ ์ ๋ ฅ์ด ๊นจ์ง์ง ์๋๋ก ๋ณด์ฅํฉ๋๋ค. View ๋ชจ๋์์๋ ๊ธฐ์กด์ run ๋จ์ ๋ ๋๋ง์ ์ ์งํ์ฌ ์ฑ๋ฅ์ ์ต์ ํํฉ๋๋ค. MutationObserver ๊ธฐ๋ฐ ๋ถ๋ถ ์ ๋ฐ์ดํธ์ ๋ ๋๋ง ์ ์ด ์ ๋ต์ ํตํด ๋ธ๋ผ์ฐ์ /๋ชจ๋ฐ์ผ ํ๊ฒฝ ์ฐจ์ด์ ๋ ๋ฆฝ์ ์ผ๋ก ๋์ํ๋ฉฐ, IME ์ ๋ ฅ๊ณผ ์๋ฒฝํ๊ฒ ํธํ๋ฉ๋๋ค. ๋ํ MutationObserver๊ฐ ์ฌ์ฉ์ ์ ๋ ฅ(selection ๋์)์๋ง ๋ฐ์ํ๊ณ ์ธ๋ถ ๋ชจ๋ธ ์ ๋ฐ์ดํธ๋ก ์ธํ DOM ๋ณ๊ฒฝ์ ๋ฌด์ํ์ฌ ๋ฌดํ ๋ฃจํ๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
ํต์ฌ ๋น์ : ๋ณธ ๋ ผ๋ฌธ์์ ์ ์ํ๋ ์ ๋ต์ ์์ ํ AI ๊ธฐ๋ฐ ์๋ํฐ์ ๊ธฐ๋ฐ์ ์ ๊ณตํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ํ ์คํธ๋ฅผ ์ ๋ ฅํ๋ ๋์ AI๊ฐ ์ค์๊ฐ์ผ๋ก mark์ decorator๋ฅผ ์ ์ฉํ๊ฑฐ๋, ์๋ ์์ฑ, ๋ฌธ๋ฒ ๊ต์ , ์คํ์ผ ์ ์ ๋ฑ์ ๊ธฐ๋ฅ์ ์ํํด๋ ์ด๋ค ํธ์ง ์์ ์ค์์๋ ๋ ๋๋ง์ด ๊นจ์ง์ง ์๊ณ , ๊ธ์ ์ ๋ ฅ๋ ์ค๋จ๋์ง ์๋ ์์ ํ ์๋ํฐ ๊ฒฝํ์ ๊ตฌํํ ์ ์์ต๋๋ค.
Keywords: ContentEditable, Text Editor, Rendering Strategy, Selection Preservation, IME Compatibility, AI-Powered E
ContentEditable ๊ธฐ๋ฐ ๋ฆฌ์น ํ ์คํธ ์๋ํฐ์์ ์ฌ์ฉ์ ์ ๋ ฅ ์ค ๋ฐ์ํ๋ DOM ์ ๋ฐ์ดํธ๋ ๋ธ๋ผ์ฐ์ ์ Selection ๊ฐ์ฒด๋ฅผ ๋ถ์์ ํ๊ฒ ๋ง๋ ๋ค. ๋ณธ ๋ ผ๋ฌธ์์๋ sid(System ID) ๊ธฐ๋ฐ Text Node Pool ๊ฐ๋ ์ ๋์ ํ์ฌ Selection์ด ์ฐธ์กฐํ๋ Text Node๋ฅผ ๋ณด์กดํจ์ผ๋ก์จ ํธ์ง ์ค Selection์ด ๊นจ์ง๋ ๋ฌธ์ ๋ฅผ ๊ทผ๋ณธ์ ์ผ๋ก ํด๊ฒฐํ๋ ๊ธฐ๋ฒ์ ์ ์ํ๋ค.
์ด ๊ธฐ๋ฒ์ DOM ๋ณํ/๋ณต์(Model Position โ DOM Position)๊ณผ๋ ๋ณ๊ฐ๋ก, ํธ์ง ์ค Reconciler๊ฐ DOM์ ์ ๋ฐ์ดํธํ ๋ sid ๊ธฐ์ค์ผ๋ก Text Node Pool์ ๊ด๋ฆฌํ์ฌ Selection์ด ์๋ Text Node๋ฅผ ์ ํํ๊ณ ๋น ๋ฅด๊ฒ ์ฌ์ฌ์ฉํ๋ค. sid๋ ๋ชจ๋ธ์ ๊ณ ์ ์๋ณ์์ด๋ฏ๋ก, ๊ฐ์ sid๋ฅผ ๊ฐ์ง Text Node๋ ๊ฐ์ ๋ชจ๋ธ ๋ ธ๋๋ฅผ ๋ํ๋ด๋ฉฐ, ์ด๋ฅผ ํตํด O(n * m)์์ O(n)์ผ๋ก ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ ํ๋ค. Mark/Decorator ๊ตฌ์กฐ ๋ณ๊ฒฝ ์์๋ ์ค์ Text Node๋ ๋ณด์กดํ์ฌ ๋ธ๋ผ์ฐ์ Selection์ ์์ ์ฑ์ ๋ณด์ฅํ๋ค.
Keywords: ContentEditable, Selection Preservation, Text Node Pool, sid-based Pool, Virtual DOM Reconciliation, Rich Text Editor, Real-time Editing