@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,207 @@
1
+ import { point } from "../state/selection.js";
2
+ import { defineFeature } from "./feature.js";
3
+ /**
4
+ * 블록 드래그&드롭 — Notion식 블록 재배치.
5
+ *
6
+ * DOM 계약: `.me-editor`의 직계 요소 자식은 doc 루트 블록과 1:1 —
7
+ * 자식 인덱스가 곧 블록 경로다. 최상위 블록만 이동 대상으로 한다
8
+ * (중첩 블록의 리스트/표 내부 재배치는 별개 기능).
9
+ *
10
+ * UI는 .me-editor의 형제 오버레이(.me-dnd)로 그린다 — 편집 DOM 안에
11
+ * 핸들을 넣으면 DOM↔Point 매핑과 IME 경계가 깨진다. 거터 스트립
12
+ * (왼쪽 여백)에만 겹치게 둬 Chrome 캐럿 줄 경계 계산을 지킨다.
13
+ *
14
+ * .me-dnd (pointer-events:none)
15
+ * ├ .me-drag-handle (pointer-events:auto, draggable) — 호버 블록 좌측
16
+ * └ .me-drop-line — dragover 중 삽입 경계 표시
17
+ *
18
+ * 데이터는 "application/x-moda-block" MIME로 나른다 — 파일 드롭
19
+ * (imageFeature의 files 훅)과 섞이지 않게 자기 타입일 때만
20
+ * dragover/drop을 소비한다.
21
+ */
22
+ const MIME = "application/x-moda-block";
23
+ const dndViews = new WeakMap();
24
+ /**
25
+ * 포인터 아래의 최상위 블록 — target에서 올라가 el의 직계 자식을
26
+ * 찾는다. 직계 자식 인덱스 = doc 루트 블록 인덱스 (DOM 계약).
27
+ * 노드 뷰 래퍼(.me-node-view)도 직계 자식이므로 같은 규칙이 성립한다.
28
+ */
29
+ function topBlockAt(el, target) {
30
+ const ElementCtor = el.ownerDocument.defaultView?.Element;
31
+ if (!ElementCtor || !(target instanceof ElementCtor))
32
+ return null;
33
+ let host = target;
34
+ while (host && host.parentElement !== el)
35
+ host = host.parentElement;
36
+ if (!host)
37
+ return null;
38
+ return { host, index: Array.prototype.indexOf.call(el.children, host) };
39
+ }
40
+ /**
41
+ * dragover의 삽입 경계 — 블록 중간선 기준 before/after를 계산한다.
42
+ * to는 "원래 배열의 삽입 경계"(블록 i 앞=i, 뒤=i+1), y는 표시선 위치.
43
+ */
44
+ function dropTargetAt(el, e) {
45
+ const hit = topBlockAt(el, e.target);
46
+ if (!hit)
47
+ return null;
48
+ const r = hit.host.getBoundingClientRect();
49
+ const after = e.clientY > r.top + r.height / 2;
50
+ return { to: hit.index + (after ? 1 : 0), y: after ? r.bottom : r.top };
51
+ }
52
+ /**
53
+ * 오버레이 DOM과 이벤트 리스너를 지연 바인딩한다 — paintOverlay는
54
+ * 렌더 커밋마다 호출되므로 WeakMap으로 한 번만 붙인다.
55
+ */
56
+ function ensureBound(el, editor) {
57
+ const prev = dndViews.get(el);
58
+ if (prev)
59
+ return prev;
60
+ const doc = el.ownerDocument;
61
+ const root = el.parentElement;
62
+ // .me-root 형제로 올라가야 하므로 부모가 없으면 오버레이를 못 둔다
63
+ if (!root)
64
+ return null;
65
+ const overlay = doc.createElement("div");
66
+ overlay.className = "me-dnd";
67
+ overlay.setAttribute("contenteditable", "false");
68
+ const handle = doc.createElement("div");
69
+ handle.className = "me-drag-handle";
70
+ handle.draggable = true;
71
+ handle.title = "드래그해서 블록 이동";
72
+ handle.textContent = "⋮⋮";
73
+ const line = doc.createElement("div");
74
+ line.className = "me-drop-line";
75
+ overlay.append(handle, line);
76
+ root.appendChild(overlay);
77
+ const vs = {
78
+ overlay,
79
+ handle,
80
+ line,
81
+ hover: -1,
82
+ from: null,
83
+ listeners: [],
84
+ };
85
+ const on = (t, type, fn) => {
86
+ t.addEventListener(type, fn);
87
+ vs.listeners.push([t, type, fn]);
88
+ };
89
+ // 블록 위 호버 → 핸들을 그 블록의 왼쪽 거터 자리에 표시한다
90
+ on(el, "mousemove", ((e) => {
91
+ if (vs.from !== null)
92
+ return; // 드래그 중에는 핸들을 감춘 채 둔다
93
+ const hit = topBlockAt(el, e.target);
94
+ if (!hit) {
95
+ vs.hover = -1;
96
+ handle.classList.remove("is-visible");
97
+ return;
98
+ }
99
+ vs.hover = hit.index;
100
+ const r = hit.host.getBoundingClientRect();
101
+ const rr = overlay.getBoundingClientRect();
102
+ handle.style.top = `${r.top - rr.top}px`;
103
+ handle.classList.add("is-visible");
104
+ }));
105
+ on(el, "mouseleave", (() => {
106
+ vs.hover = -1;
107
+ handle.classList.remove("is-visible");
108
+ }));
109
+ on(handle, "dragstart", ((e) => {
110
+ if (vs.hover < 0) {
111
+ e.preventDefault();
112
+ return;
113
+ }
114
+ vs.from = vs.hover;
115
+ e.dataTransfer?.setData(MIME, String(vs.from));
116
+ // effectAllowed가 없으면 일부 브라우저가 drop을 보내지 않는다
117
+ if (e.dataTransfer)
118
+ e.dataTransfer.effectAllowed = "move";
119
+ handle.classList.remove("is-visible");
120
+ }));
121
+ const clearDrag = () => {
122
+ vs.from = null;
123
+ line.classList.remove("is-visible");
124
+ handle.classList.remove("is-visible");
125
+ };
126
+ on(handle, "dragend", clearDrag);
127
+ on(el, "dragover", ((e) => {
128
+ // 우리 MIME이 아니면(파일 드롭 등) 관여하지 않는다
129
+ if (!e.dataTransfer?.types.includes(MIME))
130
+ return;
131
+ const t = dropTargetAt(el, e);
132
+ if (!t)
133
+ return;
134
+ e.preventDefault(); // drop 허용
135
+ if (e.dataTransfer)
136
+ e.dataTransfer.dropEffect = "move";
137
+ const rr = overlay.getBoundingClientRect();
138
+ line.style.top = `${t.y - rr.top}px`;
139
+ line.classList.add("is-visible");
140
+ }));
141
+ on(el, "drop", ((e) => {
142
+ if (!e.dataTransfer?.types.includes(MIME))
143
+ return;
144
+ const t = dropTargetAt(el, e);
145
+ const from = vs.from ?? Number(e.dataTransfer.getData(MIME));
146
+ clearDrag();
147
+ if (!t || !Number.isFinite(from))
148
+ return;
149
+ e.preventDefault();
150
+ editor.commands["moveBlock"](from, t.to);
151
+ }));
152
+ on(el, "dragleave", (() => {
153
+ line.classList.remove("is-visible");
154
+ }));
155
+ dndViews.set(el, vs);
156
+ return vs;
157
+ }
158
+ /**
159
+ * 블록 드래그&드롭 피처 — `moveBlock(from, to)` 커맨드 + 호버 핸들/
160
+ * 드롭 라인 오버레이. `to`는 제거 전 기준 삽입 경계다
161
+ * (예: 블록0을 블록2 뒤로 → moveBlock(0, 3)).
162
+ */
163
+ export const blockDndFeature = defineFeature({
164
+ name: "block-dnd",
165
+ description: "블록 드래그&드롭 — .me-drag-handle로 최상위 블록 재배치 (moveBlock)",
166
+ commands: {
167
+ /**
168
+ * 최상위 블록 from을 경계 to로 이동한다. to는 "원래 배열의 삽입
169
+ * 경계" — 블록 i 앞이 i, 뒤가 i+1. from 제거로 생기는 인덱스
170
+ * 시프트(to>from이면 -1)는 여기서 정규화한다.
171
+ */
172
+ moveBlock(ctx, ...args) {
173
+ const from = args[0];
174
+ const to = args[1];
175
+ if (typeof from !== "number" || typeof to !== "number")
176
+ return false;
177
+ const len = ctx.state.doc.content?.length ?? 0;
178
+ if (from < 0 || from >= len || to < 0 || to > len)
179
+ return false;
180
+ if (to === from || to === from + 1)
181
+ return true; // 제자리 — no-op
182
+ const node = ctx.state.doc.content[from];
183
+ const adj = to > from ? to - 1 : to;
184
+ ctx.tr
185
+ .delete({ anchor: point([], from), focus: point([], from + 1) })
186
+ .insertNode(point([], adj), node);
187
+ ctx.dispatch();
188
+ return true;
189
+ },
190
+ },
191
+ input: {
192
+ paintOverlay(el, _state, editor) {
193
+ ensureBound(el, editor);
194
+ },
195
+ destroyOverlay(el) {
196
+ const vs = dndViews.get(el);
197
+ if (!vs)
198
+ return;
199
+ for (const [t, type, fn] of vs.listeners) {
200
+ t.removeEventListener(type, fn);
201
+ }
202
+ vs.overlay.remove();
203
+ dndViews.delete(el);
204
+ },
205
+ },
206
+ });
207
+ //# sourceMappingURL=block-dnd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block-dnd.js","sourceRoot":"","sources":["../../src/features/block-dnd.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,13 @@
1
1
  import type { Command } from "../editor/extension.js";
