@moda-editor/core 0.1.3 → 0.2.0

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 (252) 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 +304 -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 +169 -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 +345 -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/editor.d.ts.map +1 -1
  54. package/dist/editor/editor.js +18 -1
  55. package/dist/editor/editor.js.map +1 -1
  56. package/dist/editor/extension.d.ts +47 -3
  57. package/dist/editor/extension.d.ts.map +1 -1
  58. package/dist/features/ace.d.ts +4 -0
  59. package/dist/features/ace.d.ts.map +1 -1
  60. package/dist/features/ace.js +59 -20
  61. package/dist/features/ace.js.map +1 -1
  62. package/dist/features/block-dnd.d.ts +7 -0
  63. package/dist/features/block-dnd.d.ts.map +1 -0
  64. package/dist/features/block-dnd.js +207 -0
  65. package/dist/features/block-dnd.js.map +1 -0
  66. package/dist/features/code-block.d.ts +9 -84
  67. package/dist/features/code-block.d.ts.map +1 -1
  68. package/dist/features/code-block.js +84 -1034
  69. package/dist/features/code-block.js.map +1 -1
  70. package/dist/features/code-context.d.ts +81 -0
  71. package/dist/features/code-context.d.ts.map +1 -0
  72. package/dist/features/code-context.js +322 -0
  73. package/dist/features/code-context.js.map +1 -0
  74. package/dist/features/code-edit.d.ts +50 -0
  75. package/dist/features/code-edit.d.ts.map +1 -0
  76. package/dist/features/code-edit.js +412 -0
  77. package/dist/features/code-edit.js.map +1 -0
  78. package/dist/features/code-format.d.ts +21 -0
  79. package/dist/features/code-format.d.ts.map +1 -0
  80. package/dist/features/code-format.js +410 -0
  81. package/dist/features/code-format.js.map +1 -0
  82. package/dist/features/doc.d.ts +16 -0
  83. package/dist/features/doc.d.ts.map +1 -1
  84. package/dist/features/doc.js +154 -2
  85. package/dist/features/doc.js.map +1 -1
  86. package/dist/features/heading.d.ts.map +1 -1
  87. package/dist/features/heading.js.map +1 -1
  88. package/dist/features/image.d.ts +3 -1
  89. package/dist/features/image.d.ts.map +1 -1
  90. package/dist/features/image.js +27 -9
  91. package/dist/features/image.js.map +1 -1
  92. package/dist/features/index.d.ts +7 -0
  93. package/dist/features/index.d.ts.map +1 -1
  94. package/dist/features/index.js +16 -0
  95. package/dist/features/index.js.map +1 -1
  96. package/dist/features/inline-style.d.ts.map +1 -1
  97. package/dist/features/inline-style.js +4 -1
  98. package/dist/features/inline-style.js.map +1 -1
  99. package/dist/features/link.d.ts.map +1 -1
  100. package/dist/features/link.js +1 -1
  101. package/dist/features/link.js.map +1 -1
  102. package/dist/features/markdown.d.ts +15 -0
  103. package/dist/features/markdown.d.ts.map +1 -0
  104. package/dist/features/markdown.js +80 -0
  105. package/dist/features/markdown.js.map +1 -0
  106. package/dist/features/marks.d.ts.map +1 -1
  107. package/dist/features/marks.js +49 -4
  108. package/dist/features/marks.js.map +1 -1
  109. package/dist/features/mention.d.ts +30 -0
  110. package/dist/features/mention.d.ts.map +1 -0
  111. package/dist/features/mention.js +89 -0
  112. package/dist/features/mention.js.map +1 -0
  113. package/dist/features/script.d.ts.map +1 -1
  114. package/dist/features/script.js.map +1 -1
  115. package/dist/features/search.d.ts +76 -0
  116. package/dist/features/search.d.ts.map +1 -0
  117. package/dist/features/search.js +281 -0
  118. package/dist/features/search.js.map +1 -0
  119. package/dist/features/shared.d.ts +69 -0
  120. package/dist/features/shared.d.ts.map +1 -0
  121. package/dist/features/shared.js +272 -0
  122. package/dist/features/shared.js.map +1 -0
  123. package/dist/features/table.d.ts.map +1 -1
  124. package/dist/features/table.js +17 -3
  125. package/dist/features/table.js.map +1 -1
  126. package/dist/features/testkit.d.ts.map +1 -1
  127. package/dist/features/testkit.js +1 -1
  128. package/dist/features/testkit.js.map +1 -1
  129. package/dist/history.d.ts.map +1 -1
  130. package/dist/history.js +65 -20
  131. package/dist/history.js.map +1 -1
  132. package/dist/index.d.ts +21 -7
  133. package/dist/index.d.ts.map +1 -1
  134. package/dist/index.js +18 -6
  135. package/dist/index.js.map +1 -1
  136. package/dist/model/schema.d.ts.map +1 -1
  137. package/dist/model/schema.js +2 -1
  138. package/dist/model/schema.js.map +1 -1
  139. package/dist/parse/html.d.ts.map +1 -1
  140. package/dist/parse/html.js +38 -6
  141. package/dist/parse/html.js.map +1 -1
  142. package/dist/parse/sanitize.d.ts.map +1 -1
  143. package/dist/parse/sanitize.js +4 -1
  144. package/dist/parse/sanitize.js.map +1 -1
  145. package/dist/presets/highlight.d.ts.map +1 -1
  146. package/dist/presets/highlight.js +1 -4
  147. package/dist/presets/highlight.js.map +1 -1
  148. package/dist/presets/markdown-parse.d.ts +13 -0
  149. package/dist/presets/markdown-parse.d.ts.map +1 -0
  150. package/dist/presets/markdown-parse.js +398 -0
  151. package/dist/presets/markdown-parse.js.map +1 -0
  152. package/dist/presets/markdown.d.ts +46 -0
  153. package/dist/presets/markdown.d.ts.map +1 -0
  154. package/dist/presets/markdown.js +196 -0
  155. package/dist/presets/markdown.js.map +1 -0
  156. package/dist/state/apply.d.ts.map +1 -1
  157. package/dist/state/apply.js +25 -13
  158. package/dist/state/apply.js.map +1 -1
  159. package/dist/state/delete-ops.d.ts +34 -0
  160. package/dist/state/delete-ops.d.ts.map +1 -0
  161. package/dist/state/delete-ops.js +204 -0
  162. package/dist/state/delete-ops.js.map +1 -0
  163. package/dist/state/input-rules.d.ts +30 -0
  164. package/dist/state/input-rules.d.ts.map +1 -0
  165. package/dist/state/input-rules.js +70 -0
  166. package/dist/state/input-rules.js.map +1 -0
  167. package/dist/state/insert-ops.d.ts +54 -0
  168. package/dist/state/insert-ops.d.ts.map +1 -0
  169. package/dist/state/insert-ops.js +186 -0
  170. package/dist/state/insert-ops.js.map +1 -0
  171. package/dist/state/list-ops.d.ts +46 -0
  172. package/dist/state/list-ops.d.ts.map +1 -0
  173. package/dist/state/list-ops.js +231 -0
  174. package/dist/state/list-ops.js.map +1 -0
  175. package/dist/state/navigate.d.ts.map +1 -1
  176. package/dist/state/navigate.js +3 -1
  177. package/dist/state/navigate.js.map +1 -1
  178. package/dist/state/resolve-insert.d.ts +55 -0
  179. package/dist/state/resolve-insert.d.ts.map +1 -0
  180. package/dist/state/resolve-insert.js +118 -0
  181. package/dist/state/resolve-insert.js.map +1 -0
  182. package/dist/state/slice-ops.d.ts +46 -0
  183. package/dist/state/slice-ops.d.ts.map +1 -0
  184. package/dist/state/slice-ops.js +150 -0
  185. package/dist/state/slice-ops.js.map +1 -0
  186. package/dist/state/state.d.ts +6 -1
  187. package/dist/state/state.d.ts.map +1 -1
  188. package/dist/state/state.js +10 -0
  189. package/dist/state/state.js.map +1 -1
  190. package/dist/state/transaction.d.ts +43 -49
  191. package/dist/state/transaction.d.ts.map +1 -1
  192. package/dist/state/transaction.js +62 -858
  193. package/dist/state/transaction.js.map +1 -1
  194. package/dist/styles.css +401 -213
  195. package/dist/theme.d.ts +29 -0
  196. package/dist/theme.d.ts.map +1 -0
  197. package/dist/theme.js +347 -0
  198. package/dist/theme.js.map +1 -0
  199. package/dist/view/adapter.d.ts +84 -0
  200. package/dist/view/adapter.d.ts.map +1 -0
  201. package/dist/view/adapter.js +76 -0
  202. package/dist/view/adapter.js.map +1 -0
  203. package/dist/view/caret.d.ts +25 -0
  204. package/dist/view/caret.d.ts.map +1 -0
  205. package/dist/view/caret.js +43 -0
  206. package/dist/view/caret.js.map +1 -0
  207. package/dist/view/decoration.d.ts +9 -0
  208. package/dist/view/decoration.d.ts.map +1 -0
  209. package/dist/view/decoration.js +214 -0
  210. package/dist/view/decoration.js.map +1 -0
  211. package/dist/view/dirty-keys.d.ts +18 -0
  212. package/dist/view/dirty-keys.d.ts.map +1 -0
  213. package/dist/view/dirty-keys.js +31 -0
  214. package/dist/view/dirty-keys.js.map +1 -0
  215. package/dist/view/dom.d.ts.map +1 -1
  216. package/dist/view/dom.js +7 -5
  217. package/dist/view/dom.js.map +1 -1
  218. package/dist/view/hook-ctx.d.ts +32 -0
  219. package/dist/view/hook-ctx.d.ts.map +1 -0
  220. package/dist/view/hook-ctx.js +64 -0
  221. package/dist/view/hook-ctx.js.map +1 -0
  222. package/dist/view/ime.d.ts +72 -0
  223. package/dist/view/ime.d.ts.map +1 -0
  224. package/dist/view/ime.js +185 -0
  225. package/dist/view/ime.js.map +1 -0
  226. package/dist/view/input.d.ts +12 -12
  227. package/dist/view/input.d.ts.map +1 -1
  228. package/dist/view/input.js +156 -535
  229. package/dist/view/input.js.map +1 -1
  230. package/dist/view/keys.d.ts +25 -0
  231. package/dist/view/keys.d.ts.map +1 -0
  232. package/dist/view/keys.js +106 -0
  233. package/dist/view/keys.js.map +1 -0
  234. package/dist/view/line-nav.d.ts +13 -0
  235. package/dist/view/line-nav.d.ts.map +1 -0
  236. package/dist/view/line-nav.js +114 -0
  237. package/dist/view/line-nav.js.map +1 -0
  238. package/dist/view/mount.d.ts.map +1 -1
  239. package/dist/view/mount.js +43 -39
  240. package/dist/view/mount.js.map +1 -1
  241. package/dist/view/node-selection.d.ts +33 -0
  242. package/dist/view/node-selection.d.ts.map +1 -0
  243. package/dist/view/node-selection.js +107 -0
  244. package/dist/view/node-selection.js.map +1 -0
  245. package/dist/view/render.d.ts +4 -1
  246. package/dist/view/render.d.ts.map +1 -1
  247. package/dist/view/render.js +22 -3
  248. package/dist/view/render.js.map +1 -1
  249. package/dist/view/serialize.d.ts.map +1 -1
  250. package/dist/view/serialize.js +14 -5
  251. package/dist/view/serialize.js.map +1 -1
  252. package/package.json +1 -1
