@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.
- package/LICENSE +21 -0
- package/README.md +16 -0
- package/dist/commands.d.ts +78 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +299 -0
- package/dist/commands.js.map +1 -0
- package/dist/conformance.d.ts +59 -0
- package/dist/conformance.d.ts.map +1 -0
- package/dist/conformance.js +1609 -0
- package/dist/conformance.js.map +1 -0
- package/dist/core.d.ts +37 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js +117 -0
- package/dist/core.js.map +1 -0
- package/dist/editor/editor.d.ts +104 -0
- package/dist/editor/editor.d.ts.map +1 -0
- package/dist/editor/editor.js +204 -0
- package/dist/editor/editor.js.map +1 -0
- package/dist/editor/extension.d.ts +170 -0
- package/dist/editor/extension.d.ts.map +1 -0
- package/dist/editor/extension.js +2 -0
- package/dist/editor/extension.js.map +1 -0
- package/dist/features/ace.d.ts +9 -0
- package/dist/features/ace.d.ts.map +1 -0
- package/dist/features/ace.js +144 -0
- package/dist/features/ace.js.map +1 -0
- package/dist/features/alignment.d.ts +9 -0
- package/dist/features/alignment.d.ts.map +1 -0
- package/dist/features/alignment.js +28 -0
- package/dist/features/alignment.js.map +1 -0
- package/dist/features/blockquote.d.ts +9 -0
- package/dist/features/blockquote.d.ts.map +1 -0
- package/dist/features/blockquote.js +65 -0
- package/dist/features/blockquote.js.map +1 -0
- package/dist/features/code-block.d.ts +77 -0
- package/dist/features/code-block.d.ts.map +1 -0
- package/dist/features/code-block.js +986 -0
- package/dist/features/code-block.js.map +1 -0
- package/dist/features/doc.d.ts +15 -0
- package/dist/features/doc.d.ts.map +1 -0
- package/dist/features/doc.js +79 -0
- package/dist/features/doc.js.map +1 -0
- package/dist/features/feature.d.ts +26 -0
- package/dist/features/feature.d.ts.map +1 -0
- package/dist/features/feature.js +8 -0
- package/dist/features/feature.js.map +1 -0
- package/dist/features/hard-break.d.ts +9 -0
- package/dist/features/hard-break.d.ts.map +1 -0
- package/dist/features/hard-break.js +48 -0
- package/dist/features/hard-break.js.map +1 -0
- package/dist/features/heading.d.ts +3 -0
- package/dist/features/heading.d.ts.map +1 -0
- package/dist/features/heading.js +31 -0
- package/dist/features/heading.js.map +1 -0
- package/dist/features/horizontal-rule.d.ts +9 -0
- package/dist/features/horizontal-rule.d.ts.map +1 -0
- package/dist/features/horizontal-rule.js +64 -0
- package/dist/features/horizontal-rule.js.map +1 -0
- package/dist/features/image.d.ts +12 -0
- package/dist/features/image.d.ts.map +1 -0
- package/dist/features/image.js +116 -0
- package/dist/features/image.js.map +1 -0
- package/dist/features/index.d.ts +31 -0
- package/dist/features/index.d.ts.map +1 -0
- package/dist/features/index.js +65 -0
- package/dist/features/index.js.map +1 -0
- package/dist/features/inline-style.d.ts +12 -0
- package/dist/features/inline-style.d.ts.map +1 -0
- package/dist/features/inline-style.js +126 -0
- package/dist/features/inline-style.js.map +1 -0
- package/dist/features/link.d.ts +29 -0
- package/dist/features/link.d.ts.map +1 -0
- package/dist/features/link.js +198 -0
- package/dist/features/link.js.map +1 -0
- package/dist/features/lists.d.ts +14 -0
- package/dist/features/lists.d.ts.map +1 -0
- package/dist/features/lists.js +178 -0
- package/dist/features/lists.js.map +1 -0
- package/dist/features/marks.d.ts +6 -0
- package/dist/features/marks.d.ts.map +1 -0
- package/dist/features/marks.js +68 -0
- package/dist/features/marks.js.map +1 -0
- package/dist/features/script.d.ts +2 -0
- package/dist/features/script.d.ts.map +1 -0
- package/dist/features/script.js +55 -0
- package/dist/features/script.js.map +1 -0
- package/dist/features/table.d.ts +20 -0
- package/dist/features/table.d.ts.map +1 -0
- package/dist/features/table.js +195 -0
- package/dist/features/table.js.map +1 -0
- package/dist/features/task-list.d.ts +10 -0
- package/dist/features/task-list.d.ts.map +1 -0
- package/dist/features/task-list.js +68 -0
- package/dist/features/task-list.js.map +1 -0
- package/dist/features/testkit.d.ts +32 -0
- package/dist/features/testkit.d.ts.map +1 -0
- package/dist/features/testkit.js +92 -0
- package/dist/features/testkit.js.map +1 -0
- package/dist/history.d.ts +40 -0
- package/dist/history.d.ts.map +1 -0
- package/dist/history.js +192 -0
- package/dist/history.js.map +1 -0
- package/dist/index.d.ts +39 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/model/node.d.ts +47 -0
- package/dist/model/node.d.ts.map +1 -0
- package/dist/model/node.js +30 -0
- package/dist/model/node.js.map +1 -0
- package/dist/model/schema.d.ts +105 -0
- package/dist/model/schema.d.ts.map +1 -0
- package/dist/model/schema.js +46 -0
- package/dist/model/schema.js.map +1 -0
- package/dist/model/traverse.d.ts +36 -0
- package/dist/model/traverse.d.ts.map +1 -0
- package/dist/model/traverse.js +123 -0
- package/dist/model/traverse.js.map +1 -0
- package/dist/mount.d.ts +24 -0
- package/dist/mount.d.ts.map +1 -0
- package/dist/mount.js +45 -0
- package/dist/mount.js.map +1 -0
- package/dist/parse/html.d.ts +8 -0
- package/dist/parse/html.d.ts.map +1 -0
- package/dist/parse/html.js +247 -0
- package/dist/parse/html.js.map +1 -0
- package/dist/parse/sanitize.d.ts +20 -0
- package/dist/parse/sanitize.d.ts.map +1 -0
- package/dist/parse/sanitize.js +116 -0
- package/dist/parse/sanitize.js.map +1 -0
- package/dist/presets/highlight.d.ts +23 -0
- package/dist/presets/highlight.d.ts.map +1 -0
- package/dist/presets/highlight.js +170 -0
- package/dist/presets/highlight.js.map +1 -0
- package/dist/presets/starter.d.ts +14 -0
- package/dist/presets/starter.d.ts.map +1 -0
- package/dist/presets/starter.js +18 -0
- package/dist/presets/starter.js.map +1 -0
- package/dist/state/apply.d.ts +64 -0
- package/dist/state/apply.d.ts.map +1 -0
- package/dist/state/apply.js +528 -0
- package/dist/state/apply.js.map +1 -0
- package/dist/state/navigate.d.ts +5 -0
- package/dist/state/navigate.d.ts.map +1 -0
- package/dist/state/navigate.js +81 -0
- package/dist/state/navigate.js.map +1 -0
- package/dist/state/selection.d.ts +44 -0
- package/dist/state/selection.d.ts.map +1 -0
- package/dist/state/selection.js +63 -0
- package/dist/state/selection.js.map +1 -0
- package/dist/state/state.d.ts +39 -0
- package/dist/state/state.d.ts.map +1 -0
- package/dist/state/state.js +123 -0
- package/dist/state/state.js.map +1 -0
- package/dist/state/transaction.d.ts +234 -0
- package/dist/state/transaction.d.ts.map +1 -0
- package/dist/state/transaction.js +988 -0
- package/dist/state/transaction.js.map +1 -0
- package/dist/styles.css +948 -0
- package/dist/types.d.ts +44 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/view/dom.d.ts +26 -0
- package/dist/view/dom.d.ts.map +1 -0
- package/dist/view/dom.js +249 -0
- package/dist/view/dom.js.map +1 -0
- package/dist/view/input.d.ts +45 -0
- package/dist/view/input.d.ts.map +1 -0
- package/dist/view/input.js +901 -0
- package/dist/view/input.js.map +1 -0
- package/dist/view/mount.d.ts +26 -0
- package/dist/view/mount.d.ts.map +1 -0
- package/dist/view/mount.js +119 -0
- package/dist/view/mount.js.map +1 -0
- package/dist/view/render.d.ts +64 -0
- package/dist/view/render.d.ts.map +1 -0
- package/dist/view/render.js +203 -0
- package/dist/view/render.js.map +1 -0
- package/dist/view/serialize.d.ts +4 -0
- package/dist/view/serialize.d.ts.map +1 -0
- package/dist/view/serialize.js +37 -0
- package/dist/view/serialize.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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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"}
|