@moda-editor/core 0.1.1

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 (184) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +16 -0
  3. package/dist/commands.d.ts +78 -0
  4. package/dist/commands.d.ts.map +1 -0
  5. package/dist/commands.js +299 -0
  6. package/dist/commands.js.map +1 -0
  7. package/dist/conformance.d.ts +59 -0
  8. package/dist/conformance.d.ts.map +1 -0
  9. package/dist/conformance.js +1609 -0
  10. package/dist/conformance.js.map +1 -0
  11. package/dist/core.d.ts +37 -0
  12. package/dist/core.d.ts.map +1 -0
  13. package/dist/core.js +117 -0
  14. package/dist/core.js.map +1 -0
  15. package/dist/editor/editor.d.ts +104 -0
  16. package/dist/editor/editor.d.ts.map +1 -0
  17. package/dist/editor/editor.js +204 -0
  18. package/dist/editor/editor.js.map +1 -0
  19. package/dist/editor/extension.d.ts +170 -0
  20. package/dist/editor/extension.d.ts.map +1 -0
  21. package/dist/editor/extension.js +2 -0
  22. package/dist/editor/extension.js.map +1 -0
  23. package/dist/features/ace.d.ts +9 -0
  24. package/dist/features/ace.d.ts.map +1 -0
  25. package/dist/features/ace.js +144 -0
  26. package/dist/features/ace.js.map +1 -0
  27. package/dist/features/alignment.d.ts +9 -0
  28. package/dist/features/alignment.d.ts.map +1 -0
  29. package/dist/features/alignment.js +28 -0
  30. package/dist/features/alignment.js.map +1 -0
  31. package/dist/features/blockquote.d.ts +9 -0
  32. package/dist/features/blockquote.d.ts.map +1 -0
  33. package/dist/features/blockquote.js +65 -0
  34. package/dist/features/blockquote.js.map +1 -0
  35. package/dist/features/code-block.d.ts +77 -0
  36. package/dist/features/code-block.d.ts.map +1 -0
  37. package/dist/features/code-block.js +986 -0
  38. package/dist/features/code-block.js.map +1 -0
  39. package/dist/features/doc.d.ts +15 -0
  40. package/dist/features/doc.d.ts.map +1 -0
  41. package/dist/features/doc.js +79 -0
  42. package/dist/features/doc.js.map +1 -0
  43. package/dist/features/feature.d.ts +26 -0
  44. package/dist/features/feature.d.ts.map +1 -0
  45. package/dist/features/feature.js +8 -0
  46. package/dist/features/feature.js.map +1 -0
  47. package/dist/features/hard-break.d.ts +9 -0
  48. package/dist/features/hard-break.d.ts.map +1 -0
  49. package/dist/features/hard-break.js +48 -0
  50. package/dist/features/hard-break.js.map +1 -0
  51. package/dist/features/heading.d.ts +3 -0
  52. package/dist/features/heading.d.ts.map +1 -0
  53. package/dist/features/heading.js +31 -0
  54. package/dist/features/heading.js.map +1 -0
  55. package/dist/features/horizontal-rule.d.ts +9 -0
  56. package/dist/features/horizontal-rule.d.ts.map +1 -0
  57. package/dist/features/horizontal-rule.js +64 -0
  58. package/dist/features/horizontal-rule.js.map +1 -0
  59. package/dist/features/image.d.ts +12 -0
  60. package/dist/features/image.d.ts.map +1 -0
  61. package/dist/features/image.js +116 -0
  62. package/dist/features/image.js.map +1 -0
  63. package/dist/features/index.d.ts +31 -0
  64. package/dist/features/index.d.ts.map +1 -0
  65. package/dist/features/index.js +65 -0
  66. package/dist/features/index.js.map +1 -0
  67. package/dist/features/inline-style.d.ts +12 -0
  68. package/dist/features/inline-style.d.ts.map +1 -0
  69. package/dist/features/inline-style.js +126 -0
  70. package/dist/features/inline-style.js.map +1 -0
  71. package/dist/features/link.d.ts +29 -0
  72. package/dist/features/link.d.ts.map +1 -0
  73. package/dist/features/link.js +198 -0
  74. package/dist/features/link.js.map +1 -0
  75. package/dist/features/lists.d.ts +14 -0
  76. package/dist/features/lists.d.ts.map +1 -0
  77. package/dist/features/lists.js +178 -0
  78. package/dist/features/lists.js.map +1 -0
  79. package/dist/features/marks.d.ts +6 -0
  80. package/dist/features/marks.d.ts.map +1 -0
  81. package/dist/features/marks.js +68 -0
  82. package/dist/features/marks.js.map +1 -0
  83. package/dist/features/script.d.ts +2 -0
  84. package/dist/features/script.d.ts.map +1 -0
  85. package/dist/features/script.js +55 -0
  86. package/dist/features/script.js.map +1 -0
  87. package/dist/features/table.d.ts +20 -0
  88. package/dist/features/table.d.ts.map +1 -0
  89. package/dist/features/table.js +195 -0
  90. package/dist/features/table.js.map +1 -0
  91. package/dist/features/task-list.d.ts +10 -0
  92. package/dist/features/task-list.d.ts.map +1 -0
  93. package/dist/features/task-list.js +68 -0
  94. package/dist/features/task-list.js.map +1 -0
  95. package/dist/features/testkit.d.ts +32 -0
  96. package/dist/features/testkit.d.ts.map +1 -0
  97. package/dist/features/testkit.js +92 -0
  98. package/dist/features/testkit.js.map +1 -0
  99. package/dist/history.d.ts +40 -0
  100. package/dist/history.d.ts.map +1 -0
  101. package/dist/history.js +192 -0
  102. package/dist/history.js.map +1 -0
  103. package/dist/index.d.ts +39 -0
  104. package/dist/index.d.ts.map +1 -0
  105. package/dist/index.js +29 -0
  106. package/dist/index.js.map +1 -0
  107. package/dist/model/node.d.ts +47 -0
  108. package/dist/model/node.d.ts.map +1 -0
  109. package/dist/model/node.js +30 -0
  110. package/dist/model/node.js.map +1 -0
  111. package/dist/model/schema.d.ts +105 -0
  112. package/dist/model/schema.d.ts.map +1 -0
  113. package/dist/model/schema.js +46 -0
  114. package/dist/model/schema.js.map +1 -0
  115. package/dist/model/traverse.d.ts +36 -0
  116. package/dist/model/traverse.d.ts.map +1 -0
  117. package/dist/model/traverse.js +123 -0
  118. package/dist/model/traverse.js.map +1 -0
  119. package/dist/mount.d.ts +24 -0
  120. package/dist/mount.d.ts.map +1 -0
  121. package/dist/mount.js +45 -0
  122. package/dist/mount.js.map +1 -0
  123. package/dist/parse/html.d.ts +8 -0
  124. package/dist/parse/html.d.ts.map +1 -0
  125. package/dist/parse/html.js +247 -0
  126. package/dist/parse/html.js.map +1 -0
  127. package/dist/parse/sanitize.d.ts +20 -0
  128. package/dist/parse/sanitize.d.ts.map +1 -0
  129. package/dist/parse/sanitize.js +116 -0
  130. package/dist/parse/sanitize.js.map +1 -0
  131. package/dist/presets/highlight.d.ts +23 -0
  132. package/dist/presets/highlight.d.ts.map +1 -0
  133. package/dist/presets/highlight.js +170 -0
  134. package/dist/presets/highlight.js.map +1 -0
  135. package/dist/presets/starter.d.ts +14 -0
  136. package/dist/presets/starter.d.ts.map +1 -0
  137. package/dist/presets/starter.js +18 -0
  138. package/dist/presets/starter.js.map +1 -0
  139. package/dist/state/apply.d.ts +64 -0
  140. package/dist/state/apply.d.ts.map +1 -0
  141. package/dist/state/apply.js +528 -0
  142. package/dist/state/apply.js.map +1 -0
  143. package/dist/state/navigate.d.ts +5 -0
  144. package/dist/state/navigate.d.ts.map +1 -0
  145. package/dist/state/navigate.js +81 -0
  146. package/dist/state/navigate.js.map +1 -0
  147. package/dist/state/selection.d.ts +44 -0
  148. package/dist/state/selection.d.ts.map +1 -0
  149. package/dist/state/selection.js +63 -0
  150. package/dist/state/selection.js.map +1 -0
  151. package/dist/state/state.d.ts +39 -0
  152. package/dist/state/state.d.ts.map +1 -0
  153. package/dist/state/state.js +123 -0
  154. package/dist/state/state.js.map +1 -0
  155. package/dist/state/transaction.d.ts +234 -0
  156. package/dist/state/transaction.d.ts.map +1 -0
  157. package/dist/state/transaction.js +988 -0
  158. package/dist/state/transaction.js.map +1 -0
  159. package/dist/styles.css +948 -0
  160. package/dist/types.d.ts +44 -0
  161. package/dist/types.d.ts.map +1 -0
  162. package/dist/types.js +8 -0
  163. package/dist/types.js.map +1 -0
  164. package/dist/view/dom.d.ts +26 -0
  165. package/dist/view/dom.d.ts.map +1 -0
  166. package/dist/view/dom.js +249 -0
  167. package/dist/view/dom.js.map +1 -0
  168. package/dist/view/input.d.ts +45 -0
  169. package/dist/view/input.d.ts.map +1 -0
  170. package/dist/view/input.js +901 -0
  171. package/dist/view/input.js.map +1 -0
  172. package/dist/view/mount.d.ts +26 -0
  173. package/dist/view/mount.d.ts.map +1 -0
  174. package/dist/view/mount.js +119 -0
  175. package/dist/view/mount.js.map +1 -0
  176. package/dist/view/render.d.ts +64 -0
  177. package/dist/view/render.d.ts.map +1 -0
  178. package/dist/view/render.js +203 -0
  179. package/dist/view/render.js.map +1 -0
  180. package/dist/view/serialize.d.ts +4 -0
  181. package/dist/view/serialize.d.ts.map +1 -0
  182. package/dist/view/serialize.js +37 -0
  183. package/dist/view/serialize.js.map +1 -0
  184. package/package.json +44 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lists.js","sourceRoot":"","sources":["../../src/features/lists.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * 기본 인라인 마크 — 굵게·기울임·밑줄·취소선·인라인 코드.