2
- import type { EditorNode } from "../model/node.js";
3
- import type { EditorState } from "../state/state.js";
2
+ /**
3
+ * 코드블록 — ` ``` ` 입력 규칙, 구문 하이라이트, Ace/VS Code 관례의
4
+ * 코드 편집 명령(들여쓰기·주석 토글·줄 이동/복제·괄호 매칭·화살표
5
+ * 탈출). 코드 텍스트는 마크 없는 순수 텍스트다.
6
+ *
7
+ * 모듈 구성 — 이 파일은 스키마·블록 변환·크롬 UI·feature 정의만 갖고,
8
+ * 컨텍스트 해석은 code-context.ts, 편집 커맨드는 code-edit.ts,
9
+ * 서식 엔진은 code-format.ts에 있다.
10
+ */
4
11
  /**
5
12
  * 코드블록 — ` ``` ` 입력 규칙, 구문 하이라이트, Ace/VS Code 관례의
6
13
  * 코드 편집 명령(들여쓰기·주석 토글·줄 이동/복제·괄호 매칭·화살표
@@ -16,62 +23,9 @@ export declare const toggleCodeBlock: Command;
16
23
  /** 캐럿 코드블록의 language attr 설정 — data-language 라벨로 렌더 */
17
24
  export declare function setCodeLanguage(language: string): Command;
