@moda-editor/core 0.1.2 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (247) hide show
  1. package/dist/collab.d.ts +61 -0
  2. package/dist/collab.d.ts.map +1 -0
  3. package/dist/collab.js +67 -0
  4. package/dist/collab.js.map +1 -0
  5. package/dist/commands.d.ts +11 -0
  6. package/dist/commands.d.ts.map +1 -1
  7. package/dist/commands.js +48 -4
  8. package/dist/commands.js.map +1 -1
  9. package/dist/conformance/editor-base.d.ts +7 -0
  10. package/dist/conformance/editor-base.d.ts.map +1 -0
  11. package/dist/conformance/editor-base.js +280 -0
  12. package/dist/conformance/editor-base.js.map +1 -0
  13. package/dist/conformance/editor-codeblock.d.ts +8 -0
  14. package/dist/conformance/editor-codeblock.d.ts.map +1 -0
  15. package/dist/conformance/editor-codeblock.js +402 -0
  16. package/dist/conformance/editor-codeblock.js.map +1 -0
  17. package/dist/conformance/editor-ime.d.ts +7 -0
  18. package/dist/conformance/editor-ime.d.ts.map +1 -0
  19. package/dist/conformance/editor-ime.js +166 -0
  20. package/dist/conformance/editor-ime.js.map +1 -0
  21. package/dist/conformance/editor-input.d.ts +8 -0
  22. package/dist/conformance/editor-input.d.ts.map +1 -0
  23. package/dist/conformance/editor-input.js +676 -0
  24. package/dist/conformance/editor-input.js.map +1 -0
  25. package/dist/conformance/editor-nodeview.d.ts +7 -0
  26. package/dist/conformance/editor-nodeview.d.ts.map +1 -0
  27. package/dist/conformance/editor-nodeview.js +120 -0
  28. package/dist/conformance/editor-nodeview.js.map +1 -0
  29. package/dist/conformance/editor-overlay.d.ts +8 -0
  30. package/dist/conformance/editor-overlay.d.ts.map +1 -0
  31. package/dist/conformance/editor-overlay.js +323 -0
  32. package/dist/conformance/editor-overlay.js.map +1 -0
  33. package/dist/conformance/fixtures.d.ts +4 -0
  34. package/dist/conformance/fixtures.d.ts.map +1 -0
  35. package/dist/conformance/fixtures.js +15 -0
  36. package/dist/conformance/fixtures.js.map +1 -0
  37. package/dist/conformance/index.d.ts +14 -0
  38. package/dist/conformance/index.d.ts.map +1 -0
  39. package/dist/conformance/index.js +28 -0
  40. package/dist/conformance/index.js.map +1 -0
  41. package/dist/conformance/types.d.ts +51 -0
  42. package/dist/conformance/types.d.ts.map +1 -0
  43. package/dist/conformance/types.js +2 -0
  44. package/dist/conformance/types.js.map +1 -0
  45. package/dist/conformance/widget.d.ts +3 -0
  46. package/dist/conformance/widget.d.ts.map +1 -0
  47. package/dist/conformance/widget.js +49 -0
  48. package/dist/conformance/widget.js.map +1 -0
  49. package/dist/conformance.d.ts +1 -58
  50. package/dist/conformance.d.ts.map +1 -1
  51. package/dist/conformance.js +3 -1608
  52. package/dist/conformance.js.map +1 -1
  53. package/dist/editor/extension.d.ts +51 -5
  54. package/dist/editor/extension.d.ts.map +1 -1
  55. package/dist/features/ace.d.ts +4 -0
  56. package/dist/features/ace.d.ts.map +1 -1
  57. package/dist/features/ace.js +57 -25
  58. package/dist/features/ace.js.map +1 -1
  59. package/dist/features/block-dnd.d.ts +7 -0
  60. package/dist/features/block-dnd.d.ts.map +1 -0
  61. package/dist/features/block-dnd.js +207 -0
  62. package/dist/features/block-dnd.js.map +1 -0
  63. package/dist/features/code-block.d.ts +12 -58
  64. package/dist/features/code-block.d.ts.map +1 -1
  65. package/dist/features/code-block.js +155 -630
  66. package/dist/features/code-block.js.map +1 -1
  67. package/dist/features/code-context.d.ts +81 -0
  68. package/dist/features/code-context.d.ts.map +1 -0
  69. package/dist/features/code-context.js +322 -0
  70. package/dist/features/code-context.js.map +1 -0
  71. package/dist/features/code-edit.d.ts +50 -0
  72. package/dist/features/code-edit.d.ts.map +1 -0
  73. package/dist/features/code-edit.js +412 -0
  74. package/dist/features/code-edit.js.map +1 -0
  75. package/dist/features/code-format.d.ts +21 -0
  76. package/dist/features/code-format.d.ts.map +1 -0
  77. package/dist/features/code-format.js +410 -0
  78. package/dist/features/code-format.js.map +1 -0
  79. package/dist/features/doc.d.ts.map +1 -1
  80. package/dist/features/doc.js +1 -1
  81. package/dist/features/doc.js.map +1 -1
  82. package/dist/features/heading.d.ts.map +1 -1
  83. package/dist/features/heading.js.map +1 -1
  84. package/dist/features/image.d.ts +14 -1
  85. package/dist/features/image.d.ts.map +1 -1
  86. package/dist/features/image.js +288 -11
  87. package/dist/features/image.js.map +1 -1
  88. package/dist/features/index.d.ts +7 -0
  89. package/dist/features/index.d.ts.map +1 -1
  90. package/dist/features/index.js +16 -0
  91. package/dist/features/index.js.map +1 -1
  92. package/dist/features/inline-style.d.ts.map +1 -1
  93. package/dist/features/inline-style.js +4 -1
  94. package/dist/features/inline-style.js.map +1 -1
  95. package/dist/features/link.d.ts.map +1 -1
  96. package/dist/features/link.js +1 -1
  97. package/dist/features/link.js.map +1 -1
  98. package/dist/features/markdown.d.ts +15 -0
  99. package/dist/features/markdown.d.ts.map +1 -0
  100. package/dist/features/markdown.js +80 -0
  101. package/dist/features/markdown.js.map +1 -0
  102. package/dist/features/marks.d.ts.map +1 -1
  103. package/dist/features/marks.js +76 -4
  104. package/dist/features/marks.js.map +1 -1
  105. package/dist/features/mention.d.ts +30 -0
  106. package/dist/features/mention.d.ts.map +1 -0
  107. package/dist/features/mention.js +89 -0
  108. package/dist/features/mention.js.map +1 -0
  109. package/dist/features/script.d.ts.map +1 -1
  110. package/dist/features/script.js.map +1 -1
  111. package/dist/features/search.d.ts +73 -0
  112. package/dist/features/search.d.ts.map +1 -0
  113. package/dist/features/search.js +252 -0
  114. package/dist/features/search.js.map +1 -0
  115. package/dist/features/shared.d.ts +69 -0
  116. package/dist/features/shared.d.ts.map +1 -0
  117. package/dist/features/shared.js +272 -0
  118. package/dist/features/shared.js.map +1 -0
  119. package/dist/features/table.d.ts +16 -3
  120. package/dist/features/table.d.ts.map +1 -1
  121. package/dist/features/table.js +309 -8
  122. package/dist/features/table.js.map +1 -1
  123. package/dist/features/testkit.d.ts.map +1 -1
  124. package/dist/features/testkit.js +1 -1
  125. package/dist/features/testkit.js.map +1 -1
  126. package/dist/history.d.ts.map +1 -1
  127. package/dist/history.js +65 -20
  128. package/dist/history.js.map +1 -1
  129. package/dist/index.d.ts +20 -7
  130. package/dist/index.d.ts.map +1 -1
  131. package/dist/index.js +17 -6
  132. package/dist/index.js.map +1 -1
  133. package/dist/model/schema.d.ts.map +1 -1
  134. package/dist/model/schema.js +2 -1
  135. package/dist/model/schema.js.map +1 -1
  136. package/dist/parse/html.d.ts.map +1 -1
  137. package/dist/parse/html.js +38 -6
  138. package/dist/parse/html.js.map +1 -1
  139. package/dist/parse/sanitize.d.ts.map +1 -1
  140. package/dist/parse/sanitize.js +14 -2
  141. package/dist/parse/sanitize.js.map +1 -1
  142. package/dist/presets/highlight.d.ts +17 -0
  143. package/dist/presets/highlight.d.ts.map +1 -1
  144. package/dist/presets/highlight.js +52 -4
  145. package/dist/presets/highlight.js.map +1 -1
  146. package/dist/presets/markdown-parse.d.ts +13 -0
  147. package/dist/presets/markdown-parse.d.ts.map +1 -0
  148. package/dist/presets/markdown-parse.js +398 -0
  149. package/dist/presets/markdown-parse.js.map +1 -0
  150. package/dist/presets/markdown.d.ts +45 -0
  151. package/dist/presets/markdown.d.ts.map +1 -0
  152. package/dist/presets/markdown.js +195 -0
  153. package/dist/presets/markdown.js.map +1 -0
  154. package/dist/state/apply.d.ts.map +1 -1
  155. package/dist/state/apply.js +19 -11
  156. package/dist/state/apply.js.map +1 -1
  157. package/dist/state/delete-ops.d.ts +34 -0
  158. package/dist/state/delete-ops.d.ts.map +1 -0
  159. package/dist/state/delete-ops.js +204 -0
  160. package/dist/state/delete-ops.js.map +1 -0
  161. package/dist/state/input-rules.d.ts +30 -0
  162. package/dist/state/input-rules.d.ts.map +1 -0
  163. package/dist/state/input-rules.js +70 -0
  164. package/dist/state/input-rules.js.map +1 -0
  165. package/dist/state/insert-ops.d.ts +54 -0
  166. package/dist/state/insert-ops.d.ts.map +1 -0
  167. package/dist/state/insert-ops.js +186 -0
  168. package/dist/state/insert-ops.js.map +1 -0
  169. package/dist/state/list-ops.d.ts +46 -0
  170. package/dist/state/list-ops.d.ts.map +1 -0
  171. package/dist/state/list-ops.js +231 -0
  172. package/dist/state/list-ops.js.map +1 -0
  173. package/dist/state/navigate.d.ts.map +1 -1
  174. package/dist/state/navigate.js +3 -1
  175. package/dist/state/navigate.js.map +1 -1
  176. package/dist/state/resolve-insert.d.ts +55 -0
  177. package/dist/state/resolve-insert.d.ts.map +1 -0
  178. package/dist/state/resolve-insert.js +118 -0
  179. package/dist/state/resolve-insert.js.map +1 -0
  180. package/dist/state/slice-ops.d.ts +46 -0
  181. package/dist/state/slice-ops.d.ts.map +1 -0
  182. package/dist/state/slice-ops.js +150 -0
  183. package/dist/state/slice-ops.js.map +1 -0
  184. package/dist/state/state.d.ts +6 -1
  185. package/dist/state/state.d.ts.map +1 -1
  186. package/dist/state/state.js +10 -0
  187. package/dist/state/state.js.map +1 -1
  188. package/dist/state/transaction.d.ts +40 -53
  189. package/dist/state/transaction.d.ts.map +1 -1
  190. package/dist/state/transaction.js +62 -829
  191. package/dist/state/transaction.js.map +1 -1
  192. package/dist/styles.css +472 -46
  193. package/dist/view/adapter.d.ts +84 -0
  194. package/dist/view/adapter.d.ts.map +1 -0
  195. package/dist/view/adapter.js +76 -0
  196. package/dist/view/adapter.js.map +1 -0
  197. package/dist/view/caret.d.ts +25 -0
  198. package/dist/view/caret.d.ts.map +1 -0
  199. package/dist/view/caret.js +43 -0
  200. package/dist/view/caret.js.map +1 -0
  201. package/dist/view/decoration.d.ts +9 -0
  202. package/dist/view/decoration.d.ts.map +1 -0
  203. package/dist/view/decoration.js +214 -0
  204. package/dist/view/decoration.js.map +1 -0
  205. package/dist/view/dirty-keys.d.ts +18 -0
  206. package/dist/view/dirty-keys.d.ts.map +1 -0
  207. package/dist/view/dirty-keys.js +31 -0
  208. package/dist/view/dirty-keys.js.map +1 -0
  209. package/dist/view/dom.d.ts.map +1 -1
  210. package/dist/view/dom.js +69 -27
  211. package/dist/view/dom.js.map +1 -1
  212. package/dist/view/hook-ctx.d.ts +32 -0
  213. package/dist/view/hook-ctx.d.ts.map +1 -0
  214. package/dist/view/hook-ctx.js +64 -0
  215. package/dist/view/hook-ctx.js.map +1 -0
  216. package/dist/view/ime.d.ts +72 -0
  217. package/dist/view/ime.d.ts.map +1 -0
  218. package/dist/view/ime.js +185 -0
  219. package/dist/view/ime.js.map +1 -0
  220. package/dist/view/input.d.ts +12 -12
  221. package/dist/view/input.d.ts.map +1 -1
  222. package/dist/view/input.js +122 -435
  223. package/dist/view/input.js.map +1 -1
  224. package/dist/view/keys.d.ts +25 -0
  225. package/dist/view/keys.d.ts.map +1 -0
  226. package/dist/view/keys.js +106 -0
  227. package/dist/view/keys.js.map +1 -0
  228. package/dist/view/line-nav.d.ts +13 -0
  229. package/dist/view/line-nav.d.ts.map +1 -0
  230. package/dist/view/line-nav.js +114 -0
  231. package/dist/view/line-nav.js.map +1 -0
  232. package/dist/view/mount.d.ts.map +1 -1
  233. package/dist/view/mount.js +48 -32
  234. package/dist/view/mount.js.map +1 -1
  235. package/dist/view/node-selection.d.ts +33 -0
  236. package/dist/view/node-selection.d.ts.map +1 -0
  237. package/dist/view/node-selection.js +107 -0
  238. package/dist/view/node-selection.js.map +1 -0
  239. package/dist/view/render.d.ts +11 -2
  240. package/dist/view/render.d.ts.map +1 -1
  241. package/dist/view/render.js +17 -3
  242. package/dist/view/render.js.map +1 -1
  243. package/dist/view/serialize.d.ts +8 -0
  244. package/dist/view/serialize.d.ts.map +1 -1
  245. package/dist/view/serialize.js +33 -5
  246. package/dist/view/serialize.js.map +1 -1
  247. package/package.json +1 -1