@@ -0,0 +1,410 @@
1
+ /**
2
+ * 코드 서식 정리 엔진 — 순수 텍스트 변환만 담당한다
3
+ * (doc/EditorState를 모른다). 커맨드 래퍼는 code-edit.ts에 있다.
4
+ */
5
+ /** 문자열·주석·정규식을 공백으로 마스킹.
6
+ * 블록 주석·템플릿 리터럴은 줄을 넘나드는 상태 머신으로 처리하고,
7
+ * 템플릿의 `${`/`}`는 `{`/`}`로 남겨 안쪽 식의 들여쓰기도 잡는다. */
8
+ function maskCode(src) {
9
+ const modes = ["code"];
10
+ const out = src.split("");
11
+ const interior = [];
12
+ let lineNo = 0;
13
+ let prevSig = ""; // 정규식 vs 나누기 판별용 — 마지막 유의미 문자
14
+ let rxClass = false;
15
+ for (let i = 0; i < src.length; i++) {
16
+ const c = src[i];
17
+ const n = src[i + 1] ?? "";
18
+ const top = modes[modes.length - 1];
19
+ const blank = () => {
20
+ out[i] = " ";
21
+ };
22
+ if (c === "\n") {
23
+ lineNo++;
24
+ // 다음 줄이 여러 줄 구문의 "본문"에서 시작하는지 기록 —
25
+ // 'line' 주석은 \n에서 끝나고 sq/dq/rx도 줄 끝에서 닫히므로
26
+ // 남는 다중줄 모드(block/tmpl 또는 tmpl 안 code)만 본다
27
+ const next = modes.filter((m) => m === "block" || m === "tmpl").length > 0 &&
28
+ !(modes.length > 1 && modes[modes.length - 1] === "code");
29
+ if (next)
30
+ interior[lineNo] = true;
31
+ }
32
+ switch (top) {
33
+ case "line":
34
+ if (c === "\n")
35
+ modes.pop();
36
+ else
37
+ blank();
38
+ break;
39
+ case "block":
40
+ if (c === "*" && n === "/") {
41
+ blank();
42
+ out[++i] = " ";
43
+ modes.pop();
44
+ }
45
+ else if (c !== "\n")
46
+ blank();
47
+ break;
48
+ case "sq":
49
+ case "dq": {
50
+ const q = top === "sq" ? "'" : '"';
51
+ if (c === "\n")
52
+ modes.pop(); // 미닫힘 문자열 — 개행은 유지
53
+ else {
54
+ blank();
55
+ if (c === "\\")
56
+ out[++i] = " ";
57
+ else if (c === q)
58
+ modes.pop();
59
+ }
60
+ break;
61
+ }
62
+ case "tmpl":
63
+ if (c === "\\") {
64
+ blank();
65
+ out[++i] = " ";
66
+ }
67
+ else if (c === "`") {
68
+ blank();
69
+ modes.pop();
70
+ }
71
+ else if (c === "$" && n === "{") {
72
+ // ${ 식 — 코드 구간으로 돌아간다. 여는 기호는 { 로 남긴다
73
+ blank();
74
+ out[++i] = "{";
75
+ modes.push("code");
76
+ }
77
+ else if (c !== "\n")
78
+ blank();
79
+ break;
80
+ case "rx":
81
+ if (c === "\n")
82
+ modes.pop(); // 미닫힘 정규식 — 개행은 유지
83
+ else {
84
+ blank();
85
+ if (c === "\\")
86
+ out[++i] = " ";
87
+ else if (c === "[")
88
+ rxClass = true;
89
+ else if (c === "]")
90
+ rxClass = false;
91
+ else if (c === "/" && !rxClass)
92
+ modes.pop();
93
+ }
94
+ break;
95
+ default: {
96
+ // "code" — 템플릿 ${} 안이면 } 가 이 구간을 닫는다
97
+ if (c === "/" && n === "/") {
98
+ blank();
99
+ out[++i] = " ";
100
+ modes.push("line");
101
+ }
102
+ else if (c === "/" && n === "*") {
103
+ blank();
104
+ out[++i] = " ";
105
+ modes.push("block");
106
+ }
107
+ else if (c === "'")
108
+ modes.push("sq");
109
+ else if (c === '"')
110
+ modes.push("dq");
111
+ else if (c === "`")
112
+ modes.push("tmpl");
113
+ else if (c === "/" &&
114
+ "(,=:[!&|?{};+-*%<>\n~^".includes(prevSig || "\n")) {
115
+ modes.push("rx");
116
+ rxClass = false;
117
+ blank();
118
+ }
119
+ else if (c === "}" && modes.length > 1) {
120
+ // 템플릿 ${} 의 닫기 — 식 구간을 빠져나간다
121
+ modes.pop();
122
+ }
123
+ if (!/\s/.test(c))
124
+ prevSig = c;
125
+ }
126
+ }
127
+ }
128
+ return { text: out.join(""), interior };
129
+ }
130
+ const BRACE_LANGS = new Set([
131
+ "js",
132
+ "jsx",
133
+ "ts",
134
+ "tsx",
135
+ "javascript",
136
+ "typescript",
137
+ "java",
138
+ "c",
139
+ "cpp",
140
+ "cs",
141
+ "go",
142
+ "rust",
143
+ "rs",
144
+ "php",
145
+ "swift",
146
+ "kotlin",
147
+ "kt",
148
+ "css",
149
+ "scss",
150
+ "less",
151
+ "json",
152
+ ]);
153
+ const MARKUP_LANGS = new Set(["html", "xml", "vue", "svelte"]);
154
+ const SHELL_LANGS = new Set(["sh", "bash", "shell", "zsh"]);
155
+ /** 들여쓰기 단위 추정 — 탭이 우세하면 탭, 아니면 가장 얕은 기존
156
+ * 들여쓰기 폭(2/4)을 따르고 둘 다 없으면 prettier 관례 2칸 */
157
+ function indentUnit(lines) {
158
+ let tabs = 0;
159
+ let minSpace = 0;
160
+ for (const l of lines) {
161
+ const ws = l.match(/^[ \t]+/)?.[0];
162
+ if (!ws)
163
+ continue;
164
+ if (ws.includes("\t"))
165
+ tabs++;
166
+ else if (!minSpace || ws.length < minSpace)
167
+ minSpace = ws.length;
168
+ }
169
+ if (tabs > 0)
170
+ return "\t";
171
+ if (minSpace >= 3)
172
+ return " ";
173
+ return " ";
174
+ }
175
+ /** 중괄호 계열 재들여쓰기 — 줄 구조는 건드리지 않고 선행 공백만
176
+ * 깊이에 맞게 다시 쓴다. case/default 라벨도 깊이로 모델한다 */
177
+ function reindentBraces(code, unit) {
178
+ const mask = maskCode(code);
179
+ const masked = mask.text.split("\n");
180
+ const lines = code.split("\n");
181
+ const stack = [];
182
+ return lines
183
+ .map((line, i) => {
184
+ const t = (masked[i] ?? "").trim();
185
+ // 여러 줄 문자열/블록 주석/템플릿 본문 — 값이 바뀌므로 원문 유지
186
+ if (mask.interior[i])
187
+ return line;
188
+ if (!t) {
189
+ // 주석 전용 줄은 깊이에 맞춰 재들여쓰기, 진짜 빈 줄은 빈 줄로
190
+ return line.trim() ? unit.repeat(stack.length) + line.trim() : "";
191
+ }
192
+ const leadClosers = t.match(/^[}\])]+/)?.[0].length ?? 0;
193
+ const isCase = /^(case\b[^:]*|default)\s*:/.test(t);
194
+ for (let k = 0; k < leadClosers; k++) {
195
+ // 한 개의 } 는 열린 case 몸통과 그 블록을 함께 닫는다
196
+ if (stack[stack.length - 1] === "case")
197
+ stack.pop();
198
+ if (stack[stack.length - 1] === "brace")
199
+ stack.pop();
200
+ }
201
+ if (isCase && stack[stack.length - 1] === "case")
202
+ stack.pop();
203
+ const indent = stack.length;
204
+ if (isCase)
205
+ stack.push("case");
206
+ for (const ch of t.slice(leadClosers)) {
207
+ if (ch === "{" || ch === "[" || ch === "(")
208
+ stack.push("brace");
209
+ else if (ch === "}" || ch === "]" || ch === ")") {
210
+ if (stack[stack.length - 1] === "case")
211
+ stack.pop();
212
+ if (stack[stack.length - 1] === "brace")
213
+ stack.pop();
214
+ }
215
+ }
216
+ return unit.repeat(indent) + line.trim();
217
+ })
218
+ .join("\n");
219
+ }
220
+ const VOID_TAGS = new Set([
221
+ "area",
222
+ "base",
223
+ "br",
224
+ "col",
225
+ "embed",
226
+ "hr",
227
+ "img",
228
+ "input",
229
+ "link",
230
+ "meta",
231
+ "param",
232
+ "source",
233
+ "track",
234
+ "wbr",
235
+ ]);
236
+ /** HTML/XML 계열 재들여쓰기 — 태그 열기/닫기만 센다 */
237
+ function reindentTags(code, unit) {
238
+ const masked = code
239
+ .replace(/<!--[\s\S]*?-->/g, (m) => m.replace(/[^\n]/g, " "))
240
+ .split("\n");
241
+ const lines = code.split("\n");
242
+ let depth = 0;
243
+ return lines
244
+ .map((line, i) => {
245
+ const t = (masked[i] ?? "").trim();
246
+ if (!t)
247
+ return "";
248
+ const leadClose = /^<\//.test(t);
249
+ if (leadClose)
250
+ depth = Math.max(0, depth - 1);
251
+ const indent = depth;
252
+ for (const m of t.matchAll(/<(\/?)([a-zA-Z][\w:-]*)((?:"[^"]*"|'[^']*'|[^>"'])*)>/g)) {
253
+ if (m[1] === "/")
254
+ depth = Math.max(0, depth - 1);
255
+ else if (!m[3].trimEnd().endsWith("/") &&
256
+ !VOID_TAGS.has(m[2].toLowerCase()))
257
+ depth++;
258
+ }
259
+ return unit.repeat(indent) + line.trim();
260
+ })
261
+ .join("\n");
262
+ }
263
+ /** POSIX 쉘 재들여쓰기 — if/fi, for|while/done, case/esac, {} 블록 */
264
+ function reindentShell(code, unit) {
265
+ const lines = code.split("\n");
266
+ let depth = 0;
267
+ return lines
268
+ .map((line) => {
269
+ // 문자열과 # 주석을 지운 스캔용 사본
270
+ const t = line
271
+ .replace(/"(?:[^"\\]|\\.)*"?/g, "")
272
+ .replace(/'(?:[^'\\]|\\.)*'?/g, "")
273
+ .replace(/#[^\n]*/, "")
274
+ .trim();
275
+ if (!t)
276
+ return "";
277
+ // elif/else/then/do 는 이전 몸통을 닫고 다음 몸통을 연다
278
+ const transient = /^(elif|else|then|do|fi|done|esac|\}|\))/.test(t)
279
+ ? 1
280
+ : 0;
281
+ const indent = Math.max(0, depth - transient);
282
+ if (/^(elif|else|then|do)\b/.test(t)) {
283
+ // 같은 깊이에서 계속 — 순수 클로저만 depth를 낮춘다
284
+ }
285
+ else if (/^(fi|done|esac|\}|\))/.test(t)) {
286
+ depth = Math.max(0, depth - 1);
287
+ }
288
+ if (/^(if|for|while|until|select|case)\b/.test(t) ||
289
+ /\b(then|do)\s*$/.test(t) ||
290
+ /\{\s*$/.test(t)) {
291
+ depth++;
292
+ }
293
+ return unit.repeat(indent) + line.trim();
294
+ })
295
+ .join("\n");
296
+ }
297
+ const SQL_KEYWORDS = new Set([
298
+ "select",
299
+ "from",
300
+ "where",
301
+ "group",
302
+ "by",
303
+ "having",
304
+ "order",
305
+ "limit",
306
+ "offset",
307
+ "insert",
308
+ "into",
309
+ "values",
310
+ "update",
311
+ "set",
312
+ "delete",
313
+ "join",
314
+ "inner",
315
+ "left",
316
+ "right",
317
+ "full",
318
+ "outer",
319
+ "on",
320
+ "as",
321
+ "and",
322
+ "or",
323
+ "not",
324
+ "null",
325
+ "is",
326
+ "in",
327
+ "exists",
328
+ "union",
329
+ "all",
330
+ "distinct",
331
+ "case",
332
+ "when",
333
+ "then",
334
+ "else",
335
+ "end",
336
+ "between",
337
+ "like",
338
+ "asc",
339
+ "desc",
340
+ "create",
341
+ "table",
342
+ "drop",
343
+ "alter",
344
+ "primary",
345
+ "key",
346
+ "foreign",
347
+ "references",
348
+ "index",
349
+ ]);
350
+ /** SQL — 예약어를 대문자로 (문자열/주석 밖만) */
351
+ function upperSqlKeywords(code) {
352
+ // -- 줄 주석도 마스킹에 포함 (maskCode는 C 계열 주석만 안다)
353
+ const masked = maskCode(code).text.replace(/--[^\n]*/g, (m) => " ".repeat(m.length));
354
+ return code.replace(/\b[a-z]+\b/gi, (w, off) => masked[off] !== " " && SQL_KEYWORDS.has(w.toLowerCase())
355
+ ? w.toUpperCase()
356
+ : w);
357
+ }
358
+ /**
359
+ * 코드 서식 정리 — 언어 서버 없이 안전한 수준만 한다:
360
+ * - 언어가 json이거나(미지정이고 {/[ 로 시작할 때) JSON으로 파싱되면
361
+ * 2칸 pretty-print
362
+ * - 중괄호 계열(js/ts/java/c/go/rust/php/css…): 브래킷 깊이로
363
+ * 재들여쓰기 — 문자열·주석·템플릿·정규식 안의 기호는 세지 않는다
364
+ * - 마크업(html/xml/vue/svelte): 태그 깊이로 재들여쓰기
365
+ * - 쉘(sh/bash): if/fi·do/done·case/esac·{} 블록으로 재들여쓰기
366
+ * - sql: 예약어 대문자화
367
+ * - 모든 언어: 줄 끝 공백 제거 + 3개 이상 연속 빈 줄을 2개로 +
368
+ * 파일 끝 빈 줄 제거 (EditorConfig/prettier 공통 규칙)
369
+ * 들여쓰기 단위는 기존 코드에서 추정하고 없으면 2칸. 줄 구조는 바꾸지
370
+ * 않는다 — 선행 공백만 다시 쓰는 수준이라 깨진 코드에서도 안전하다.
371
+ * 바뀔 게 없으면 null.
372
+ */
373
+ export function formatCodeText(code, language) {
374
+ let out = code;
375
+ const lang = language.toLowerCase();
376
+ const lead = code.trimStart()[0] ?? "";
377
+ let jsonOk = false;
378
+ if (lang === "json" || (!lang && (lead === "{" || lead === "["))) {
379
+ try {
380
+ out = JSON.stringify(JSON.parse(code), null, 2);
381
+ jsonOk = true;
382
+ }
383
+ catch {
384
+ // 깨진 JSON은 아래 재들여쓰기·공통 정리만 적용한다
385
+ }
386
+ }
387
+ if (!jsonOk) {
388
+ const unit = indentUnit(out.split("\n"));
389
+ if (BRACE_LANGS.has(lang) || (!lang && lead === "{")) {
390
+ out = reindentBraces(out, unit);
391
+ }
392
+ else if (MARKUP_LANGS.has(lang)) {
393
+ out = reindentTags(out, unit);
394
+ }
395
+ else if (SHELL_LANGS.has(lang)) {
396
+ out = reindentShell(out, unit);
397
+ }
398
+ else if (lang === "sql") {
399
+ out = upperSqlKeywords(out);
400
+ }
401
+ }
402
+ out = out
403
+ .split("\n")
404
+ .map((l) => l.replace(/[ \t]+$/, ""))
405
+ .join("\n")
406
+ .replace(/\n{3,}/g, "\n\n")
407
+ .replace(/\n+$/, "");
408
+ return out === code ? null : out;
409
+ }
410
+ //# sourceMappingURL=code-format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-format.js","sourceRoot":"","sources":["../../src/features/code-format.ts"],"names":[],"mappings":"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"}
@@ -11,5 +11,21 @@ export declare const splitBlock: Command;
11
11
  * 컨테이너 뒤로, 리스트 아이템은 lift. 해당 없으면 false.
