@moda-editor/core 0.1.3 → 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 (243) 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 -1748
  52. package/dist/conformance.js.map +1 -1
  53. package/dist/editor/extension.d.ts +47 -3
  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 +34 -13
  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 +9 -84
  64. package/dist/features/code-block.d.ts.map +1 -1
  65. package/dist/features/code-block.js +37 -1027
  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.map +1 -1
  85. package/dist/features/image.js +11 -2
  86. package/dist/features/image.js.map +1 -1
  87. package/dist/features/index.d.ts +7 -0
  88. package/dist/features/index.d.ts.map +1 -1
  89. package/dist/features/index.js +16 -0
  90. package/dist/features/index.js.map +1 -1
  91. package/dist/features/inline-style.d.ts.map +1 -1
  92. package/dist/features/inline-style.js +4 -1
  93. package/dist/features/inline-style.js.map +1 -1
  94. package/dist/features/link.d.ts.map +1 -1
  95. package/dist/features/link.js +1 -1
  96. package/dist/features/link.js.map +1 -1
  97. package/dist/features/markdown.d.ts +15 -0
  98. package/dist/features/markdown.d.ts.map +1 -0
  99. package/dist/features/markdown.js +80 -0
  100. package/dist/features/markdown.js.map +1 -0
  101. package/dist/features/marks.d.ts.map +1 -1
  102. package/dist/features/marks.js +49 -4
  103. package/dist/features/marks.js.map +1 -1
  104. package/dist/features/mention.d.ts +30 -0
  105. package/dist/features/mention.d.ts.map +1 -0
  106. package/dist/features/mention.js +89 -0
  107. package/dist/features/mention.js.map +1 -0
  108. package/dist/features/script.d.ts.map +1 -1
  109. package/dist/features/script.js.map +1 -1
  110. package/dist/features/search.d.ts +73 -0
  111. package/dist/features/search.d.ts.map +1 -0
  112. package/dist/features/search.js +252 -0
  113. package/dist/features/search.js.map +1 -0
  114. package/dist/features/shared.d.ts +69 -0
  115. package/dist/features/shared.d.ts.map +1 -0
  116. package/dist/features/shared.js +272 -0
  117. package/dist/features/shared.js.map +1 -0
  118. package/dist/features/table.d.ts.map +1 -1
  119. package/dist/features/table.js +17 -3
  120. package/dist/features/table.js.map +1 -1
  121. package/dist/features/testkit.d.ts.map +1 -1
  122. package/dist/features/testkit.js +1 -1
  123. package/dist/features/testkit.js.map +1 -1
  124. package/dist/history.d.ts.map +1 -1
  125. package/dist/history.js +65 -20
  126. package/dist/history.js.map +1 -1
  127. package/dist/index.d.ts +19 -7
  128. package/dist/index.d.ts.map +1 -1
  129. package/dist/index.js +16 -6
  130. package/dist/index.js.map +1 -1
  131. package/dist/model/schema.d.ts.map +1 -1
  132. package/dist/model/schema.js +2 -1
  133. package/dist/model/schema.js.map +1 -1
  134. package/dist/parse/html.d.ts.map +1 -1
  135. package/dist/parse/html.js +38 -6
  136. package/dist/parse/html.js.map +1 -1
  137. package/dist/parse/sanitize.d.ts.map +1 -1
  138. package/dist/parse/sanitize.js +4 -1
  139. package/dist/parse/sanitize.js.map +1 -1
  140. package/dist/presets/highlight.d.ts.map +1 -1
  141. package/dist/presets/highlight.js +1 -4
  142. package/dist/presets/highlight.js.map +1 -1
  143. package/dist/presets/markdown-parse.d.ts +13 -0
  144. package/dist/presets/markdown-parse.d.ts.map +1 -0
  145. package/dist/presets/markdown-parse.js +398 -0
  146. package/dist/presets/markdown-parse.js.map +1 -0
  147. package/dist/presets/markdown.d.ts +45 -0
  148. package/dist/presets/markdown.d.ts.map +1 -0
  149. package/dist/presets/markdown.js +195 -0
  150. package/dist/presets/markdown.js.map +1 -0
  151. package/dist/state/apply.d.ts.map +1 -1
  152. package/dist/state/apply.js +19 -11
  153. package/dist/state/apply.js.map +1 -1
  154. package/dist/state/delete-ops.d.ts +34 -0
  155. package/dist/state/delete-ops.d.ts.map +1 -0
  156. package/dist/state/delete-ops.js +204 -0
  157. package/dist/state/delete-ops.js.map +1 -0
  158. package/dist/state/input-rules.d.ts +30 -0
  159. package/dist/state/input-rules.d.ts.map +1 -0
  160. package/dist/state/input-rules.js +70 -0
  161. package/dist/state/input-rules.js.map +1 -0
  162. package/dist/state/insert-ops.d.ts +54 -0
  163. package/dist/state/insert-ops.d.ts.map +1 -0
  164. package/dist/state/insert-ops.js +186 -0
  165. package/dist/state/insert-ops.js.map +1 -0
  166. package/dist/state/list-ops.d.ts +46 -0
  167. package/dist/state/list-ops.d.ts.map +1 -0
  168. package/dist/state/list-ops.js +231 -0
  169. package/dist/state/list-ops.js.map +1 -0
  170. package/dist/state/navigate.d.ts.map +1 -1
  171. package/dist/state/navigate.js +3 -1
  172. package/dist/state/navigate.js.map +1 -1
  173. package/dist/state/resolve-insert.d.ts +55 -0
  174. package/dist/state/resolve-insert.d.ts.map +1 -0
  175. package/dist/state/resolve-insert.js +118 -0
  176. package/dist/state/resolve-insert.js.map +1 -0
  177. package/dist/state/slice-ops.d.ts +46 -0
  178. package/dist/state/slice-ops.d.ts.map +1 -0
  179. package/dist/state/slice-ops.js +150 -0
  180. package/dist/state/slice-ops.js.map +1 -0
  181. package/dist/state/state.d.ts +6 -1
  182. package/dist/state/state.d.ts.map +1 -1
  183. package/dist/state/state.js +10 -0
  184. package/dist/state/state.js.map +1 -1
  185. package/dist/state/transaction.d.ts +43 -49
  186. package/dist/state/transaction.d.ts.map +1 -1
  187. package/dist/state/transaction.js +62 -858
  188. package/dist/state/transaction.js.map +1 -1
  189. package/dist/styles.css +160 -29
  190. package/dist/view/adapter.d.ts +84 -0
  191. package/dist/view/adapter.d.ts.map +1 -0
  192. package/dist/view/adapter.js +76 -0
  193. package/dist/view/adapter.js.map +1 -0
  194. package/dist/view/caret.d.ts +25 -0
  195. package/dist/view/caret.d.ts.map +1 -0
  196. package/dist/view/caret.js +43 -0
  197. package/dist/view/caret.js.map +1 -0
  198. package/dist/view/decoration.d.ts +9 -0
  199. package/dist/view/decoration.d.ts.map +1 -0
  200. package/dist/view/decoration.js +214 -0
  201. package/dist/view/decoration.js.map +1 -0
  202. package/dist/view/dirty-keys.d.ts +18 -0
  203. package/dist/view/dirty-keys.d.ts.map +1 -0
  204. package/dist/view/dirty-keys.js +31 -0
  205. package/dist/view/dirty-keys.js.map +1 -0
  206. package/dist/view/dom.d.ts.map +1 -1
  207. package/dist/view/dom.js +7 -5
  208. package/dist/view/dom.js.map +1 -1
  209. package/dist/view/hook-ctx.d.ts +32 -0
  210. package/dist/view/hook-ctx.d.ts.map +1 -0
  211. package/dist/view/hook-ctx.js +64 -0
  212. package/dist/view/hook-ctx.js.map +1 -0
  213. package/dist/view/ime.d.ts +72 -0
  214. package/dist/view/ime.d.ts.map +1 -0
  215. package/dist/view/ime.js +185 -0
  216. package/dist/view/ime.js.map +1 -0
  217. package/dist/view/input.d.ts +12 -12
  218. package/dist/view/input.d.ts.map +1 -1
  219. package/dist/view/input.js +83 -534
  220. package/dist/view/input.js.map +1 -1
  221. package/dist/view/keys.d.ts +25 -0
  222. package/dist/view/keys.d.ts.map +1 -0
  223. package/dist/view/keys.js +106 -0
  224. package/dist/view/keys.js.map +1 -0
  225. package/dist/view/line-nav.d.ts +13 -0
  226. package/dist/view/line-nav.d.ts.map +1 -0
  227. package/dist/view/line-nav.js +114 -0
  228. package/dist/view/line-nav.js.map +1 -0
  229. package/dist/view/mount.d.ts.map +1 -1
  230. package/dist/view/mount.js +43 -39
  231. package/dist/view/mount.js.map +1 -1
  232. package/dist/view/node-selection.d.ts +33 -0
  233. package/dist/view/node-selection.d.ts.map +1 -0
  234. package/dist/view/node-selection.js +107 -0
  235. package/dist/view/node-selection.js.map +1 -0
  236. package/dist/view/render.d.ts +4 -1
  237. package/dist/view/render.d.ts.map +1 -1
  238. package/dist/view/render.js +13 -3
  239. package/dist/view/render.js.map +1 -1
  240. package/dist/view/serialize.d.ts.map +1 -1
  241. package/dist/view/serialize.js +14 -5
  242. package/dist/view/serialize.js.map +1 -1
  243. package/package.json +1 -1