18
25
  /**
19
- * 문자열/주석 토큰 안의 문자 오프셋 판정 — spec.codeHighlighter로
20
- * 토큰화해 그 구간에 있으면 true를 돌린다 (Ace가 페어링·매칭을
21
- * 끌 때 쓰는 isCodeLike 관례). 하이라이터가 없으면 null.
22
- */
23
- export declare function codeStringMask(state: EditorState, block: EditorNode): ((off: number) => boolean) | null;
24
- /**
25
- * Tab — 코드블록 들여쓰기. collapsed면 캐럿에 \t 삽입,
26
- * 범위 선택이면 걸친 줄 전부의 앞에 \t를 단다 (VS Code 관례).
27
- * 코드블록 밖이면 false — 리스트/표 키바인딩으로 폴스루.
28
- */
29
- export declare const indentCode: Command;
30
- /**
31
- * Shift-Tab — 코드블록 내어쓰기. 걸친 각 줄의 앞에서 \t 하나 또는
32
- * 스페이스 최대 tabSize개를 지운다. 코드블록 밖이면 false로 폴스루.
33
- */
34
- export declare const dedentCode: Command;
35
- /**
36
- * ArrowDown/ArrowUp — 코드블록 가장자리 줄 탈출 (Tiptap
37
- * exitOnArrowDown/Up 관례). 마지막 줄에서 ArrowDown을 누르면 블록
38
- * 뒤로, 첫 줄에서 ArrowUp이면 블록 앞으로 나간다 — 이웃 블록이
39
- * 없으면 빈 문단을 만든다. Notion의 코드블록 화살표 탈출과 같다.
40
- */
41
- export declare function exitCodeArrow(direction: "up" | "down"): Command;
42
- /** 캐럿 코드블록의 텍스트 — 복사 버튼 등 UI용. 밖이면 null */
43
- export declare function codeTextAt(state: EditorState): string | null;
44
- /** 코드블록 안 캐럿의 줄/열 (Ace 상태바 Ln:Col 관례). 밖이면 null */
45
- export declare function codeCaret(state: EditorState): {
46
- line: number;
47
- col: number;
48
- } | null;
49
- /**
50
- * Mod-/ — 코드블록 줄 주석 토글 (Ace toggleCommentLines 관례).
51
- * 걸친 줄이 전부 주석이면 해제, 아니면 주석을 단다 — 마커는
52
- * 선행 공백 뒤에 붙어 들여쓰기가 보존된다 (VS Code 관례).
53
- * 블록 주석 언어(css/html 등)는 줄마다 블록 마커로 감싼다.
54
- */
55
- export declare const toggleCodeComment: Command;
56
- /**
57
- * Alt-↑/↓ — 선택이 걸친 줄들을 위/아래 한 줄 이동 (Ace movelines·
58
- * VS Code 관례). 첫/마지막 줄 가장자리에선 false로 폴스루한다.
59
- */
60
- export declare function moveCodeLines(direction: "up" | "down"): Command;
61
- /**
62
- * Mod-Shift-D — 선택이 걸친 줄들을 바로 아래에 복제
63
- * (Ace duplicateSelection 관례). 사본이 선택된다.
64
- */
65
- export declare const duplicateCodeLines: Command;
66
- /**
67
- * 캐럿 인접 괄호와 짝의 문자 오프셋 (Ace bracket matching 관례).
68
- * 캐럿 앞/뒤의 ()[]{}를 보고 같은 종류만 세는 깊이 스캔으로 짝을
69
- * 찾는다 — 문자열/주석 토큰 안쪽의 괄호는 코드로 세지 않는다.
70
- * 없으면 null.
26
+ * 경로로 지정한 코드블록의 언어 — 노드 뷰 크롬 바처럼 캐럿과
27
+ * 무관하게 특정 블록을 바꿀 때 쓴다.
71
28
  */