12
12
  */
13
13
  export declare const exitBlock: Command;
14
+ /**
15
+ * Backspace — 캐럿이 텍스트블록 맨 앞일 때의 경계 처리 (PM 관례).
16
+ * - 앞 형제가 atom/selectable 컴포넌트 블록이면 노드 셀렉션으로
17
+ * 만든다 (selectNodeBackward) — 텍스트를 받을 수 없는 블록은
18
+ * 머지가 아니라 선택 대상이다. 다음 Backspace에서 통째로 삭제된다.
19
+ * - selectable 컨테이너(콜아웃 등) 첫 자식이 비어 있으면 그 블록을
20
+ * 지우고, 부모가 비면 컴포넌트를 통째로 지운다 — 내용을 다 지운
21
+ * 컴포넌트는 삭제돼야 한다.
22
+ * 텍스트블록·리스트·일반 컨테이너 앞에서는 false — 기존 머지 경로.
23
+ */
24
+ export declare const selectNodeBackward: Command;
25
+ /**
26
+ * Delete — 캐럿이 텍스트블록 맨 끝이고 뒤 형제가 atom/selectable
27
+ * 컴포넌트면 노드 셀렉션으로 만든다 (PM selectNodeForward).
28
+ */
29
+ export declare const selectNodeForward: Command;
14
30
  export declare const docFeature: import("./feature.js").Feature;