3
+ * 마크다운 fence 입력 규칙과 Mod-키 토글을 함께 묶는다.
4
+ */
5
+ export declare const marksFeature: import("./feature.js").Feature;
6
+ //# sourceMappingURL=marks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marks.d.ts","sourceRoot":"","sources":["../../src/features/marks.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,eAAO,MAAM,YAAY,gCA6DvB,CAAC"}
@@ -0,0 +1,68 @@
1
+ import { defineFeature } from "./feature.js";
2
+ import { markRule, toggleMark } from "../commands.js";
3
+ /**
4
+ * 기본 인라인 마크 — 굵게·기울임·밑줄·취소선·인라인 코드.
5
+ * 마크다운 fence 입력 규칙과 Mod-키 토글을 함께 묶는다.
6
+ */
7
+ export const marksFeature = defineFeature({
8
+ name: "marks",
9
+ description: "기본 마크 — bold/italic/underline/strike/code, `**`/`*`/`~~`/`` ` `` 입력 규칙과 Mod 토글",
10
+ marks: {
11
+ bold: {
12
+ toDOM: () => ({ tag: "strong" }),
13
+ parseDOM: [
14
+ { tag: "strong" },
15
+ { tag: "b" },
16
+ // 구글독스/워드는 font-weight 스타일로 온다
17
+ { style: "font-weight=bold|[6-9]00", tag: "span,b,strong" },
18
+ ],
19
+ },
20
+ italic: {
21
+ toDOM: () => ({ tag: "em" }),
22
+ parseDOM: [
23
+ { tag: "em" },
24
+ { tag: "i" },
25
+ { style: "font-style=italic", tag: "span,i,em" },
26
+ ],
27
+ },
28
+ underline: {
29
+ toDOM: () => ({ tag: "u" }),
30
+ parseDOM: [
31
+ { tag: "u" },
32
+ { tag: "ins" },
33
+ { style: "text-decoration=underline", tag: "span,u,ins" },
34
+ { style: "text-decoration-line=underline", tag: "span,u,ins" },
35
+ ],
36
+ },
37
+ code: { toDOM: () => ({ tag: "code" }), parseDOM: [{ tag: "code" }] },
38
+ strike: {
39
+ toDOM: () => ({ tag: "s" }),
40
+ parseDOM: [{ tag: "s" }, { tag: "del" }, { tag: "strike" }],
41
+ },
42
+ },
43
+ commands: {
44
+ toggleBold: toggleMark("bold"),
45
+ toggleItalic: toggleMark("italic"),
46
+ toggleUnderline: toggleMark("underline"),
47
+ toggleCode: toggleMark("code"),
48
+ toggleStrike: toggleMark("strike"),
49
+ },
50
+ keymap: {
51
+ "Mod-b": toggleMark("bold"),
52
+ "Mod-i": toggleMark("italic"),
53
+ "Mod-u": toggleMark("underline"),
54
+ "Mod-e": toggleMark("code"),
55
+ "Mod-Shift-s": toggleMark("strike"),
56
+ },
57
+ inputRules: [
58
+ // **를 *보다 먼저 (PM과 같은 우선순위 관례).
59
+ // * 와 _ 규칙은 fence 앞에 같은 fence 문자가 오지 않도록 제한 —
60
+ // 없으면 `**x*` 입력 중 `*x*`가 italic으로 먼저 변환된다
61
+ markRule(/\*\*([^*]+)\*\*$/, "bold", "**"),
62
+ markRule(/(?:^|[^*])\*([^*]+)\*$/, "italic", "*"),
63
+ markRule(/(?:^|[^_])_([^_]+)_$/, "italic", "_"),
64
+ markRule(/~~([^~]+)~~$/, "strike", "~~"),
65
+ markRule(/`([^`]+)`$/, "code", "`"),
66
+ ],
67
+ });
68
+ //# sourceMappingURL=marks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marks.js","sourceRoot":"","sources":["../../src/features/marks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEtD;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CAAC;IACxC,IAAI,EAAE,OAAO;IACb,WAAW,EACT,gFAAgF;IAClF,KAAK,EAAE;QACL,IAAI,EAAE;YACJ,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;YAChC,QAAQ,EAAE;gBACR,EAAE,GAAG,EAAE,QAAQ,EAAE;gBACjB,EAAE,GAAG,EAAE,GAAG,EAAE;gBACZ,+BAA+B;gBAC/B,EAAE,KAAK,EAAE,0BAA0B,EAAE,GAAG,EAAE,eAAe,EAAE;aAC5D;SACF;QACD,MAAM,EAAE;YACN,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;YAC5B,QAAQ,EAAE;gBACR,EAAE,GAAG,EAAE,IAAI,EAAE;gBACb,EAAE,GAAG,EAAE,GAAG,EAAE;gBACZ,EAAE,KAAK,EAAE,mBAAmB,EAAE,GAAG,EAAE,WAAW,EAAE;aACjD;SACF;QACD,SAAS,EAAE;YACT,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;YAC3B,QAAQ,EAAE;gBACR,EAAE,GAAG,EAAE,GAAG,EAAE;gBACZ,EAAE,GAAG,EAAE,KAAK,EAAE;gBACd,EAAE,KAAK,EAAE,2BAA2B,EAAE,GAAG,EAAE,YAAY,EAAE;gBACzD,EAAE,KAAK,EAAE,gCAAgC,EAAE,GAAG,EAAE,YAAY,EAAE;aAC/D;SACF;QACD,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE;QACrE,MAAM,EAAE;YACN,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;YAC3B,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;SAC5D;KACF;IACD,QAAQ,EAAE;QACR,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC;QAC9B,YAAY,EAAE,UAAU,CAAC,QAAQ,CAAC;QAClC,eAAe,EAAE,UAAU,CAAC,WAAW,CAAC;QACxC,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC;QAC9B,YAAY,EAAE,UAAU,CAAC,QAAQ,CAAC;KACnC;IACD,MAAM,EAAE;QACN,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC;QAC3B,OAAO,EAAE,UAAU,CAAC,QAAQ,CAAC;QAC7B,OAAO,EAAE,UAAU,CAAC,WAAW,CAAC;QAChC,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC;QAC3B,aAAa,EAAE,UAAU,CAAC,QAAQ,CAAC;KACpC;IACD,UAAU,EAAE;QACV,+BAA+B;QAC/B,8CAA8C;QAC9C,0CAA0C;QAC1C,QAAQ,CAAC,kBAAkB,EAAE,MAAM,EAAE,IAAI,CAAC;QAC1C,QAAQ,CAAC,wBAAwB,EAAE,QAAQ,EAAE,GAAG,CAAC;QACjD,QAAQ,CAAC,sBAAsB,EAAE,QAAQ,EAAE,GAAG,CAAC;QAC/C,QAAQ,CAAC,cAAc,EAAE,QAAQ,EAAE,IAAI,CAAC;QACxC,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,CAAC;KACpC;CACF,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const scriptFeature: import("./feature.js").Feature;
2
+ //# sourceMappingURL=script.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"script.d.ts","sourceRoot":"","sources":["../../src/features/script.ts"],"names":[],"mappings":"AAqCA,eAAO,MAAM,aAAa,gCAqBxB,CAAC"}
@@ -0,0 +1,55 @@
1
+ import { normalizedRange, pointEq } from "../state/selection.js";
2
+ import { defineFeature } from "./feature.js";
3
+ import { rangeHasMark } from "../commands.js";
4
+ /**
5
+ * 위/아래 첨자 — subscript·superscript 마크.
6
+ * 둘은 상호 배타적 — 한쪽을 켜면 다른 쪽은 벗긴다.
7
+ */
8
+ /** 배타적 마크 토글 — 켤 때 상대 마크는 벗긴다 (sub↔sup) */
9
+ function toggleExclusive(markType, other) {
10
+ return ({ state, tr, dispatch }) => {
11
+ const sel = state.selection;
12
+ if (sel.type !== "text")
13
+ return false;
14
+ const range = normalizedRange(sel);
15
+ if (pointEq(range.anchor, range.focus)) {
16
+ const cur = (state.storedMarks ?? []).filter((m) => m.type !== other);
17
+ const has = cur.some((m) => m.type === markType);
18
+ tr.setStoredMarks(has
19
+ ? cur.filter((m) => m.type !== markType)
20
+ : [...cur, { type: markType }]);
21
+ }
22
+ else if (rangeHasMark(state.doc, range, markType)) {
23
+ tr.removeMark(range, markType);
24
+ }
25
+ else {
26
+ tr.removeMark(range, other);
27
+ tr.addMark(range, { type: markType });
28
+ }
29
+ dispatch();
30
+ return true;
31
+ };
32
+ }
33
+ export const scriptFeature = defineFeature({
34
+ name: "script",
35
+ description: "위/아래 첨자 — 상호 배타적 sub/sup 마크 (Mod-. / Mod-,)",
36
+ marks: {
37
+ subscript: {
38
+ toDOM: () => ({ tag: "sub" }),
39
+ parseDOM: [{ tag: "sub" }],
40
+ },
41
+ superscript: {
42
+ toDOM: () => ({ tag: "sup" }),
43
+ parseDOM: [{ tag: "sup" }],
44
+ },
45
+ },
46
+ commands: {
47
+ toggleSubscript: toggleExclusive("subscript", "superscript"),
48
+ toggleSuperscript: toggleExclusive("superscript", "subscript"),
49
+ },
50
+ keymap: {
51
+ "Mod-.": toggleExclusive("superscript", "subscript"),
52
+ "Mod-,": toggleExclusive("subscript", "superscript"),
53
+ },
54
+ });
55
+ //# sourceMappingURL=script.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"script.js","sourceRoot":"","sources":["../../src/features/script.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C;;;GAGG;AAEH,2CAA2C;AAC3C,SAAS,eAAe,CAAC,QAAgB,EAAE,KAAa;IACtD,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACjC,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC;QAC5B,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,KAAK,CAAC;QACtC,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YACvC,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,MAAM,CAC1C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CACxB,CAAC;YACF,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YACjD,EAAE,CAAC,cAAc,CACf,GAAG;gBACD,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;gBACxC,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CACjC,CAAC;QACJ,CAAC;aAAM,IAAI,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;YACpD,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC5B,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QACxC,CAAC;QACD,QAAQ,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAAC;IACzC,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,6CAA6C;IAC1D,KAAK,EAAE;QACL,SAAS,EAAE;YACT,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;YAC7B,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;SAC3B;QACD,WAAW,EAAE;YACX,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;YAC7B,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;SAC3B;KACF;IACD,QAAQ,EAAE;QACR,eAAe,EAAE,eAAe,CAAC,WAAW,EAAE,aAAa,CAAC;QAC5D,iBAAiB,EAAE,eAAe,CAAC,aAAa,EAAE,WAAW,CAAC;KAC/D;IACD,MAAM,EAAE;QACN,OAAO,EAAE,eAAe,CAAC,aAAa,EAAE,WAAW,CAAC;QACpD,OAAO,EAAE,eAAe,CAAC,WAAW,EAAE,aAAa,CAAC;KACrD;CACF,CAAC,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { Command } from "../editor/extension.js";
2
+ /**
3
+ * 표 — table > tableRow > tableCell > block 구조.
4
+ * Tab/Shift-Tab 셀 이동(마지막 셀 Tab은 행 추가), 행·열 추가와
5
+ * 표 삭제 커맨드. 셀 안 타이핑은 일반 블록 경로를 탄다.
6
+ */
7
+ /** 표 삽입 — 빈 블록이면 교체. 캐럿은 첫 셀의 문단으로 */
8
+ export declare function insertTable(rows?: number, cols?: number): Command;
9
+ /** Tab — 다음 셀로. 마지막 셀이면 행을 추가하고 그 첫 셀로 (PM 관례) */
10
+ export declare const nextCell: Command;
11
+ /** Shift-Tab — 이전 셀로. 첫 셀이면 false(폴스루 → 표 밖으로 이동) */
12
+ export declare const prevCell: Command;
13
+ /** 현재 행 뒤에 같은 열 수의 행을 추가한다 */
14
+ export declare const addTableRow: Command;
15
+ /** 표 끝에 열을 하나 추가한다 — 각 행에 셀을 붙인다 */
16
+ export declare const addTableColumn: Command;
17
+ /** 표 통째 삭제 — 자리에 빈 문단을 남긴다 */
18
+ export declare const deleteTable: Command;
19
+ export declare const tableFeature: import("./feature.js").Feature;
20
+ //# sourceMappingURL=table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../src/features/table.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAQtD;;;;GAIG;AAEH,sCAAsC;AACtC,wBAAgB,WAAW,CAAC,IAAI,SAAI,EAAE,IAAI,SAAI,GAAG,OAAO,CAmCvD;AAmCD,kDAAkD;AAClD,eAAO,MAAM,QAAQ,EAAE,OA+BtB,CAAC;AAEF,qDAAqD;AACrD,eAAO,MAAM,QAAQ,EAAE,OAgBtB,CAAC;AAEF,8BAA8B;AAC9B,eAAO,MAAM,WAAW,EAAE,OAczB,CAAC;AAEF,oCAAoC;AACpC,eAAO,MAAM,cAAc,EAAE,OAc5B,CAAC;AAEF,8BAA8B;AAC9B,eAAO,MAAM,WAAW,EAAE,OAkBzB,CAAC;AAEF,eAAO,MAAM,YAAY,gCAqCvB,CAAC"}
@@ -0,0 +1,195 @@
1
+ import { nodeAt } from "../model/traverse.js";
2
+ import { textSelection } from "../state/selection.js";
3
+ import { defineFeature } from "./feature.js";
4
+ import { caretBlockPath } from "../commands.js";
5
+ /**
6
+ * 표 — table > tableRow > tableCell > block 구조.
7
+ * Tab/Shift-Tab 셀 이동(마지막 셀 Tab은 행 추가), 행·열 추가와
8
+ * 표 삭제 커맨드. 셀 안 타이핑은 일반 블록 경로를 탄다.
9
+ */
10
+ /** 표 삽입 — 빈 블록이면 교체. 캐럿은 첫 셀의 문단으로 */
11
+ export function insertTable(rows = 3, cols = 3) {
12
+ return ({ state, tr, dispatch }) => {
13
+ const blockPath = caretBlockPath(state);
14
+ if (!blockPath)
15
+ return false;
16
+ const cell = () => ({
17
+ type: "tableCell",
18
+ content: [{ type: "paragraph", content: [] }],
19
+ });
20
+ const table = {
21
+ type: "table",
22
+ content: Array.from({ length: rows }, () => ({
23
+ type: "tableRow",
24
+ content: Array.from({ length: cols }, cell),
25
+ })),
26
+ };
27
+ const block = nodeAt(state.doc, blockPath);
28
+ const empty = !(block?.content ?? []).some((c) => c.text?.length);
29
+ const parentPath = blockPath.slice(0, -1);
30
+ const bi = blockPath[blockPath.length - 1];
31
+ if (empty) {
32
+ tr.replaceNode(blockPath, table);
33
+ }
34
+ else {
35
+ tr.insertNode({ path: parentPath, offset: bi + 1 }, table);
36
+ }
37
+ const ti = empty ? bi : bi + 1;
38
+ tr.insertNode({ path: parentPath, offset: ti + 1 }, { type: "paragraph", content: [] });
39
+ tr.setSelection(textSelection({ path: [...parentPath, ti, 0, 0, 0], offset: 0 }));
40
+ dispatch();
41
+ return true;
42
+ };
43
+ }
44
+ /** 캐럿이 속한 표 셀 컨텍스트 — 없으면 null */
45
+ function cellContext(state) {
46
+ const blockPath = caretBlockPath(state);
47
+ if (!blockPath)
48
+ return null;
49
+ for (let d = blockPath.length - 1; d >= 2; d--) {
50
+ const p = blockPath.slice(0, d);
51
+ if (nodeAt(state.doc, p)?.type === "tableCell") {
52
+ const rowPath = p.slice(0, -1);
53
+ if (nodeAt(state.doc, rowPath)?.type !== "tableRow")
54
+ return null;
55
+ const col = p[p.length - 1];
56
+ const row = rowPath[rowPath.length - 1];
57
+ return {
58
+ cellPath: p,
59
+ rowPath,
60
+ tablePath: rowPath.slice(0, -1),
61
+ col,
62
+ row,
63
+ };
64
+ }
65
+ }
66
+ return null;
67
+ }
68
+ function makeCell() {
69
+ return { type: "tableCell", content: [{ type: "paragraph", content: [] }] };
70
+ }
71
+ /** Tab — 다음 셀로. 마지막 셀이면 행을 추가하고 그 첫 셀로 (PM 관례) */
72
+ export const nextCell = ({ state, tr, dispatch }) => {
73
+ const ctx = cellContext(state);
74
+ if (!ctx)
75
+ return false;
76
+ const table = nodeAt(state.doc, ctx.tablePath);
77
+ const row = nodeAt(state.doc, ctx.rowPath);
78
+ const cols = row?.content?.length ?? 0;
79
+ const rows = table?.content?.length ?? 0;
80
+ let r = ctx.row;
81
+ let c = ctx.col + 1;
82
+ if (c >= cols) {
83
+ r += 1;
84
+ c = 0;
85
+ }
86
+ if (r >= rows) {
87
+ tr.insertNode({ path: ctx.tablePath, offset: rows }, {
88
+ type: "tableRow",
89
+ content: Array.from({ length: cols }, makeCell),
90
+ });
91
+ tr.setSelection(textSelection({ path: [...ctx.tablePath, rows, 0, 0], offset: 0 }));
92
+ }
93
+ else {
94
+ tr.setSelection(textSelection({ path: [...ctx.tablePath, r, c, 0], offset: 0 }));
95
+ }
96
+ dispatch();
97
+ return true;
98
+ };
99
+ /** Shift-Tab — 이전 셀로. 첫 셀이면 false(폴스루 → 표 밖으로 이동) */
100
+ export const prevCell = ({ state, tr, dispatch }) => {
101
+ const ctx = cellContext(state);
102
+ if (!ctx)
103
+ return false;
104
+ let r = ctx.row;
105
+ let c = ctx.col - 1;
106
+ if (c < 0) {
107
+ r -= 1;
108
+ if (r < 0)
109
+ return false;
110
+ const prev = nodeAt(state.doc, [...ctx.tablePath, r]);
111
+ c = (prev?.content?.length ?? 1) - 1;
112
+ }
113
+ tr.setSelection(textSelection({ path: [...ctx.tablePath, r, c, 0], offset: 0 }));
114
+ dispatch();
115
+ return true;
116
+ };
117
+ /** 현재 행 뒤에 같은 열 수의 행을 추가한다 */
118
+ export const addTableRow = ({ state, tr, dispatch }) => {
119
+ const ctx = cellContext(state);
120
+ if (!ctx)
121
+ return false;
122
+ const row = nodeAt(state.doc, ctx.rowPath);
123
+ const cols = row?.content?.length ?? 0;
124
+ tr.insertNode({ path: ctx.tablePath, offset: ctx.row + 1 }, { type: "tableRow", content: Array.from({ length: cols }, makeCell) });
125
+ tr.setSelection(textSelection({ path: [...ctx.tablePath, ctx.row + 1, 0, 0], offset: 0 }));
126
+ dispatch();
127
+ return true;
128
+ };
129
+ /** 표 끝에 열을 하나 추가한다 — 각 행에 셀을 붙인다 */
130
+ export const addTableColumn = ({ state, tr, dispatch }) => {
131
+ const ctx = cellContext(state);
132
+ if (!ctx)
133
+ return false;
134
+ const table = nodeAt(state.doc, ctx.tablePath);
135
+ const rows = table?.content?.length ?? 0;
136
+ for (let i = 0; i < rows; i++) {
137
+ const r = nodeAt(state.doc, [...ctx.tablePath, i]);
138
+ tr.insertNode({ path: [...ctx.tablePath, i], offset: r?.content?.length ?? 0 }, makeCell());
139
+ }
140
+ dispatch();
141
+ return true;
142
+ };
143
+ /** 표 통째 삭제 — 자리에 빈 문단을 남긴다 */
144
+ export const deleteTable = ({ state, tr, dispatch }) => {
145
+ const ctx = cellContext(state);
146
+ if (!ctx)
147
+ return false;
148
+ const ti = ctx.tablePath[ctx.tablePath.length - 1];
149
+ const parentPath = ctx.tablePath.slice(0, -1);
150
+ tr.delete({
151
+ anchor: { path: parentPath, offset: ti },
152
+ focus: { path: parentPath, offset: ti + 1 },
153
+ });
154
+ tr.insertNode({ path: parentPath, offset: ti }, { type: "paragraph", content: [] });
155
+ tr.setSelection(textSelection({ path: [...parentPath, ti], offset: 0 }));
156
+ dispatch();
157
+ return true;
158
+ };
159
+ export const tableFeature = defineFeature({
160
+ name: "table",
161
+ description: "표 — table>row>cell 구조, Tab 셀 이동·끝 셀 행 추가, 행/열 추가와 표 삭제",
162
+ nodes: {
163
+ // 표 — 셀은 블록을 품는다(셀 안 타이핑은 일반 경로)
164
+ tableCell: {
165
+ content: "block+",
166
+ toDOM: () => ({ tag: "td" }),
167
+ parseDOM: [{ tag: "td" }],
168
+ },
169
+ tableRow: {
170
+ content: "tableCell+",
171
+ toDOM: () => ({ tag: "tr" }),
172
+ parseDOM: [{ tag: "tr" }],
173
+ },
174
+ table: {
175
+ content: "tableRow+",
176
+ group: "block",
177
+ toDOM: () => ({ tag: "table", attrs: { class: "me-table" } }),
178
+ parseDOM: [{ tag: "table" }],
179
+ },
180
+ },
181
+ commands: {
182
+ insertTable: (ctx, rows, cols) => insertTable(Number(rows ?? 3), Number(cols ?? 3))(ctx),
183
+ addTableRow,
184
+ addTableColumn,
185
+ deleteTable,
186
+ nextCell,
187
+ prevCell,
188
+ },
189
+ keymap: {
190
+ // Tab — 코드블록·리스트가 먼저 소비하고 여기로 폴스루된다
191
+ Tab: nextCell,
192
+ "Shift-Tab": prevCell,
193
+ },
194
+ });
195
+ //# sourceMappingURL=table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.js","sourceRoot":"","sources":["../../src/features/table.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { Command } from "../editor/extension.js";
2
+ /**
3
+ * 할일 목록 — taskList > taskItem(체크박스 아이템).
4
+ * `[ ] `/`[x] ` 입력 규칙(Notion 관례)과 마커 클릭 토글.
5
+ * 아이템 동작(인덴트·lift·Enter 분할)은 lists 기능의 것을 공유한다.
6
+ */
7
+ /** 체크박스 토글 — 마커 클릭 경로가 직접 디스패치한다 */
8
+ export declare const toggleTaskItem: Command;
9
+ export declare const taskListFeature: import("./feature.js").Feature;
10
+ //# sourceMappingURL=task-list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-list.d.ts","sourceRoot":"","sources":["../../src/features/task-list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAMtD;;;;GAIG;AAEH,oCAAoC;AACpC,eAAO,MAAM,cAAc,EAAE,OAW5B,CAAC;AAEF,eAAO,MAAM,eAAe,gCA+C1B,CAAC"}
@@ -0,0 +1,68 @@
1
+ import { nodeAt } from "../model/traverse.js";
2
+ import { defineFeature } from "./feature.js";
3
+ import { toggleList } from "./lists.js";
4
+ import { wrapBlock } from "../commands.js";
5
+ /**
6
+ * 할일 목록 — taskList > taskItem(체크박스 아이템).
7
+ * `[ ] `/`[x] ` 입력 규칙(Notion 관례)과 마커 클릭 토글.
8
+ * 아이템 동작(인덴트·lift·Enter 분할)은 lists 기능의 것을 공유한다.
9
+ */
10
+ /** 체크박스 토글 — 마커 클릭 경로가 직접 디스패치한다 */
11
+ export const toggleTaskItem = ({ state, tr, dispatch }, path) => {
12
+ const p = Array.isArray(path) ? path : null;
13
+ const item = p && nodeAt(state.doc, p);
14
+ const spec = item && state.schema.nodeSpec(item.type);
15
+ if (!p || !item || !spec?.checkbox)
16
+ return false;
17
+ tr.setNodeAttr(p, "checked", !item.attrs?.["checked"]);
18
+ dispatch();
19
+ return true;
20
+ };
21
+ export const taskListFeature = defineFeature({
22
+ name: "taskList",
23
+ description: "할일 목록 — `[ ] `/`[x] ` 입력 규칙, 마커 클릭 체크 토글",
24
+ nodes: {
25
+ // 할일 목록 — li.me-task + data-checked, 마커는 CSS ::before
26
+ taskItem: {
27
+ content: "block+",
28
+ listItem: true,
29
+ checkbox: true,
30
+ attrs: { checked: { default: false } },
31
+ toDOM: (n) => ({
32
+ tag: "li",
33
+ attrs: {
34
+ class: "me-task",
35
+ "data-checked": n.attrs?.["checked"] ? "true" : "false",
36
+ },
37
+ }),
38
+ parseDOM: [{ tag: "li.me-task" }],
39
+ },
40
+ taskList: {
41
+ content: "taskItem+",
42
+ group: "block",
43
+ toDOM: () => ({ tag: "ul", attrs: { class: "me-tasks" } }),
44
+ parseDOM: [{ tag: "ul.me-tasks" }],
45
+ },
46
+ },
47
+ commands: {
48
+ toggleTaskList: toggleList("taskList"),
49
+ toggleTaskItem,
50
+ },
51
+ inputRules: [
52
+ // 할일 목록 — `[ ] `/`[x] ` (Notion 관례)
53
+ {
54
+ pattern: /^\[([ x])?\] $/,
55
+ handler: ({ tr }, m, range, doc) => wrapBlock(tr, range, doc, () => ({
56
+ type: "taskList",
57
+ content: [
58
+ {
59
+ type: "taskItem",
60
+ attrs: { checked: m[1] === "x" },
61
+ content: [],
62
+ },
63
+ ],
64
+ })),
65
+ },
66
+ ],
67
+ });
68
+ //# sourceMappingURL=task-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-list.js","sourceRoot":"","sources":["../../src/features/task-list.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C;;;;GAIG;AAEH,oCAAoC;AACpC,MAAM,CAAC,MAAM,cAAc,GAAY,CACrC,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,EACvB,IAAc,EACd,EAAE;IACF,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,IAAiB,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1D,MAAM,IAAI,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,QAAQ;QAAE,OAAO,KAAK,CAAC;IACjD,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IACvD,QAAQ,EAAE,CAAC;IACX,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,aAAa,CAAC;IAC3C,IAAI,EAAE,UAAU;IAChB,WAAW,EAAE,0CAA0C;IACvD,KAAK,EAAE;QACL,sDAAsD;QACtD,QAAQ,EAAE;YACR,OAAO,EAAE,QAAQ;YACjB,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;YACtC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACb,GAAG,EAAE,IAAI;gBACT,KAAK,EAAE;oBACL,KAAK,EAAE,SAAS;oBAChB,cAAc,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;iBACxD;aACF,CAAC;YACF,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC;SAClC;QACD,QAAQ,EAAE;YACR,OAAO,EAAE,WAAW;YACpB,KAAK,EAAE,OAAO;YACd,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,CAAC;YAC1D,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC;SACnC;KACF;IACD,QAAQ,EAAE;QACR,cAAc,EAAE,UAAU,CAAC,UAAU,CAAC;QACtC,cAAc;KACf;IACD,UAAU,EAAE;QACV,oCAAoC;QACpC;YACE,OAAO,EAAE,gBAAgB;YACzB,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CACjC,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;gBAC/B,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,UAAU;wBAChB,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;wBAChC,OAAO,EAAE,EAAE;qBACZ;iBACF;aACF,CAAC,CAAC;SACN;KACF;CACF,CAAC,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type { BlockTextCtx, Command, FileDropCtx, RangeCtx } from "../editor/extension.js";
2
+ import type { EditorNode } from "../model/node.js";
3
+ /**
4
+ * 기능 테스트 공용 도구 — 각 *.test.ts가 같은 에디터·타이핑·커맨드
5
+ * 실행 헬퍼를 공유한다. 입력 규칙은 실제 경로(insertText →
6
+ * applyInputRules)로 검증한다.
7
+ */
8
+ export declare const para: (...t: (string | EditorNode)[]) => EditorNode;
9
+ export declare const code: (t: string, lang?: string) => EditorNode;
10
+ export declare function editor(...blocks: EditorNode[]): import("../index.js").Editor;
11
+ export declare function selAt(e: ReturnType<typeof editor>, path: number[], offset: number): void;
12
+ /** 실제 입력 경로 — 글자마다 insertText + 입력 규칙 */
13
+ export declare function type(e: ReturnType<typeof editor>, text: string): void;
14
+ /** 커맨드를 직접 실행 — keymap 체인 없이 ctx를 수동으로 만든다 */
15
+ export declare function run(e: ReturnType<typeof editor>, cmd: Command): boolean;
16
+ /**
17
+ * 입력 훅용 블록 컨텍스트 — input.ts의 blockCtx와 같은 모양을
18
+ * 테스트에서 수동으로 만든다. 현재 doc 셀렉션이 앵커/포커스가 된다
19
+ * (비텍스트 셀렉션이면 블록 시작 캐럿으로 둔다).
20
+ */
21
+ export declare function textCtx(e: ReturnType<typeof editor>, blockPath: number[]): BlockTextCtx;
22
+ /**
23
+ * 범위 훅용 컨텍스트 — insertFromPaste(RangeCtx)를 테스트에서
24
+ * 직접 호출할 때 쓴다. 현재 doc 셀렉션의 정규화 범위를 담는다.
25
+ */
26
+ export declare function rangeCtx(e: ReturnType<typeof editor>): RangeCtx;
27
+ /**
28
+ * 파일 훅용 컨텍스트 — files(FileDropCtx)를 테스트에서 직접 호출할
29
+ * 때 쓴다. files는 File 객체 배열, at은 드롭 좌표 포인트다.
30
+ */
31
+ export declare function fileDropCtx(e: ReturnType<typeof editor>, files: File[], at?: FileDropCtx["at"]): FileDropCtx;
32
+ //# sourceMappingURL=testkit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testkit.d.ts","sourceRoot":"","sources":["../../src/features/testkit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,YAAY,EACZ,OAAO,EACP,WAAW,EACX,QAAQ,EACT,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAUnD;;;;GAIG;AAEH,eAAO,MAAM,IAAI,GAAI,GAAG,GAAG,CAAC,MAAM,GAAG,UAAU,CAAC,EAAE,KAAG,UAGnD,CAAC;AAEH,eAAO,MAAM,IAAI,GAAI,GAAG,MAAM,EAAE,OAAO,MAAM,KAAG,UAI9C,CAAC;AAEH,wBAAgB,MAAM,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,gCAK7C;AAED,wBAAgB,KAAK,CACnB,CAAC,EAAE,UAAU,CAAC,OAAO,MAAM,CAAC,EAC5B,IAAI,EAAE,MAAM,EAAE,EACd,MAAM,EAAE,MAAM,QAGf;AAED,yCAAyC;AACzC,wBAAgB,IAAI,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,QAI9D;AAED,8CAA8C;AAC9C,wBAAgB,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,MAAM,CAAC,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAGvE;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CACrB,CAAC,EAAE,UAAU,CAAC,OAAO,MAAM,CAAC,EAC5B,SAAS,EAAE,MAAM,EAAE,GAClB,YAAY,CAmBd;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,MAAM,CAAC,GAAG,QAAQ,CAc/D;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,CAAC,EAAE,UAAU,CAAC,OAAO,MAAM,CAAC,EAC5B,KAAK,EAAE,IAAI,EAAE,EACb,EAAE,GAAE,WAAW,CAAC,IAAI,CAAQ,GAC3B,WAAW,CAEb"}
@@ -0,0 +1,92 @@
1
+ import { createEditor } from "../editor/editor.js";
2
+ import { createDoc, createText } from "../model/node.js";
3
+ import { nodeAt } from "../model/traverse.js";
4
+ import { normalizedRange, point, textSelection, } from "../state/selection.js";
5
+ import { starterExtensions } from "../presets/starter.js";
6
+ import { blockText, blockTextOffset, blockTextPoint } from "../commands.js";
7
+ /**
8
+ * 기능 테스트 공용 도구 — 각 *.test.ts가 같은 에디터·타이핑·커맨드
9
+ * 실행 헬퍼를 공유한다. 입력 규칙은 실제 경로(insertText →
10
+ * applyInputRules)로 검증한다.
11
+ */
12
+ export const para = (...t) => ({
13
+ type: "paragraph",
14
+ content: t.map((x) => (typeof x === "string" ? createText(x) : x)),
15
+ });
16
+ export const code = (t, lang) => ({
17
+ type: "codeBlock",
18
+ attrs: lang ? { language: lang } : undefined,
19
+ content: [createText(t)],
20
+ });
21
+ export function editor(...blocks) {
22
+ return createEditor({
23
+ doc: createDoc(blocks),
24
+ extensions: starterExtensions(),
25
+ });
26
+ }
27
+ export function selAt(e, path, offset) {
28
+ e.dispatch(e.state.tr().setSelection(textSelection(point(path, offset))));
29
+ }
30
+ /** 실제 입력 경로 — 글자마다 insertText + 입력 규칙 */
31
+ export function type(e, text) {
32
+ for (const ch of text) {
33
+ e.dispatch(e.state.tr().insertText(ch).applyInputRules(e.inputRules));
34
+ }
35
+ }
36
+ /** 커맨드를 직접 실행 — keymap 체인 없이 ctx를 수동으로 만든다 */
37
+ export function run(e, cmd) {
38
+ const tr = e.state.tr();
39
+ return cmd({ state: e.state, tr, dispatch: () => e.dispatch(tr) });
40
+ }
41
+ /**
42
+ * 입력 훅용 블록 컨텍스트 — input.ts의 blockCtx와 같은 모양을
43
+ * 테스트에서 수동으로 만든다. 현재 doc 셀렉션이 앵커/포커스가 된다
44
+ * (비텍스트 셀렉션이면 블록 시작 캐럿으로 둔다).
45
+ */
46
+ export function textCtx(e, blockPath) {
47
+ const block = nodeAt(e.state.doc, blockPath);
48
+ if (!block)
49
+ throw new Error(`no block at ${blockPath}`);
50
+ const tr = e.state.tr();
51
+ const sel = e.state.selection;
52
+ const anchor = sel.type === "text" ? sel.anchor : point([...blockPath, 0], 0);
53
+ const focus = sel.type === "text" ? sel.focus : anchor;
54
+ return {
55
+ state: e.state,
56
+ tr,
57
+ dispatch: () => e.dispatch(tr),
58
+ block,
59
+ blockPath,
60
+ text: blockText(block),
61
+ anchor,
62
+ focus,
63
+ charPoint: (off) => blockTextPoint(block, blockPath, off),
64
+ offsetOf: (p) => blockTextOffset(block, p),
65
+ };
66
+ }
67
+ /**
68
+ * 범위 훅용 컨텍스트 — insertFromPaste(RangeCtx)를 테스트에서
69
+ * 직접 호출할 때 쓴다. 현재 doc 셀렉션의 정규화 범위를 담는다.
70
+ */
71
+ export function rangeCtx(e) {
72
+ const tr = e.state.tr();
73
+ const sel = e.state.selection;
74
+ const r = sel.type === "text"
75
+ ? normalizedRange(sel)
76
+ : { anchor: point([0, 0], 0), focus: point([0, 0], 0) };
77
+ return {
78
+ state: e.state,
79
+ tr,
80
+ dispatch: () => e.dispatch(tr),
81
+ anchor: r.anchor,
82
+ focus: r.focus,
83
+ };
84
+ }
85
+ /**
86
+ * 파일 훅용 컨텍스트 — files(FileDropCtx)를 테스트에서 직접 호출할
87
+ * 때 쓴다. files는 File 객체 배열, at은 드롭 좌표 포인트다.
88
+ */
89
+ export function fileDropCtx(e, files, at = null) {
90
+ return { editor: e, files, at, source: "paste" };
91
+ }
92
+ //# sourceMappingURL=testkit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testkit.js","sourceRoot":"","sources":["../../src/features/testkit.ts"],"names":[],"mappings":"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"}