@@ -0,0 +1,84 @@
1
+ import type { Schema } from "../model/schema.js";
2
+ import type { RenderNode } from "./render.js";
3
+ /**
4
+ * 어댑터 렌더 계약 — RenderNode 트리를 각 프레임워크 vnode로 번역할
5
+ * 때 5개 렌더러가 공유하는 결정을 한 곳에 타입화한다.
6
+ *
7
+ * 어댑터는 planAdapterNode()가 반환하는 "렌더 계획"을 그대로
8
+ * 프레임워크 요소로 옮기기만 한다 — 노드 뷰 래퍼/아울렛의
9
+ * data-me-path·contenteditable·class 계약을 어댑터가 각자 계산하면
10
+ * 한쪽이 어긋났을 때 찾기 어렵다 (컨포먼스는 DOM 결과만 검증한다).
11
+ *
12
+ * DOM 계약 요약 (자세한 것은 render.ts 헤더):
13
+ * - 노드 뷰 래퍼: .me-node-view + contenteditable="false"
14
+ * atom이면 래퍼가 data-me-path를 갖는다
15
+ * - 비-atom 노드 뷰: .me-node-content 아울렛이 data-me-path와
16
+ * contenteditable="true"를 갖고 AST 자식을 1:1로 렌더한다.
17
+ * 아울렛 태그/속성은 노드의 toDOM 결과 — codeBlock이면
18
+ * <pre data-language>라 pre[data-me-path] 셀렉터가 유지된다
19
+ * - 래퍼 태그는 인라인 노드면 span, 블록이면 div
20
+ */
21
+ /** 어댑터가 노드 뷰 판별에 필요한 최소 컨텍스트 */
22
+ export interface AdapterRenderContext {
23
+ readonly schema: Schema;
24
+ /** 노드 타입 → 프레임워크 컴포넌트 — 코어는 타입을 모르므로 unknown */
25
+ readonly nodeViews?: Record<string, unknown> | undefined;
26
+ }
27
+ /** 커스텀 노드 뷰 렌더 계획 — .me-node-view 래퍼 + 선택적 콘텐츠 아울렛 */
28
+ export interface NodeViewRenderPlan {
29
+ readonly kind: "nodeView";
30
+ /**
31
+ * nodeViews[nodeType] 팩토리 — 어댑터가 자기 프레임워크의
32
+ * 컴포넌트 타입(React ComponentType, Vue Component …)으로 캐스트한다
33
+ */
34
+ readonly view: unknown;
35
+ /** 래퍼 태그 — 인라인 노드는 span, 블록은 div */
36
+ readonly wrapperTag: "span" | "div";
37
+ /** 래퍼 속성 — me-node-view + ce=false, atom이면 data-me-path 포함 */
38
+ readonly wrapperAttrs: Record<string, string>;
39
+ /** .me-node-content 아울렛이 필요한가 — 비-atom 노드 뷰만 true */
40
+ readonly editable: boolean;
41
+ /** 아울렛 태그 — 노드의 toDOM 태그 (codeBlock → pre) */
42
+ readonly outletTag: string;
43
+ /** 아울렛 속성 — toDOM attrs + me-node-content + ce=true + data-me-path */
44
+ readonly outletAttrs: Record<string, string>;
45
+ /** 아울렛에 넣을 AST 자식들의 RenderNode — 1:1 렌더 */
46
+ readonly children: readonly RenderNode[];
47
+ }
48
+ /** 일반 노드 렌더 계획 — toDOM 태그/속성 그대로 */
49
+ export interface ElementRenderPlan {
50
+ readonly kind: "element";
51
+ readonly tag: string;
52
+ readonly attrs: Record<string, string>;
53
+ /** 텍스트 리프 내용 — 있으면 children 대신 문자열을 렌더한다 */
54
+ readonly text?: string;
55
+ /**
56
+ * 자식 — 없으면(정의 자체가 없음) children을 렌더하지 않는다.
57
+ * 빈 배열과 구분해야 한다: br/hr 같은 void 태그에 children=[]
58
+ * 조차 넘기면 React가 "void element tag" 에러를 낸다.
59
+ */
60
+ readonly children?: readonly RenderNode[];
61
+ }
62
+ export type RenderPlan = NodeViewRenderPlan | ElementRenderPlan;
63
+ /**
64
+ * RenderNode → 렌더 계획 — 노드 뷰 분기와 래퍼/아울렛 속성 계산.
65
+ * 반환값의 attrs에는 data-me-path가 이미 들어 있다 — 어댑터는
66
+ * 속성을 있는 그대로 DOM에 쓰기만 한다.
67
+ */
68
+ export declare function planAdapterNode(rn: RenderNode, ctx: AdapterRenderContext): RenderPlan;
69
+ /**
70
+ * void HTML 태그 — 자식을 가질 수 없는 요소들.
71
+ * Svelte/svelte:element처럼 자식 유무를 정적 분기해야 하는 어댑터가
72
+ * 쓴다 (br 자리표시자·hr·hardBreak·img 등).
73
+ */
74
+ export declare const VOID_TAGS: ReadonlySet<string>;
75
+ /**
76
+ * 자식이 전부 데코레이션인가 — data-me-path를 가진 자식이 하나도
77
+ * 없으면(토큰 스팬·.me-ws·bogus br만 있는 리프 홀더) true.
78
+ * 어댑터는 이 경우 자식을 프레임워크 자식으로 렌더하지 말고
79
+ * renderNodeHTML()로 HTML 문자열 직렬화해 한 번에 써야 한다 —
80
+ * {#each}/v-for 앵커 노드가 편집 영역에 섞이면 Chromium IME 조합
81
+ * 앵커가 깨진다.
82
+ */
83
+ export declare function decorationOnlyChildren(rn: RenderNode): boolean;
84
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/view/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C;;;;;;;;;;;;;;;;;GAiBG;AAEH,gCAAgC;AAChC,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,gDAAgD;IAChD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;CAC1D;AAED,sDAAsD;AACtD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,oCAAoC;IACpC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,KAAK,CAAC;IACpC,8DAA8D;IAC9D,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C,qDAAqD;IACrD,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,8CAA8C;IAC9C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,sEAAsE;IACtE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,2CAA2C;IAC3C,QAAQ,CAAC,QAAQ,EAAE,SAAS,UAAU,EAAE,CAAC;CAC1C;AAED,oCAAoC;AACpC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,4CAA4C;IAC5C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;CAC3C;AAED,MAAM,MAAM,UAAU,GAAG,kBAAkB,GAAG,iBAAiB,CAAC;AAEhE;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,UAAU,EACd,GAAG,EAAE,oBAAoB,GACxB,UAAU,CAmCZ;AAED;;;;GAIG;AACH,eAAO,MAAM,SAAS,EAAE,WAAW,CAAC,MAAM,CAcxC,CAAC;AAEH;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,UAAU,GAAG,OAAO,CAM9D"}
@@ -0,0 +1,76 @@
1
+ import { nodeViewEditable, nodeViewFor } from "./render.js";
2
+ /**
3
+ * RenderNode → 렌더 계획 — 노드 뷰 분기와 래퍼/아울렛 속성 계산.
4
+ * 반환값의 attrs에는 data-me-path가 이미 들어 있다 — 어댑터는
5
+ * 속성을 있는 그대로 DOM에 쓰기만 한다.
6
+ */
7
+ export function planAdapterNode(rn, ctx) {
8
+ const view = nodeViewFor(ctx.nodeViews, rn.source.type);
9
+ if (view === undefined) {
10
+ return {
11
+ kind: "element",
12
+ tag: rn.tag,
13
+ attrs: rn.attrs ?? {},
14
+ ...(rn.text != null ? { text: rn.text } : {}),
15
+ ...(rn.children != null ? { children: rn.children } : {}),
16
+ };
17
+ }
18
+ const editable = nodeViewEditable(ctx.schema, rn.source.type);
19
+ const pathKey = rn.path.join(",");
20
+ const outletAttrs = {
21
+ ...(rn.attrs ?? {}),
22
+ class: ["me-node-content", rn.attrs?.["class"]].filter(Boolean).join(" "),
23
+ contenteditable: "true",
24
+ "data-me-path": pathKey,
25
+ };
26
+ return {
27
+ kind: "nodeView",
28
+ view,
29
+ wrapperTag: ctx.schema.isInline(rn.source.type) ? "span" : "div",
30
+ wrapperAttrs: {
31
+ // 편집 가능한 노드 뷰는 아울렛이 data-me-path를 갖는다 —
32
+ // 컨테이너 포인트가 아울렛 자식(AST 자식)과 1:1로 매핑되도록
33
+ ...(editable ? {} : { "data-me-path": pathKey }),
34
+ class: "me-node-view",
35
+ contenteditable: "false",
36
+ },
37
+ editable,
38
+ outletTag: rn.tag,
39
+ outletAttrs,
40
+ children: rn.children ?? [],
41
+ };
42
+ }
43
+ /**
44
+ * void HTML 태그 — 자식을 가질 수 없는 요소들.
45
+ * Svelte/svelte:element처럼 자식 유무를 정적 분기해야 하는 어댑터가
46
+ * 쓴다 (br 자리표시자·hr·hardBreak·img 등).
47
+ */
48
+ export const VOID_TAGS = new Set([
49
+ "area",
50
+ "base",
51
+ "br",
52
+ "col",
53
+ "embed",
54
+ "hr",
55
+ "img",
56
+ "input",
57
+ "link",
58
+ "meta",
59
+ "source",
60
+ "track",
61
+ "wbr",
62
+ ]);
63
+ /**
64
+ * 자식이 전부 데코레이션인가 — data-me-path를 가진 자식이 하나도
65
+ * 없으면(토큰 스팬·.me-ws·bogus br만 있는 리프 홀더) true.
66
+ * 어댑터는 이 경우 자식을 프레임워크 자식으로 렌더하지 말고
67
+ * renderNodeHTML()로 HTML 문자열 직렬화해 한 번에 써야 한다 —
68
+ * {#each}/v-for 앵커 노드가 편집 영역에 섞이면 Chromium IME 조합
69
+ * 앵커가 깨진다.
70
+ */
71
+ export function decorationOnlyChildren(rn) {
72
+ return (rn.text == null &&
73
+ rn.children != null &&
74
+ !rn.children.some((c) => c.attrs?.["data-me-path"] != null));
75
+ }
76
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/view/adapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAoE5D;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAC7B,EAAc,EACd,GAAyB;IAEzB,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACxD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO;YACL,IAAI,EAAE,SAAS;YACf,GAAG,EAAE,EAAE,CAAC,GAAG;YACX,KAAK,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE;YACrB,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7C,GAAG,CAAC,EAAE,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1D,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9D,MAAM,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,WAAW,GAA2B;QAC1C,GAAG,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;QACnB,KAAK,EAAE,CAAC,iBAAiB,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QACzE,eAAe,EAAE,MAAM;QACvB,cAAc,EAAE,OAAO;KACxB,CAAC;IACF,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,IAAI;QACJ,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK;QAChE,YAAY,EAAE;YACZ,wCAAwC;YACxC,uCAAuC;YACvC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC;YAChD,KAAK,EAAE,cAAc;YACrB,eAAe,EAAE,OAAO;SACzB;QACD,QAAQ;QACR,SAAS,EAAE,EAAE,CAAC,GAAG;QACjB,WAAW;QACX,QAAQ,EAAE,EAAE,CAAC,QAAQ,IAAI,EAAE;KAC5B,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAwB,IAAI,GAAG,CAAC;IACpD,MAAM;IACN,MAAM;IACN,IAAI;IACJ,KAAK;IACL,OAAO;IACP,IAAI;IACJ,KAAK;IACL,OAAO;IACP,MAAM;IACN,MAAM;IACN,QAAQ;IACR,OAAO;IACP,KAAK;CACN,CAAC,CAAC;AAEH;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CAAC,EAAc;IACnD,OAAO,CACL,EAAE,CAAC,IAAI,IAAI,IAAI;QACf,EAAE,CAAC,QAAQ,IAAI,IAAI;QACnB,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,CAC5D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { DocNode } from "../model/node.js";
2
+ import type { Point } from "../state/selection.js";
3
+ /**
4
+ * 캐럿/포인트 관련 순수 DOM 헬퍼 — 입력 바인딩(input.ts)에서 분리.
5
+ * 에디터 상태나 바인딩 수명주기를 모르는 DOM ↔ Point 판정 함수들이다.
6
+ */
7
+ /** drop 좌표 → doc Point — caretPositionFromPoint / Range 폴백 */
8
+ export declare function caretPointFromXY(doc: Document, root: HTMLElement, x: number, y: number): Point | null;
9
+ /**
10
+ * p가 속한 최상위 블록 경로 문자열 — 프레임워크 리마운트 대상 키.
11
+ * dirtyPaths는 최상위 블록 인덱스만 담는다 (어댑터는 블록 단위로 키를 만든다).
12
+ */
13
+ export declare function topBlockKey(p: Point | null): string | null;
14
+ /**
15
+ * p가 텍스트 리프 포인트인가 — element-boundary 포인트(컨테이너
16
+ * 자식 경계)와 구분한다. 리프 포인트만 텍스트 삽입·캐럿 대상이다.
17
+ */
18
+ export declare function isLeafPoint(doc: DocNode, p: Point | null | undefined): boolean;
19
+ /**
20
+ * DOM 캐럿 바로 앞 텍스트가 data로 끝나는가 — IME 커밋 에코 감지.
21
+ * 조합 중 브라우저가 쓴 글자가 DOM에 남아있으면 뒤에 도착하는
22
+ * 커밋 beforeinput은 중복이다.
23
+ */
24
+ export declare function domEndsWith(el: HTMLElement, focus: Point, data: string): boolean;
25
+ //# sourceMappingURL=caret.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caret.d.ts","sourceRoot":"","sources":["../../src/view/caret.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAGnD;;;GAGG;AAEH,8DAA8D;AAC9D,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,WAAW,EACjB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,GACR,KAAK,GAAG,IAAI,CAQd;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAE1D;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,GAAG,EAAE,OAAO,EACZ,CAAC,EAAE,KAAK,GAAG,IAAI,GAAG,SAAS,GAC1B,OAAO,CAET;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,EAAE,EAAE,WAAW,EACf,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,MAAM,GACX,OAAO,CAMT"}
@@ -0,0 +1,43 @@
1
+ import { nodeAt } from "../model/traverse.js";
2
+ import { domToPoint, PATH_ATTR } from "./dom.js";
3
+ /**
4
+ * 캐럿/포인트 관련 순수 DOM 헬퍼 — 입력 바인딩(input.ts)에서 분리.
5
+ * 에디터 상태나 바인딩 수명주기를 모르는 DOM ↔ Point 판정 함수들이다.
6
+ */
7
+ /** drop 좌표 → doc Point — caretPositionFromPoint / Range 폴백 */
8
+ export function caretPointFromXY(doc, root, x, y) {
9
+ const d = doc;
10
+ const pos = doc.caretPositionFromPoint?.(x, y);
11
+ if (pos)
12
+ return domToPoint(root, pos.offsetNode, pos.offset);
13
+ const r = d.caretRangeFromPoint?.(x, y);
14
+ return r ? domToPoint(root, r.startContainer, r.startOffset) : null;
15
+ }
16
+ /**
17
+ * p가 속한 최상위 블록 경로 문자열 — 프레임워크 리마운트 대상 키.
18
+ * dirtyPaths는 최상위 블록 인덱스만 담는다 (어댑터는 블록 단위로 키를 만든다).
19
+ */
20
+ export function topBlockKey(p) {
21
+ return p?.path[0] == null ? null : String(p.path[0]);
22
+ }
23
+ /**
24
+ * p가 텍스트 리프 포인트인가 — element-boundary 포인트(컨테이너
25
+ * 자식 경계)와 구분한다. 리프 포인트만 텍스트 삽입·캐럿 대상이다.
26
+ */
27
+ export function isLeafPoint(doc, p) {
28
+ return !!p && nodeAt(doc, p.path)?.type === "text";
29
+ }
30
+ /**
31
+ * DOM 캐럿 바로 앞 텍스트가 data로 끝나는가 — IME 커밋 에코 감지.
32
+ * 조합 중 브라우저가 쓴 글자가 DOM에 남아있으면 뒤에 도착하는
33
+ * 커밋 beforeinput은 중복이다.
34
+ */
35
+ export function domEndsWith(el, focus, data) {
36
+ const holder = focus.path.length
37
+ ? el.querySelector(`[${PATH_ATTR}="${focus.path.join(",")}"]`)
38
+ : null;
39
+ if (!holder || holder.querySelector(`[${PATH_ATTR}]`))
40
+ return false;
41
+ return (holder.textContent ?? "").slice(0, focus.offset).endsWith(data);
42
+ }
43
+ //# sourceMappingURL=caret.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caret.js","sourceRoot":"","sources":["../../src/view/caret.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAG9C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAEjD;;;GAGG;AAEH,8DAA8D;AAC9D,MAAM,UAAU,gBAAgB,CAC9B,GAAa,EACb,IAAiB,EACjB,CAAS,EACT,CAAS;IAET,MAAM,CAAC,GAAG,GAET,CAAC;IACF,MAAM,GAAG,GAAG,GAAG,CAAC,sBAAsB,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/C,IAAI,GAAG;QAAE,OAAO,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7D,MAAM,CAAC,GAAG,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACxC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACtE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,CAAe;IACzC,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACvD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CACzB,GAAY,EACZ,CAA2B;IAE3B,OAAO,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,KAAK,MAAM,CAAC;AACrD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CACzB,EAAe,EACf,KAAY,EACZ,IAAY;IAEZ,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM;QAC9B,CAAC,CAAC,EAAE,CAAC,aAAa,CAAc,IAAI,SAAS,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;QAC3E,CAAC,CAAC,IAAI,CAAC;IACT,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,aAAa,CAAC,IAAI,SAAS,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACpE,OAAO,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC1E,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { Decoration } from "../editor/extension.js";
2
+ import type { Schema } from "../model/schema.js";
3
+ import type { RenderNode } from "./render.js";
4
+ /**
5
+ * 렌더 트리에 데코레이션을 적용한다 — renderChildren의 후처리.
6
+ * decos가 비어 있으면 입력 배열을 그대로 돌려준다 (비용 0).
7
+ */
8
+ export declare function applyDecorations(rns: RenderNode[], schema: Schema, decos: readonly Decoration[]): RenderNode[];
9
+ //# sourceMappingURL=decoration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decoration.d.ts","sourceRoot":"","sources":["../../src/view/decoration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAmB,MAAM,wBAAwB,CAAC;AAE1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAGjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AA2M9C;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,UAAU,EAAE,EACjB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,SAAS,UAAU,EAAE,GAC3B,UAAU,EAAE,CA8Bd"}
@@ -0,0 +1,214 @@
1
+ import { samePath } from "../commands.js";
2
+ /**
3
+ * 데코레이션 적용 — 렌더 트리 위의 순수 변환.
4
+ *
5
+ * DOM 계약 안전 조건:
6
+ * - inline 데코는 텍스트 홀더 *내부*만 쪼갠다 — 홀더의 자식 수와
7
+ * data-me-path가 그대로라 오프셋 매핑이 유지된다 (토큰 스팬과 같음)
8
+ * - node 데코는 attrs 병합만 — 자식 구조 불변
9
+ * - 데코 요소에는 data-me-path를 달지 않는다 — 매핑에서 제외
10
+ *
11
+ * 경계 너머(블록을 걸치는) inline 범위는 각 블록 안으로 클립한다.
12
+ */
13
+ /** 경로를 Map 키로 — "0,1,2" 문자열 */
14
+ const keyOf = (p) => p.join(",");
15
+ /** Point가 blockPath 블록 안의 텍스트 좌표인지 — 끝 자식 인덱스 제외 검사 */
16
+ function inBlock(p, blockPath) {
17
+ return (p.path.length === blockPath.length + 1 &&
18
+ samePath(p.path.slice(0, -1), blockPath));
19
+ }
20
+ /** 블록 안 Point → 플랫 문자 오프셋 (blockTextOffset과 동일 규약) */
21
+ function flatOffset(block, p) {
22
+ const tIdx = p.path[p.path.length - 1] ?? 0;
23
+ let off = p.offset;
24
+ const kids = block.content ?? [];
25
+ for (let i = 0; i < tIdx && i < kids.length; i++) {
26
+ off += kids[i].text?.length ?? 0;
27
+ }
28
+ return off;
29
+ }
30
+ /** class를 공백으로 잇고 나머지 키는 덮어쓰는 attrs 병합 */
31
+ function mergeAttrs(base, decos) {
32
+ const out = { ...base };
33
+ for (const a of decos) {
34
+ for (const [k, v] of Object.entries(a)) {
35
+ if (v == null)
36
+ continue;
37
+ if (k === "class") {
38
+ out["class"] = out["class"] ? `${out["class"]} ${v}` : v;
39
+ }
40
+ else if (k === "style") {
41
+ out["style"] = out["style"] ? `${out["style"]};${v}` : v;
42
+ }
43
+ else {
44
+ out[k] = v;
45
+ }
46
+ }
47
+ }
48
+ return out;
49
+ }
50
+ /**
51
+ * 텍스트 노드의 렌더 결과에서 `text`를 담은 최심층 RenderNode를 찾는다 —
52
+ * 마크 래퍼(children=[단일])를 내려간다. 없으면(bogus br 등) null.
53
+ */
54
+ function textHolder(rn) {
55
+ let cur = rn;
56
+ for (;;) {
57
+ if (cur.text != null)
58
+ return cur;
59
+ if (cur.children?.length === 1) {
60
+ cur = cur.children[0];
61
+ continue;
62
+ }
63
+ return null;
64
+ }
65
+ }
66
+ /**
67
+ * 텍스트 노드 하나에 걸린 데코로 RenderNode를 분할한다.
68
+ * 구간 경계를 모아 세그먼트를 만들고, 데코가 덮는 세그먼트만
69
+ * span.me-deco로 감싼다 — 홀더 안쪽이라 자식 수·매핑 불변.
70
+ */
71
+ function decoSplit(rn, decos) {
72
+ const holder = textHolder(rn);
73
+ if (!holder)
74
+ return rn;
75
+ const text = holder.text ?? "";
76
+ const len = text.length;
77
+ // 경계점 — 0/len과 겹치는 데코의 클립된 끝
78
+ const cuts = new Set([0, len]);
79
+ for (const d of decos) {
80
+ if (d.s > 0 && d.s < len)
81
+ cuts.add(d.s);
82
+ if (d.e > 0 && d.e < len)
83
+ cuts.add(d.e);
84
+ }
85
+ const pts = [...cuts].sort((a, b) => a - b);
86
+ const children = [];
87
+ for (let i = 0; i < pts.length - 1; i++) {
88
+ const s = pts[i];
89
+ const e = pts[i + 1];
90
+ const segText = text.slice(s, e);
91
+ const covering = decos.filter((d) => d.s <= s && d.e >= e);
92
+ if (!covering.length) {
93
+ children.push({
94
+ tag: "span",
95
+ text: segText,
96
+ path: [...rn.path, i],
97
+ source: rn.source,
98
+ });
99
+ continue;
100
+ }
101
+ children.push({
102
+ tag: "span",
103
+ attrs: mergeAttrs({ class: "me-deco" }, covering.map((d) => d.attrs)),
104
+ text: segText,
105
+ path: [...rn.path, i],
106
+ source: rn.source,
107
+ });
108
+ }
109
+ // 최심층 홀더를 children으로 교체하며 래퍼 체인을 재구성한다
110
+ const rebuild = (node) => node === holder
111
+ ? { ...node, text: undefined, children }
112
+ : {
113
+ ...node,
114
+ children: node.children.map((c) => rebuild(c)),
115
+ };
116
+ return rebuild(rn);
117
+ }
118
+ /**
119
+ * 렌더 트리 재귀 적용 — 노드 데코 병합 + 텍스트블록 자식에 인라인 데코.
120
+ * children[i]는 source.content[i]와 1:1이라 인덱스 정렬로 내려간다.
121
+ */
122
+ function applyNode(rn, schema, nodeIdx, inlineIdx) {
123
+ let out = rn;
124
+ const nd = nodeIdx.get(keyOf(rn.path));
125
+ if (nd)
126
+ out = { ...out, attrs: mergeAttrs(out.attrs, nd) };
127
+ const src = rn.source;
128
+ const kids = src.content ?? [];
129
+ const isTextblock = kids.length > 0 &&
130
+ kids.every((c) => c.type === "text" || schema.isInline(c.type));
131
+ if (isTextblock && out.children?.length) {
132
+ // 이 블록에 걸린 inline 데코를 플랫 오프셋으로 정규화한다
133
+ const raw = inlineIdx.get(keyOf(rn.path)) ?? [];
134
+ const flat = [];
135
+ for (const d of raw) {
136
+ if (d.type !== "inline")
137
+ continue;
138
+ let s = inBlock(d.from, rn.path) ? flatOffset(src, d.from) : 0;
139
+ let e = inBlock(d.to, rn.path) ? flatOffset(src, d.to) : 0;
140
+ if (e < s)
141
+ [s, e] = [e, s];
142
+ if (e > s)
143
+ flat.push({ s, e, attrs: d.attrs });
144
+ }
145
+ if (flat.length) {
146
+ let base = 0;
147
+ out = {
148
+ ...out,
149
+ children: out.children.map((c, i) => {
150
+ const len = kids[i]?.text?.length ?? 0;
151
+ const hit = flat.filter((d) => d.s < base + len && d.e > base);
152
+ const next = hit.length
153
+ ? decoSplit(c, hit.map((d) => ({
154
+ s: Math.max(0, d.s - base),
155
+ e: Math.min(len, d.e - base),
156
+ attrs: d.attrs,
157
+ })))
158
+ : c;
159
+ base += len;
160
+ return next;
161
+ }),
162
+ };
163
+ }
164
+ return out;
165
+ }
166
+ // 컨테이너 — 자식 블록으로 재귀 (children[i] ↔ source.content[i]).
167
+ // 길이가 어긋나면(bogus br·토큰 줄 등 생성 자식) 내려가지 않는다
168
+ if (out.children && kids.length === out.children.length) {
169
+ out = {
170
+ ...out,
171
+ children: out.children.map((c) => applyNode(c, schema, nodeIdx, inlineIdx)),
172
+ };
173
+ }
174
+ return out;
175
+ }
176
+ /**
177
+ * 렌더 트리에 데코레이션을 적용한다 — renderChildren의 후처리.
178
+ * decos가 비어 있으면 입력 배열을 그대로 돌려준다 (비용 0).
179
+ */
180
+ export function applyDecorations(rns, schema, decos) {
181
+ if (!decos.length)
182
+ return rns;
183
+ const nodeIdx = new Map();
184
+ const inlineIdx = new Map();
185
+ for (const d of decos) {
186
+ if (d.type === "node") {
187
+ const k = keyOf(d.path);
188
+ nodeIdx.set(k, [...(nodeIdx.get(k) ?? []), d.attrs]);
189
+ }
190
+ else {
191
+ // inline 데코는 두 끝점이 같은 블록 안일 때만 그린다 —
192
+ // 블록 경계를 넘는 범위는 각 끝점 블록으로 쪼갠다
193
+ const fromB = d.from.path.slice(0, -1);
194
+ const toB = d.to.path.slice(0, -1);
195
+ if (samePath(fromB, toB)) {
196
+ const k = keyOf(fromB);
197
+ inlineIdx.set(k, [...(inlineIdx.get(k) ?? []), d]);
198
+ }
199
+ else {
200
+ // 시작 블록의 끝까지 + 끝 블록의 처음까지로 분할
201
+ inlineIdx.set(keyOf(fromB), [
202
+ ...(inlineIdx.get(keyOf(fromB)) ?? []),
203
+ { ...d, to: { path: d.from.path, offset: Number.MAX_SAFE_INTEGER } },
204
+ ]);
205
+ inlineIdx.set(keyOf(toB), [
206
+ ...(inlineIdx.get(keyOf(toB)) ?? []),
207
+ { ...d, from: { path: d.to.path, offset: 0 } },
208
+ ]);
209
+ }
210
+ }
211
+ }
212
+ return rns.map((rn) => applyNode(rn, schema, nodeIdx, inlineIdx));
213
+ }
214
+ //# sourceMappingURL=decoration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decoration.js","sourceRoot":"","sources":["../../src/view/decoration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * 어댑터 공용 dirty-key 헬퍼 — binding.dirtyPaths를 소비해 블록
3
+ * 렌더 키를 안정적으로 버전업한다. 일반 블록은 path 그대로,
4
+ * 외부 DOM 변경이 있었던 블록은 path@N으로 키가 바뀌어
5
+ * 프레임워크가 내부 diff 대신 리마운트를 택한다.
6
+ *
7
+ * IME 조합처럼 브라우저가 프레임워크 몰래 DOM을 직접 바꾼 블록은
8
+ * vnode와 어긋나 리컨실이 깨진다(React removeChild 크래시 등).
9
+ * 입력 바인딩이 더러워진 최상위 블록 경로를 dirtyPaths에 담아두면
10
+ * 어댑터는 이 클래스로 렌더 키를 만들어 통째 리마운트한다.
11
+ * drain 방식: 어댑터가 소비한 항목은 지운다.
12
+ */
13
+ export declare class DirtyKeyMap {
14
+ private readonly versions;
15
+ /** rn.path.join(",")와 binding.dirtyPaths를 넣으면 렌더 키를 반환 */
16
+ key(pathKey: string, dirty: Set<string> | undefined): string;
17
+ }
18
+ //# sourceMappingURL=dirty-keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dirty-keys.d.ts","sourceRoot":"","sources":["../../src/view/dirty-keys.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IACtD,0DAA0D;IAC1D,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,SAAS,GAAG,MAAM;CAO7D"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * 어댑터 공용 dirty-key 헬퍼 — binding.dirtyPaths를 소비해 블록
3
+ * 렌더 키를 안정적으로 버전업한다. 일반 블록은 path 그대로,
4
+ * 외부 DOM 변경이 있었던 블록은 path@N으로 키가 바뀌어
5
+ * 프레임워크가 내부 diff 대신 리마운트를 택한다.
6
+ *
7
+ * IME 조합처럼 브라우저가 프레임워크 몰래 DOM을 직접 바꾼 블록은
8
+ * vnode와 어긋나 리컨실이 깨진다(React removeChild 크래시 등).
9
+ * 입력 바인딩이 더러워진 최상위 블록 경로를 dirtyPaths에 담아두면
10
+ * 어댑터는 이 클래스로 렌더 키를 만들어 통째 리마운트한다.
11
+ * drain 방식: 어댑터가 소비한 항목은 지운다.
12
+ */
13
+ export class DirtyKeyMap {
14
+ constructor() {
15
+ Object.defineProperty(this, "versions", {
16
+ enumerable: true,
17
+ configurable: true,
18
+ writable: true,
19
+ value: new Map()
20
+ });
21
+ }
22
+ /** rn.path.join(",")와 binding.dirtyPaths를 넣으면 렌더 키를 반환 */
23
+ key(pathKey, dirty) {
24
+ if (dirty?.delete(pathKey)) {
25
+ this.versions.set(pathKey, (this.versions.get(pathKey) ?? 0) + 1);
26
+ }
27
+ const v = this.versions.get(pathKey);
28
+ return v ? `${pathKey}@${v}` : pathKey;
29
+ }
30
+ }
31
+ //# sourceMappingURL=dirty-keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dirty-keys.js","sourceRoot":"","sources":["../../src/view/dirty-keys.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,WAAW;IAAxB;QACmB;;;;mBAAW,IAAI,GAAG,EAAkB;WAAC;IASxD,CAAC;IARC,0DAA0D;IAC1D,GAAG,CAAC,OAAe,EAAE,KAA8B;QACjD,IAAI,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACpE,CAAC;QACD,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;IACzC,CAAC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"dom.d.ts","sourceRoot":"","sources":["../../src/view/dom.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAEnD;;;;;;;;GAQG;AAEH,eAAO,MAAM,SAAS,iBAAiB,CAAC;AAqDxC,wCAAwC;AACxC,wBAAgB,UAAU,CACxB,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,IAAI,EACb,SAAS,EAAE,MAAM,GAChB,KAAK,GAAG,IAAI,CA0Cd;AAED,+CAA+C;AAC/C,wBAAgB,UAAU,CACxB,IAAI,EAAE,WAAW,EACjB,KAAK,EAAE,KAAK,GACX;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAmFvC;AAED,6CAA6C;AAC7C,wBAAgB,YAAY,CAC1B,IAAI,EAAE,WAAW,GAChB;IAAE,MAAM,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,GAAG,IAAI,CAmCxC;AAED,8BAA8B;AAC9B,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,WAAW,EACjB,MAAM,EAAE,KAAK,EACb,KAAK,EAAE,KAAK,GACX,IAAI,CAMN"}
1
+ {"version":3,"file":"dom.d.ts","sourceRoot":"","sources":["../../src/view/dom.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAEnD;;;;;;;;GAQG;AAEH,eAAO,MAAM,SAAS,iBAAiB,CAAC;AAqDxC,wCAAwC;AACxC,wBAAgB,UAAU,CACxB,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,IAAI,EACb,SAAS,EAAE,MAAM,GAChB,KAAK,GAAG,IAAI,CAwCd;AAED,+CAA+C;AAC/C,wBAAgB,UAAU,CACxB,IAAI,EAAE,WAAW,EACjB,KAAK,EAAE,KAAK,GACX;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAyHvC;AAED,6CAA6C;AAC7C,wBAAgB,YAAY,CAC1B,IAAI,EAAE,WAAW,GAChB;IAAE,MAAM,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,GAAG,IAAI,CAmCxC;AAED,8BAA8B;AAC9B,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,WAAW,EACjB,MAAM,EAAE,KAAK,EACb,KAAK,EAAE,KAAK,GACX,IAAI,CAMN"}