@@ -0,0 +1,50 @@
1
+ import type { Command } from "../editor/extension.js";
2
+ /**
3
+ * 코드블록 편집 커맨드 — 들여쓰기·주석 토글·줄 이동/복제·화살표
4
+ * 탈출·서식 정리 래퍼 (Ace/VS Code 관례). 컨텍스트 해석은
5
+ * code-context.ts, 텍스트 변환 엔진은 code-format.ts에 있다.
6
+ */
7
+ /**
8
+ * 경로로 지정한 코드블록 서식 정리 — 노드 뷰 크롬 바처럼 캐럿과
9
+ * 무관하게 특정 블록을 정리할 때 쓴다. 이 블록 안의 셀렉션
10
+ * 엔드포인트는 새 텍스트 길이로 클램프해 보존한다.
11
+ */
12
+ export declare function formatCodeAt(blockPath: readonly number[]): Command;
13
+ /** 캐럿 코드블록 서식 정리 — Shift-Alt-F/정리 버튼 (VS Code 관례) */
14
+ export declare const formatCode: Command;
15
+ /**
16
+ * Tab — 코드블록 들여쓰기. collapsed면 캐럿에 \t 삽입,
17
+ * 범위 선택이면 걸친 줄 전부의 앞에 \t를 단다 (VS Code 관례).
18
+ * 코드블록 밖이면 false — 리스트/표 키바인딩으로 폴스루.
19
+ */
20
+ export declare const indentCode: Command;
21
+ /**
22
+ * Shift-Tab — 코드블록 내어쓰기. 걸친 각 줄의 앞에서 \t 하나 또는
23
+ * 스페이스 최대 tabSize개를 지운다. 코드블록 밖이면 false로 폴스루.
24
+ */
25
+ export declare const dedentCode: Command;
26
+ /**
27
+ * ArrowDown/ArrowUp — 코드블록 가장자리 줄 탈출 (Tiptap
28
+ * exitOnArrowDown/Up 관례). 마지막 줄에서 ArrowDown을 누르면 블록
29
+ * 뒤로, 첫 줄에서 ArrowUp이면 블록 앞으로 나간다 — 이웃 블록이
30
+ * 없으면 빈 문단을 만든다. Notion의 코드블록 화살표 탈출과 같다.
31
+ */
32
+ export declare function exitCodeArrow(direction: "up" | "down"): Command;
33
+ /**
34
+ * Mod-/ — 코드블록 줄 주석 토글 (Ace toggleCommentLines 관례).
35
+ * 걸친 줄이 전부 주석이면 해제, 아니면 주석을 단다 — 마커는
36
+ * 선행 공백 뒤에 붙어 들여쓰기가 보존된다 (VS Code 관례).
37
+ * 블록 주석 언어(css/html 등)는 줄마다 블록 마커로 감싼다.
38
+ */
39
+ export declare const toggleCodeComment: Command;
40
+ /**
41
+ * Alt-↑/↓ — 선택이 걸친 줄들을 위/아래 한 줄 이동 (Ace movelines·
42
+ * VS Code 관례). 첫/마지막 줄 가장자리에선 false로 폴스루한다.
43
+ */
44
+ export declare function moveCodeLines(direction: "up" | "down"): Command;
45
+ /**
46
+ * Mod-Shift-D — 선택이 걸친 줄들을 바로 아래에 복제
47
+ * (Ace duplicateSelection 관례). 사본이 선택된다.
48
+ */
49
+ export declare const duplicateCodeLines: Command;
50
+ //# sourceMappingURL=code-edit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-edit.d.ts","sourceRoot":"","sources":["../../src/features/code-edit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAmBtD;;;;GAIG;AAGH;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CA4BlE;AAED,qDAAqD;AACrD,eAAO,MAAM,UAAU,EAAE,OAIxB,CAAC;AAOF;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,OAuCxB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,UAAU,EAAE,OA0CxB,CAAC;AACF;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,IAAI,GAAG,MAAM,GAAG,OAAO,CA+B/D;AA0CD;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,EAAE,OAsH/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"}
@@ -0,0 +1,412 @@
1
+ import { firstTextPath, nodeAt } from "../model/traverse.js";
2
+ import { leafPoint } from "../state/apply.js";
3
+ import { normalizedRange, textSelection } from "../state/selection.js";
4
+ import { applyCharOps, charOffset, charPoint, codeContext, codeLineRange, codeSelectionContexts, lineStarts, shiftCharOff, } from "./code-context.js";
5
+ import { formatCodeText } from "./code-format.js";
6
+ /**
7
+ * 코드블록 편집 커맨드 — 들여쓰기·주석 토글·줄 이동/복제·화살표
8
+ * 탈출·서식 정리 래퍼 (Ace/VS Code 관례). 컨텍스트 해석은
9
+ * code-context.ts, 텍스트 변환 엔진은 code-format.ts에 있다.
10
+ */
11
+ // ── 서식 정리 커맨드 (VS Code Format Document 관례) ─────────
12
+ /**
13
+ * 경로로 지정한 코드블록 서식 정리 — 노드 뷰 크롬 바처럼 캐럿과
14
+ * 무관하게 특정 블록을 정리할 때 쓴다. 이 블록 안의 셀렉션
15
+ * 엔드포인트는 새 텍스트 길이로 클램프해 보존한다.
16
+ */
17
+ export function formatCodeAt(blockPath) {
18
+ return ({ state, tr, dispatch }) => {
19
+ const block = nodeAt(state.doc, blockPath);
20
+ if (!block || !state.schema.nodeSpec(block.type)?.code)
21
+ return false;
22
+ const text = (block.content ?? []).map((c) => c.text ?? "").join("");
23
+ const formatted = formatCodeText(text, String(block.attrs?.["language"] ?? ""));
24
+ if (formatted == null)
25
+ return false;
26
+ const next = {
27
+ ...block,
28
+ content: [{ type: "text", text: formatted }],
29
+ };
30
+ tr.replaceNode(blockPath, next);
31
+ const sel = state.selection;
32
+ if (sel.type === "text") {
33
+ const fix = (p) => {
34
+ const off = charOffset(block, blockPath, leafPoint(state.doc, p));
35
+ return off == null
36
+ ? p
37
+ : charPoint(next, blockPath, Math.min(off, formatted.length));
38
+ };
39
+ tr.setSelection(textSelection(fix(sel.anchor), fix(sel.focus)));
40
+ }
41
+ dispatch();
42
+ return true;
43
+ };
44
+ }
45
+ /** 캐럿 코드블록 서식 정리 — Shift-Alt-F/정리 버튼 (VS Code 관례) */
46
+ export const formatCode = (ctx) => {
47
+ const c = codeContext(ctx.state);
48
+ if (!c)
49
+ return false;
50
+ return formatCodeAt(c.blockPath)(ctx);
51
+ };
52
+ const CODE_TAB = "\t";
53
+ const CODE_TAB_SIZE = 4;
54
+ // ── 들여쓰기 (VS Code 관례) ───────────────────────────────
55
+ /**
56
+ * Tab — 코드블록 들여쓰기. collapsed면 캐럿에 \t 삽입,
57
+ * 범위 선택이면 걸친 줄 전부의 앞에 \t를 단다 (VS Code 관례).
58
+ * 코드블록 밖이면 false — 리스트/표 키바인딩으로 폴스루.
59
+ */
60
+ export const indentCode = ({ state, tr, dispatch }) => {
61
+ const ctx = codeContext(state);
62
+ if (!ctx)
63
+ return false;
64
+ const { blockPath, block, text, from, to } = ctx;
65
+ if (from === to) {
66
+ const at = charPoint(block, blockPath, from);
67
+ tr.insertText(CODE_TAB, at);
68
+ // 삽입 후 길이로 해석해야 from+1이 삽입 전 길이에 클램프되지 않는다
69
+ const kidIdx = at.path[at.path.length - 1];
70
+ const lens = (block.content ?? []).map((k, i) => (k.text?.length ?? 0) + (i === kidIdx ? 1 : 0));
71
+ tr.setSelection(textSelection(charPoint(block, blockPath, from + 1, lens)));
72
+ dispatch();
73
+ return true;
74
+ }
75
+ // 걸친 줄들의 시작 — 'to'가 정확히 줄 시작이면 그 줄은 제외
76
+ const starts = lineStarts(text);
77
+ const start0 = Math.max(...starts.filter((s) => s <= from));
78
+ const covered = starts.filter((s) => s >= start0 && s < to);
79
+ if (!covered.length)
80
+ return false;
81
+ // 뒤쪽 줄부터 삽입해야 앞쪽 좌표가 안 밀린다
82
+ const kids = block.content ?? [];
83
+ const extra = kids.map(() => 0);
84
+ for (const s of [...covered].sort((a, b) => b - a)) {
85
+ const p = charPoint(block, blockPath, s);
86
+ tr.insertText(CODE_TAB, p);
87
+ extra[p.path[p.path.length - 1]] += 1;
88
+ }
89
+ const lens = kids.map((k, i) => (k.text?.length ?? 0) + extra[i]);
90
+ const shift = (off) => off + covered.filter((s) => s <= off).length;
91
+ tr.setSelection(textSelection(charPoint(block, blockPath, shift(from), lens), charPoint(block, blockPath, shift(to), lens)));
92
+ dispatch();
93
+ return true;
94
+ };
95
+ /**
96
+ * Shift-Tab — 코드블록 내어쓰기. 걸친 각 줄의 앞에서 \t 하나 또는
97
+ * 스페이스 최대 tabSize개를 지운다. 코드블록 밖이면 false로 폴스루.
98
+ */
99
+ export const dedentCode = ({ state, tr, dispatch }) => {
100
+ const ctx = codeContext(state);
101
+ if (!ctx)
102
+ return false;
103
+ const { blockPath, block, text, from, to } = ctx;
104
+ const starts = lineStarts(text);
105
+ const start0 = Math.max(...starts.filter((s) => s <= from));
106
+ // 각 줄에서 지울 들여쓰기 — \t 하나 또는 앞쪽 연속 스페이스 최대 tabSize개
107
+ const edits = starts
108
+ .filter((s) => s >= start0 && (from === to ? s <= from : s < to))
109
+ .map((s) => {
110
+ let n = 0;
111
+ if (text[s] === CODE_TAB)
112
+ n = 1;
113
+ else
114
+ while (n < CODE_TAB_SIZE && text[s + n] === " ")
115
+ n++;
116
+ return { s, n };
117
+ })
118
+ .filter((e) => e.n > 0);
119
+ // 코드블록 안인데 지울 들여쓰기가 없으면 그냥 삼킨다 — false로
120
+ // 폴스루하면 브라우저가 포커스를 에디터 밖으로 옮긴다 (Ace/VS Code는 no-op)
121
+ if (!edits.length)
122
+ return true;
123
+ const kids = block.content ?? [];
124
+ const extra = kids.map(() => 0);
125
+ for (const { s, n } of [...edits].sort((a, b) => b.s - a.s)) {
126
+ const a = charPoint(block, blockPath, s);
127
+ tr.delete({
128
+ anchor: a,
129
+ focus: { path: a.path, offset: a.offset + n },
130
+ });
131
+ extra[a.path[a.path.length - 1]] -= n;
132
+ }
133
+ const lens = kids.map((k, i) => (k.text?.length ?? 0) + extra[i]);
134
+ // 지워진 들여쓰기만큼 좌표를 당긴다 — 줄 시작(s === off) 위치의
135
+ // 캐럿은 들여쓰기 앞에 머문다 (s < off 기준)
136
+ const shift = (off) => Math.max(0, off - edits.reduce((d, e) => d + (e.s < off ? e.n : 0), 0));
137
+ tr.setSelection(textSelection(charPoint(block, blockPath, shift(from), lens), charPoint(block, blockPath, shift(to), lens)));
138
+ dispatch();
139
+ return true;
140
+ };
141
+ /**
142
+ * ArrowDown/ArrowUp — 코드블록 가장자리 줄 탈출 (Tiptap
143
+ * exitOnArrowDown/Up 관례). 마지막 줄에서 ArrowDown을 누르면 블록
144
+ * 뒤로, 첫 줄에서 ArrowUp이면 블록 앞으로 나간다 — 이웃 블록이
145
+ * 없으면 빈 문단을 만든다. Notion의 코드블록 화살표 탈출과 같다.
146
+ */
147
+ export function exitCodeArrow(direction) {
148
+ return ({ state, tr, dispatch }) => {
149
+ const ctx = codeContext(state);
150
+ if (!ctx || ctx.from !== ctx.to)
151
+ return false;
152
+ const { blockPath, text, from } = ctx;
153
+ const onEdge = direction === "down"
154
+ ? !text.slice(from).includes("\n")
155
+ : !text.slice(0, from).includes("\n");
156
+ if (!onEdge)
157
+ return false;
158
+ const parentPath = blockPath.slice(0, -1);
159
+ const bi = blockPath[blockPath.length - 1];
160
+ const si = direction === "down" ? bi + 1 : bi - 1;
161
+ const sib = si >= 0 ? nodeAt(state.doc, [...parentPath, si]) : undefined;
162
+ if (sib) {
163
+ const tp = direction === "down" ? firstTextPath(sib) : null;
164
+ const sp = tp ? [...parentPath, si, ...tp] : [...parentPath, si];
165
+ tr.setSelection(textSelection({ path: sp, offset: 0 }));
166
+ dispatch();
167
+ return true;
168
+ }
169
+ // 이웃이 없으면 빈 문단을 만들어 탈출 — bi=0에서 ArrowUp이면
170
+ // 코드블록 앞에, 끝에서 ArrowDown이면 뒤에 놓인다
171
+ const at = { path: parentPath, offset: direction === "down" ? bi + 1 : bi };
172
+ tr.insertNode(at, { type: "paragraph", content: [] });
173
+ tr.setSelection(textSelection({ path: [...at.path, at.offset], offset: 0 }));
174
+ dispatch();
175
+ return true;
176
+ };
177
+ }
178
+ // ── 코드 편집 명령 — 주석 토글·줄 이동/복제 (Ace 관례) ──────
179
+ /** 언어 → 주석 문법. 문자열=줄 주석, 쌍=블록 래핑 (Ace mode 주석 관례) */
180
+ const CODE_COMMENT = {
181
+ py: "#",
182
+ python: "#",
183
+ rb: "#",
184
+ ruby: "#",
185
+ pl: "#",
186
+ perl: "#",
187
+ sh: "#",
188
+ bash: "#",
189
+ zsh: "#",
190
+ shell: "#",
191
+ yaml: "#",
192
+ yml: "#",
193
+ toml: "#",
194
+ ini: "#",
195
+ dockerfile: "#",
196
+ makefile: "#",
197
+ make: "#",
198
+ r: "#",
199
+ coffee: "#",
200
+ ps1: "#",
201
+ powershell: "#",
202
+ nim: "#",
203
+ sql: "--",
204
+ lua: "--",
205
+ haskell: "--",
206
+ hs: "--",
207
+ ada: "--",
208
+ css: ["/*", "*/"],
209
+ scss: ["/*", "*/"],
210
+ less: ["/*", "*/"],
211
+ html: ["<!--", "-->"],
212
+ xml: ["<!--", "-->"],
213
+ svg: ["<!--", "-->"],
214
+ md: ["<!--", "-->"],
215
+ markdown: ["<!--", "-->"],
216
+ };
217
+ /**
218
+ * Mod-/ — 코드블록 줄 주석 토글 (Ace toggleCommentLines 관례).
219
+ * 걸친 줄이 전부 주석이면 해제, 아니면 주석을 단다 — 마커는
220
+ * 선행 공백 뒤에 붙어 들여쓰기가 보존된다 (VS Code 관례).
221
+ * 블록 주석 언어(css/html 등)는 줄마다 블록 마커로 감싼다.
222
+ */
223
+ export const toggleCodeComment = ({ state, tr, dispatch }) => {
224
+ // 선택과 겹치는 모든 코드 블록에 적용 — 전체 선택(Mod-A)이 여러
225
+ // 블록을 걸쳐도 코드 구간을 빠뜨리지 않는다 (VS Code 관례)
226
+ const ctxs = codeSelectionContexts(state);
227
+ if (!ctxs.length)
228
+ return false;
229
+ const parts = ctxs.map((ctx) => {
230
+ const lang = String(ctx.block.attrs?.["language"] ?? "").toLowerCase();
231
+ const lines = ctx.text.split("\n");
232
+ const [lo, hi] = codeLineRange(ctx.text, ctx.from, ctx.to);
233
+ return {
234
+ ctx,
235
+ syn: CODE_COMMENT[lang] ?? "//",
236
+ lines,
237
+ starts: lineStarts(ctx.text),
238
+ indent: (i) => lines[i].match(/^[ \t]*/)[0].length,
239
+ idx: Array.from({ length: hi - lo + 1 }, (_, k) => lo + k).filter((i) => lines[i].trim().length > 0),
240
+ };
241
+ });
242
+ if (!parts.some((p) => p.idx.length))
243
+ return false;
244
+ // 전부 주석이면 해제, 하나라도 아니면 주석 (블록을 넘나드는 선택도
245
+ // 같은 규칙 — VS Code는 선택 전체 기준으로 토글한다)
246
+ const commentedOf = (p, i) => {
247
+ const t = p.lines[i].slice(p.indent(i));
248
+ return typeof p.syn === "string"
249
+ ? t.startsWith(p.syn)
250
+ : t.trimEnd().startsWith(p.syn[0]) &&
251
+ t.trimEnd().endsWith(p.syn[1]) &&
252
+ t.trimEnd().length > p.syn[0].length + p.syn[1].length;
253
+ };
254
+ const allCommented = parts.every((p) => p.idx.every((i) => commentedOf(p, i)));
255
+ const edits = parts.map((p) => {
256
+ const { ctx, syn, lines, starts, idx, indent } = p;
257
+ const ops = [];
258
+ if (typeof syn === "string") {
259
+ if (allCommented) {
260
+ for (const i of idx) {
261
+ if (!commentedOf(p, i))
262
+ continue;
263
+ let n = syn.length;
264
+ if (lines[i][indent(i) + syn.length] === " ")
265
+ n += 1;
266
+ ops.push({ pos: starts[i] + indent(i), del: n });
267
+ }
268
+ }
269
+ else {
270
+ for (const i of idx) {
271
+ ops.push({ pos: starts[i] + indent(i), ins: `${syn} ` });
272
+ }
273
+ }
274
+ }
275
+ else {
276
+ const [o, c] = syn;
277
+ if (allCommented) {
278
+ for (const i of idx) {
279
+ if (!commentedOf(p, i))
280
+ continue;
281
+ const bp = starts[i] + indent(i);
282
+ const t = lines[i].slice(indent(i));
283
+ let open = o.length;
284
+ if (t[o.length] === " ")
285
+ open += 1;
286
+ const te = t.trimEnd().length;
287
+ let cs = te - c.length;
288
+ if (t[cs - 1] === " ")
289
+ cs -= 1;
290
+ ops.push({ pos: bp, del: open });
291
+ ops.push({ pos: bp + cs, del: te - cs });
292
+ }
293
+ }
294
+ else {
295
+ for (const i of idx) {
296
+ const bp = starts[i] + indent(i);
297
+ const te = lines[i].trimEnd().length;
298
+ ops.push({ pos: bp, ins: `${o} ` });
299
+ ops.push({ pos: bp + te, ins: ` ${c}` });
300
+ }
301
+ }
302
+ }
303
+ return ops;
304
+ });
305
+ const lens = parts.map((p, i) => applyCharOps(tr, p.ctx.block, p.ctx.blockPath, edits[i]));
306
+ // 셀렉션 복원 — 코드블록 안 엔드포인트는 삽입/삭제만큼 옮기고,
307
+ // 바깥(전체 선택의 비코드 쪽) 엔드포인트는 원래 위치를 유지한다
308
+ if (state.selection.type !== "text")
309
+ return false;
310
+ const selR = normalizedRange(state.selection);
311
+ const remap = (leaf) => {
312
+ // 리프가 어느 코드블록 서브트리에 속하는지 — 중첩 블록은
313
+ // 톱레벨 인덱스가 같을 수 있으니 경로 접두어로 판정한다
314
+ const pi = parts.findIndex((p) => leaf.path.length >= p.ctx.blockPath.length &&
315
+ p.ctx.blockPath.every((v, i) => v === leaf.path[i]));
316
+ if (pi < 0)
317
+ return leaf;
318
+ const p = parts[pi];
319
+ const off = charOffset(p.ctx.block, p.ctx.blockPath, leaf);
320
+ if (off == null)
321
+ return leaf;
322
+ return charPoint(p.ctx.block, p.ctx.blockPath, shiftCharOff(edits[pi], off), lens[pi]);
323
+ };
324
+ tr.setSelection(textSelection(remap(leafPoint(state.doc, selR.anchor)), remap(leafPoint(state.doc, selR.focus))));
325
+ dispatch();
326
+ return true;
327
+ };
328
+ /**
329
+ * Alt-↑/↓ — 선택이 걸친 줄들을 위/아래 한 줄 이동 (Ace movelines·
330
+ * VS Code 관례). 첫/마지막 줄 가장자리에선 false로 폴스루한다.
331
+ */
332
+ export function moveCodeLines(direction) {
333
+ return ({ state, tr, dispatch }) => {
334
+ const ctx = codeContext(state);
335
+ if (!ctx)
336
+ return false;
337
+ const { blockPath, block, text, from, to } = ctx;
338
+ const lines = text.split("\n");
339
+ const starts = lineStarts(text);
340
+ const [lo, hi] = codeLineRange(text, from, to);
341
+ const sA = starts[lo];
342
+ // sB는 다음 줄 시작 — 블록과 사이의 개행은 sB-1에 있다
343
+ const sB = hi + 1 < lines.length ? starts[hi + 1] : text.length;
344
+ let ops;
345
+ let delta;
346
+ if (direction === "up") {
347
+ if (lo === 0)
348
+ return false;
349
+ const prev = lines[lo - 1];
350
+ const pStart = starts[lo - 1];
351
+ ops =
352
+ sB === text.length
353
+ ? // 블록이 마지막 줄 — "block\nprev"가 되도록 끝에 붙인다
354
+ [
355
+ { pos: sB, ins: `\n${prev}` },
356
+ { pos: pStart, del: sA - pStart },
357
+ ]
358
+ : // 다음 줄 시작(sB)에 "prev\n"을 끼운다 — 블록 뒤 개행(sB-1)이
359
+ // block과 prev를 자연스럽게 이어준다
360
+ [
361
+ { pos: sB, ins: `${prev}\n` },
362
+ { pos: pStart, del: sA - pStart },
363
+ ];
364
+ delta = -(prev.length + 1);
365
+ }
366
+ else {
367
+ if (hi === lines.length - 1)
368
+ return false;
369
+ const next = lines[hi + 1];
370
+ const nextLast = hi + 1 === lines.length - 1;
371
+ ops = nextLast
372
+ ? // 다음 줄이 끝줄 — 앞 개행 포함 "\nnext"를 통째로 지운다
373
+ [
374
+ { pos: sB - 1, del: next.length + 1 },
375
+ { pos: sA, ins: `${next}\n` },
376
+ ]
377
+ : [
378
+ { pos: sB, del: next.length + 1 },
379
+ { pos: sA, ins: `${next}\n` },
380
+ ];
381
+ delta = next.length + 1;
382
+ }
383
+ const lens = applyCharOps(tr, block, blockPath, ops);
384
+ tr.setSelection(textSelection(charPoint(block, blockPath, from + delta, lens), charPoint(block, blockPath, to + delta, lens)));
385
+ dispatch();
386
+ return true;
387
+ };
388
+ }
389
+ /**
390
+ * Mod-Shift-D — 선택이 걸친 줄들을 바로 아래에 복제
391
+ * (Ace duplicateSelection 관례). 사본이 선택된다.
392
+ */
393
+ export const duplicateCodeLines = ({ state, tr, dispatch }) => {
394
+ const ctx = codeContext(state);
395
+ if (!ctx)
396
+ return false;
397
+ const { blockPath, block, text, from, to } = ctx;
398
+ const starts = lineStarts(text);
399
+ const [lo, hi] = codeLineRange(text, from, to);
400
+ const sA = starts[lo];
401
+ // sB는 다음 줄 시작 — 줄 텍스트는 [sA, sB-1) (sB-1이 개행)
402
+ const sB = hi + 1 < starts.length ? starts[hi + 1] : text.length;
403
+ const tail = sB === text.length;
404
+ const dup = text.slice(sA, tail ? sB : sB - 1);
405
+ const ops = [{ pos: sB, ins: tail ? `\n${dup}` : `${dup}\n` }];
406
+ const cs = tail ? sB + 1 : sB;
407
+ const lens = applyCharOps(tr, block, blockPath, ops);
408
+ tr.setSelection(textSelection(charPoint(block, blockPath, from - sA + cs, lens), charPoint(block, blockPath, to - sA + cs, lens)));
409
+ dispatch();
410
+ return true;
411
+ };
412
+ //# sourceMappingURL=code-edit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-edit.js","sourceRoot":"","sources":["../../src/features/code-edit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * 코드 서식 정리 엔진 — 순수 텍스트 변환만 담당한다
3
+ * (doc/EditorState를 모른다). 커맨드 래퍼는 code-edit.ts에 있다.
4
+ */
5
+ /**
6
+ * 코드 서식 정리 — 언어 서버 없이 안전한 수준만 한다:
7
+ * - 언어가 json이거나(미지정이고 {/[ 로 시작할 때) JSON으로 파싱되면
8
+ * 2칸 pretty-print
9
+ * - 중괄호 계열(js/ts/java/c/go/rust/php/css…): 브래킷 깊이로
10
+ * 재들여쓰기 — 문자열·주석·템플릿·정규식 안의 기호는 세지 않는다
11
+ * - 마크업(html/xml/vue/svelte): 태그 깊이로 재들여쓰기
12
+ * - 쉘(sh/bash): if/fi·do/done·case/esac·{} 블록으로 재들여쓰기
13
+ * - sql: 예약어 대문자화
14
+ * - 모든 언어: 줄 끝 공백 제거 + 3개 이상 연속 빈 줄을 2개로 +
15
+ * 파일 끝 빈 줄 제거 (EditorConfig/prettier 공통 규칙)
16
+ * 들여쓰기 단위는 기존 코드에서 추정하고 없으면 2칸. 줄 구조는 바꾸지
17
+ * 않는다 — 선행 공백만 다시 쓰는 수준이라 깨진 코드에서도 안전하다.
18
+ * 바뀔 게 없으면 null.
19
+ */
20
+ export declare function formatCodeText(code: string, language: string): string | null;
21
+ //# sourceMappingURL=code-format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-format.d.ts","sourceRoot":"","sources":["../../src/features/code-format.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA4VH;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAgC5E"}