15
31
  //# sourceMappingURL=doc.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"doc.d.ts","sourceRoot":"","sources":["../../src/features/doc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAMtD;;;;GAIG;AAEH,4BAA4B;AAC5B,eAAO,MAAM,UAAU,EAAE,OAIxB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,OAiCvB,CAAC;AAEF,eAAO,MAAM,UAAU,gCAsBrB,CAAC"}
1
+ {"version":3,"file":"doc.d.ts","sourceRoot":"","sources":["../../src/features/doc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAU,MAAM,wBAAwB,CAAC;AAoB9D;;;;GAIG;AAEH,4BAA4B;AAC5B,eAAO,MAAM,UAAU,EAAE,OAIxB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,OA+BvB,CAAC;AA2BF;;;;;;;;;GASG;AACH,eAAO,MAAM,kBAAkB,EAAE,OA6ChC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,OAwB/B,CAAC;AAgCF,eAAO,MAAM,UAAU,gCA2BrB,CAAC"}
@@ -1,7 +1,8 @@
1
1
  import { nodeAt } from "../model/traverse.js";
2
- import { textSelection } from "../state/selection.js";
2
+ import { nodeSelection, point, pointEq, textSelection, } from "../state/selection.js";
3
+ import { pointBefore } from "../state/navigate.js";
3
4
  import { defineFeature } from "./feature.js";
4
- import { alignDOM, caretBlockPath, itemContext, setBlockType } from "../commands.js";
5
+ import { alignDOM, caretBlockPath, itemContext, setBlockType, } from "../commands.js";
5
6
  /**
6
7
  * 기본 블록 구조 — doc/paragraph/text 스키마와 블록 분할·컨테이너
7
8
  * 탈출 커맨드. 다른 모든 블록 기능의 기반이라 starterFeatures에서
@@ -53,6 +54,152 @@ export const exitBlock = ({ state, tr, dispatch }) => {
53
54
  dispatch();
54
55
  return true;
55
56
  };
57
+ /** 블록에 텍스트 후손이 하나라도 있는가 — 빈 블록 판별용 */
58
+ const hasText = (n) => n.type === "text"
59
+ ? !!n.text?.length
60
+ : (n.content ?? []).some(hasText);
61
+ /**
62
+ * 캐럿이 품고 있는 텍스트블록의 경로와 "블록 맨 앞/끝" 여부를 푼다.
63
+ * 리프 텍스트 포인트는 부모 블록으로 올리고, 블록 경계 포인트(빈
64
+ * 문단의 {path,offset:0} 관례)는 그 자체를 블록으로 본다.
65
+ */
66
+ const caretBlockStart = (state, p) => {
67
+ const leaf = nodeAt(state.doc, p.path);
68
+ if (leaf?.type === "text") {
69
+ // 첫 텍스트 노드의 맨 앞이어야 블록 시작이다
70
+ if (p.offset !== 0 || p.path[p.path.length - 1] !== 0)
71
+ return null;
72
+ return { bp: p.path.slice(0, -1) };
73
+ }
74
+ if (p.offset !== 0 || !p.path.length)
75
+ return null;
76
+ return { bp: p.path };
77
+ };
78
+ /**
79
+ * Backspace — 캐럿이 텍스트블록 맨 앞일 때의 경계 처리 (PM 관례).
80
+ * - 앞 형제가 atom/selectable 컴포넌트 블록이면 노드 셀렉션으로
81
+ * 만든다 (selectNodeBackward) — 텍스트를 받을 수 없는 블록은
82
+ * 머지가 아니라 선택 대상이다. 다음 Backspace에서 통째로 삭제된다.
83
+ * - selectable 컨테이너(콜아웃 등) 첫 자식이 비어 있으면 그 블록을
84
+ * 지우고, 부모가 비면 컴포넌트를 통째로 지운다 — 내용을 다 지운
85
+ * 컴포넌트는 삭제돼야 한다.
86
+ * 텍스트블록·리스트·일반 컨테이너 앞에서는 false — 기존 머지 경로.
87
+ */
88
+ export const selectNodeBackward = ({ state, tr, dispatch }) => {
89
+ const sel = state.selection;
90
+ if (sel.type !== "text" || !pointEq(sel.anchor, sel.focus))
91
+ return false;
92
+ const s = caretBlockStart(state, sel.anchor);
93
+ if (!s)
94
+ return false;
95
+ const { bp } = s;
96
+ const idx = bp[bp.length - 1];
97
+ if (idx == null)
98
+ return false;
99
+ const parentPath = bp.slice(0, -1);
100
+ const parent = nodeAt(state.doc, parentPath);
101
+ const prev = parent?.content?.[idx - 1];
102
+ if (prev) {
103
+ const spec = state.schema.nodeSpec(prev.type);
104
+ if (!spec?.atom && !spec?.selectable)
105
+ return false;
106
+ tr.setSelection(nodeSelection([...parentPath, idx - 1]));
107
+ dispatch();
108
+ return true;
109
+ }
110
+ // 컨테이너 첫 자식의 맨 앞 — 부모가 selectable이고 블록이 비어
111
+ // 있으면 지운다. 리스트 아이템은 lift 규칙이 따로 있어 건드리지 않는다
112
+ if (idx !== 0 || !parentPath.length)
113
+ return false;
114
+ const pspec = parent && state.schema.nodeSpec(parent.type);
115
+ if (!pspec?.selectable || pspec.listItem)
116
+ return false;
117
+ const block = nodeAt(state.doc, bp);
118
+ if (!block || hasText(block))
119
+ return false;
120
+ if ((parent?.content?.length ?? 0) <= 1) {
121
+ // 유일한 자식 — 부모 컴포넌트를 통째로 지우고 캐럿은 그 앞으로
122
+ const grandPath = parentPath.slice(0, -1);
123
+ const pi = parentPath[parentPath.length - 1];
124
+ tr.delete({
125
+ anchor: point(grandPath, pi),
126
+ focus: point(grandPath, pi + 1),
127
+ });
128
+ const before = pointBefore(state.doc, point(grandPath, pi));
129
+ tr.setSelection(textSelection(before ?? point(grandPath, 0)));
130
+ }
131
+ else {
132
+ // 형제가 남는다 — 빈 첫 자식만 지우고 캐럿은 새 첫 자식 시작
133
+ tr.delete({
134
+ anchor: point(parentPath, 0),
135
+ focus: point(parentPath, 1),
136
+ });
137
+ tr.setSelection(textSelection(point([...parentPath, 0], 0)));
138
+ }
139
+ dispatch();
140
+ return true;
141
+ };
142
+ /**
143
+ * Delete — 캐럿이 텍스트블록 맨 끝이고 뒤 형제가 atom/selectable
144
+ * 컴포넌트면 노드 셀렉션으로 만든다 (PM selectNodeForward).
145
+ */
146
+ export const selectNodeForward = ({ state, tr, dispatch }) => {
147
+ const sel = state.selection;
148
+ if (sel.type !== "text" || !pointEq(sel.anchor, sel.focus))
149
+ return false;
150
+ const p = sel.anchor;
151
+ const leaf = nodeAt(state.doc, p.path);
152
+ const bp = leaf?.type === "text" ? p.path.slice(0, -1) : p.path;
153
+ const block = nodeAt(state.doc, bp);
154
+ const kids = block?.content ?? [];
155
+ const atEnd = leaf?.type === "text"
156
+ ? p.offset === (leaf.text?.length ?? 0) &&
157
+ p.path[p.path.length - 1] === kids.length - 1
158
+ : p.offset === kids.length;
159
+ if (!atEnd)
160
+ return false;
161
+ const idx = bp[bp.length - 1];
162
+ if (idx == null)
163
+ return false;
164
+ const parentPath = bp.slice(0, -1);
165
+ const next = nodeAt(state.doc, parentPath)?.content?.[idx + 1];
166
+ if (!next)
167
+ return false;
168
+ const spec = state.schema.nodeSpec(next.type);
169
+ if (!spec?.atom && !spec?.selectable)
170
+ return false;
171
+ tr.setSelection(nodeSelection([...parentPath, idx + 1]));
172
+ dispatch();
173
+ return true;
174
+ };
175
+ /**
176
+ * 문서 끝 보장 — 마지막 블록이 문단이 아니면(커스텀 블록·hr·표 등)
177
+ * 빈 문단을 자동으로 붙인다 (PM trailing-node 관례). 콜아웃 같은
178
+ * 컨테이너가 끝에 있으면 아래에 캐럿을 둘 곳이 없어 타이핑이 불가하다.
179
+ * Editor가 생성 시 초기 문서에도 같은 보장을 적용한다.
180
+ */
181
+ const trailingParagraph = {
182
+ key: "trailingParagraph",
183
+ appendTransaction(_tr, _prev, state) {
184
+ const kids = state.doc.content ?? [];
185
+ if (kids[kids.length - 1]?.type === "paragraph")
186
+ return null;
187
+ if (!state.schema.nodeSpec("paragraph"))
188
+ return null;
189
+ const tr = state.tr();
190
+ // {type, attrs, content} 순서의 정규 형태 — collab-yjs의 yToNode
191
+ // 변환 결과와 바이트 단위로 같아야 원격 수신 doc과 수렴한다
192
+ tr.insertNode({ path: [], offset: kids.length }, { ...state.schema.node("paragraph"), content: [] });
193
+ // insertNode는 캐럿을 새 노드로 옮긴다 — 끝 삽입이라 기존 셀렉션
194
+ // 경로는 그대로 유효하므로 되돌려 캐럿 점프를 막는다
195
+ tr.setSelection(state.selection);
196
+ // 구조 보정 tr은 사용자 편집이 아니다 — 히스토리에 쌓으면 undo가
197
+ // 이 삽입을 되돌리고 appendTransaction이 곧바로 다시 붙이는
198
+ // 자기삼키기가 되므로 기록에서 제외한다
199
+ tr.setMeta("history.skip", true);
200
+ return tr;
201
+ },
202
+ };
56
203
  export const docFeature = defineFeature({
57
204
  name: "doc",
58
205
  description: "기본 블록 구조 — doc/paragraph/text, 블록 분할과 컨테이너 탈출",
@@ -74,6 +221,11 @@ export const docFeature = defineFeature({
74
221
  },
75
222
  keymap: {
76
223
  "Mod-Enter": exitBlock,
224
+ // 블록 경계 Backspace/Delete — 컴포넌트 블록은 머지가 아니라
225
+ // 노드 셀렉션 → 다음 키 입력에서 삭제된다 (PM selectNode 관례)
226
+ Backspace: selectNodeBackward,
227
+ Delete: selectNodeForward,
77
228
  },
229
+ plugins: [trailingParagraph],
78
230
  });
79
231
  //# sourceMappingURL=doc.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"doc.js","sourceRoot":"","sources":["../../src/features/doc.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"doc.js","sourceRoot":"","sources":["../../src/features/doc.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"heading.d.ts","sourceRoot":"","sources":["../../src/features/heading.ts"],"names":[],"mappings":"AAGA,uDAAuD;AACvD,eAAO,MAAM,cAAc,gCA4BzB,CAAC"}
1
+ {"version":3,"file":"heading.d.ts","sourceRoot":"","sources":["../../src/features/heading.ts"],"names":[],"mappings":"AAGA,uDAAuD;AACvD,eAAO,MAAM,cAAc,gCA2BzB,CAAC"}