72
- export declare function codeBracketAt(state: EditorState): {
73
- a: number;
74
- b: number;
75
- } | null;
29
+ export declare function setCodeLanguageAt(blockPath: readonly number[], language: string): Command;
76
30
  export declare const codeBlockFeature: import("./feature.js").Feature;
77
31
  //# sourceMappingURL=code-block.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"code-block.d.ts","sourceRoot":"","sources":["../../src/features/code-block.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAUnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAYrD;;;;GAIG;AAIH;;;;;GAKG;AACH,eAAO,MAAM,eAAe,EAAE,OA6C7B,CAAC;AAEF,uDAAuD;AACvD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CASzD;AA6HD;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,UAAU,GAChB,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,IAAI,CAwBnC;AAgBD;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,OAyCxB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,UAAU,EAAE,OA0CxB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,IAAI,GAAG,MAAM,GAAG,OAAO,CAkC/D;AAED,2CAA2C;AAC3C,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,CAG5D;AAED,mDAAmD;AACnD,wBAAgB,SAAS,CACvB,KAAK,EAAE,WAAW,GACjB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAMtC;AAqFD;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,EAAE,OAiH/B,CAAC;AAEF;;;GAGG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,IAAI,GAAG,MAAM,GAAG,OAAO,CAyD/D;AAED;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,OAsBhC,CAAC;AASF;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,WAAW,GACjB;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAwCjC;AAmBD,eAAO,MAAM,gBAAgB,gCA8S3B,CAAC"}
1
+ {"version":3,"file":"code-block.d.ts","sourceRoot":"","sources":["../../src/features/code-block.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAkCtD;;;;;;;;GAQG;AAEH;;;;GAIG;AAIH;;;;;GAKG;AACH,eAAO,MAAM,eAAe,EAAE,OA8C7B,CAAC;AAEF,uDAAuD;AACvD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAazD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,QAAQ,EAAE,MAAM,GACf,OAAO,CAQT;AAoJD,eAAO,MAAM,gBAAgB,gCA2T3B,CAAC"}