@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":"navigate.js","sourceRoot":"","sources":["../../src/state/navigate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 셀렉션 — Slate 스타일 { path, offset } 좌표.
|
|
3
|
+
*
|
|
4
|
+
* ProseMirror의 flat integer pos 대신 path+offset을 택한 이유:
|
|
5
|
+
* - JSON 트리와 자연스럽게 매핑 — ResolvedPos 같은 해석/캐시 계층 불필요
|
|
6
|
+
* - 각 포인트가 독립 직렬화 가능 — Yjs RelativePosition 매핑의 전제 조건
|
|
7
|
+
* - 트랜잭션 step이 문서 전체 오프셋 재계산 없이 로컬하게 기술된다
|
|
8
|
+
* 트레이드오프: 문서 전체를 단일 포지션 공간으로 순회하는 연산은 PM 방식이
|
|
9
|
+
* 빠르다. 편집 연산은 대부분 셀렉션 주변에 국한되므로 감수할 수 있는 비용이다.
|
|
10
|
+
*/
|
|
11
|
+
/** 문서 내 위치 — path는 doc 루트에서의 자식 인덱스 경로 */
|
|
12
|
+
export interface Point {
|
|
13
|
+
readonly path: readonly number[];
|
|
14
|
+
/** 텍스트 노드 안이면 문자 오프셋, 노드 사이 위치면 자식 인덱스 */
|
|
15
|
+
readonly offset: number;
|
|
16
|
+
}
|
|
17
|
+
export interface Range {
|
|
18
|
+
readonly anchor: Point;
|
|
19
|
+
readonly focus: Point;
|
|
20
|
+
}
|
|
21
|
+
/** 텍스트 셀렉션 — anchor가 focus보다 뒤일 수 있다 (역방향 드래그) */
|
|
22
|
+
export interface TextSelection {
|
|
23
|
+
readonly type: "text";
|
|
24
|
+
readonly anchor: Point;
|
|
25
|
+
readonly focus: Point;
|
|
26
|
+
}
|
|
27
|
+
/** 아톰/블록 노드 통째 선택 (image, hr) — path가 노드를 가리킨다 */
|
|
28
|
+
export interface NodeSelection {
|
|
29
|
+
readonly type: "node";
|
|
30
|
+
readonly path: readonly number[];
|
|
31
|
+
}
|
|
32
|
+
export type Selection = TextSelection | NodeSelection;
|
|
33
|
+
export declare function point(path: readonly number[], offset: number): Point;
|
|
34
|
+
export declare function textSelection(anchor: Point, focus?: Point): TextSelection;
|
|
35
|
+
export declare function nodeSelection(path: readonly number[]): NodeSelection;
|
|
36
|
+
export declare function pointEq(a: Point, b: Point): boolean;
|
|
37
|
+
/** 문서 순서 비교 — a<b:-1, a==b:0, a>b:1 (path 사전식 → offset) */
|
|
38
|
+
export declare function pointCmp(a: Point, b: Point): number;
|
|
39
|
+
export declare function selectionEq(a: Selection, b: Selection): boolean;
|
|
40
|
+
export declare function isCollapsed(sel: Selection): boolean;
|
|
41
|
+
/** anchor<=focus로 정규화된 범위 — step의 range는 항상 이 형태 */
|
|
42
|
+
export declare function normalizedRange(sel: TextSelection): Range;
|
|
43
|
+
export declare function normalizeRange(range: Range): Range;
|
|
44
|
+
//# sourceMappingURL=selection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selection.d.ts","sourceRoot":"","sources":["../../src/state/selection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,0CAA0C;AAC1C,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,0CAA0C;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;CACvB;AAED,kDAAkD;AAClD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;CACvB;AAED,kDAAkD;AAClD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AAED,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,aAAa,CAAC;AAEtD,wBAAgB,KAAK,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,KAAK,CAEpE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,aAAa,CAEzE;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,aAAa,CAEpE;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,GAAG,OAAO,CAMnD;AAED,2DAA2D;AAC3D,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,GAAG,MAAM,CAUnD;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,OAAO,CAS/D;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAEnD;AAED,oDAAoD;AACpD,wBAAgB,eAAe,CAAC,GAAG,EAAE,aAAa,GAAG,KAAK,CAEzD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAIlD"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 셀렉션 — Slate 스타일 { path, offset } 좌표.
|
|
3
|
+
*
|
|
4
|
+
* ProseMirror의 flat integer pos 대신 path+offset을 택한 이유:
|
|
5
|
+
* - JSON 트리와 자연스럽게 매핑 — ResolvedPos 같은 해석/캐시 계층 불필요
|
|
6
|
+
* - 각 포인트가 독립 직렬화 가능 — Yjs RelativePosition 매핑의 전제 조건
|
|
7
|
+
* - 트랜잭션 step이 문서 전체 오프셋 재계산 없이 로컬하게 기술된다
|
|
8
|
+
* 트레이드오프: 문서 전체를 단일 포지션 공간으로 순회하는 연산은 PM 방식이
|
|
9
|
+
* 빠르다. 편집 연산은 대부분 셀렉션 주변에 국한되므로 감수할 수 있는 비용이다.
|
|
10
|
+
*/
|
|
11
|
+
export function point(path, offset) {
|
|
12
|
+
return { path, offset };
|
|
13
|
+
}
|
|
14
|
+
export function textSelection(anchor, focus) {
|
|
15
|
+
return { type: "text", anchor, focus: focus ?? anchor };
|
|
16
|
+
}
|
|
17
|
+
export function nodeSelection(path) {
|
|
18
|
+
return { type: "node", path };
|
|
19
|
+
}
|
|
20
|
+
export function pointEq(a, b) {
|
|
21
|
+
return (a.offset === b.offset &&
|
|
22
|
+
a.path.length === b.path.length &&
|
|
23
|
+
a.path.every((p, i) => p === b.path[i]));
|
|
24
|
+
}
|
|
25
|
+
/** 문서 순서 비교 — a<b:-1, a==b:0, a>b:1 (path 사전식 → offset) */
|
|
26
|
+
export function pointCmp(a, b) {
|
|
27
|
+
const len = Math.min(a.path.length, b.path.length);
|
|
28
|
+
for (let i = 0; i < len; i++) {
|
|
29
|
+
const d = (a.path[i] ?? 0) - (b.path[i] ?? 0);
|
|
30
|
+
if (d !== 0)
|
|
31
|
+
return d < 0 ? -1 : 1;
|
|
32
|
+
}
|
|
33
|
+
const lenDiff = a.path.length - b.path.length;
|
|
34
|
+
if (lenDiff !== 0)
|
|
35
|
+
return lenDiff < 0 ? -1 : 1;
|
|
36
|
+
if (a.offset === b.offset)
|
|
37
|
+
return 0;
|
|
38
|
+
return a.offset < b.offset ? -1 : 1;
|
|
39
|
+
}
|
|
40
|
+
export function selectionEq(a, b) {
|
|
41
|
+
if (a.type !== b.type)
|
|
42
|
+
return false;
|
|
43
|
+
if (a.type === "node" && b.type === "node") {
|
|
44
|
+
return pointEq(point(a.path, 0), point(b.path, 0));
|
|
45
|
+
}
|
|
46
|
+
if (a.type === "text" && b.type === "text") {
|
|
47
|
+
return pointEq(a.anchor, b.anchor) && pointEq(a.focus, b.focus);
|
|
48
|
+
}
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
export function isCollapsed(sel) {
|
|
52
|
+
return sel.type === "text" && pointEq(sel.anchor, sel.focus);
|
|
53
|
+
}
|
|
54
|
+
/** anchor<=focus로 정규화된 범위 — step의 range는 항상 이 형태 */
|
|
55
|
+
export function normalizedRange(sel) {
|
|
56
|
+
return normalizeRange(sel);
|
|
57
|
+
}
|
|
58
|
+
export function normalizeRange(range) {
|
|
59
|
+
return pointCmp(range.anchor, range.focus) <= 0
|
|
60
|
+
? range
|
|
61
|
+
: { anchor: range.focus, focus: range.anchor };
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=selection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selection.js","sourceRoot":"","sources":["../../src/state/selection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { DocNode, Mark } from "../model/node.js";
|
|
2
|
+
import type { Schema } from "../model/schema.js";
|
|
3
|
+
import type { Plugin } from "../editor/extension.js";
|
|
4
|
+
import type { Selection } from "./selection.js";
|
|
5
|
+
import type { Transaction } from "./transaction.js";
|
|
6
|
+
/**
|
|
7
|
+
* 불변 편집 상태 — 이 객체 자체가 구독자에게 가는 스냅샷이다.
|
|
8
|
+
*
|
|
9
|
+
* EditorState가 이미 불변이므로 어댑터용 "스냅샷 빌드" 비용이 0이고,
|
|
10
|
+
* 변경 전까지 같은 참조가 유지된다 — 기존 규약(getSnapshot 참조 안정)
|
|
11
|
+
* 을 설계로 보장한다. ProseMirror의 EditorState와 같은 역할이지만 doc이
|
|
12
|
+
* plain JSON이라 상태 비교·디버깅·영속화가 더 단순하다.
|
|
13
|
+
*/
|
|
14
|
+
export interface EditorStateConfig {
|
|
15
|
+
schema: Schema;
|
|
16
|
+
doc?: DocNode;
|
|
17
|
+
selection?: Selection;
|
|
18
|
+
storedMarks?: readonly Mark[];
|
|
19
|
+
}
|
|
20
|
+
export interface EditorState {
|
|
21
|
+
readonly schema: Schema;
|
|
22
|
+
readonly doc: DocNode;
|
|
23
|
+
readonly selection: Selection;
|
|
24
|
+
/** 커서 뒤 입력에 적용할 마크 (bold 토글 후 타이핑 등) — 없으면 null */
|
|
25
|
+
readonly storedMarks: readonly Mark[] | null;
|
|
26
|
+
/** 플러그인 상태 — key → 직렬화 가능 값 */
|
|
27
|
+
readonly pluginState: Readonly<Record<string, unknown>>;
|
|
28
|
+
/** 트랜잭션 적용 → 새 EditorState (변경 없는 서브트리는 참조 공유) */
|
|
29
|
+
apply(tr: Transaction): EditorState;
|
|
30
|
+
/** 이 상태에서 시작하는 새 트랜잭션 빌더 */
|
|
31
|
+
tr(): Transaction;
|
|
32
|
+
}
|
|
33
|
+
export interface CreateStateOptions extends EditorStateConfig {
|
|
34
|
+
/** 플러그인 — init/apply로 pluginState를 채운다 */
|
|
35
|
+
plugins?: readonly Plugin[];
|
|
36
|
+
}
|
|
37
|
+
/** 초기 EditorState 생성 — doc 없으면 빈 문서, selection은 첫 텍스트 앞 */
|
|
38
|
+
export declare function createState(options: CreateStateOptions): EditorState;
|
|
39
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/state/state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAEtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAGrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,KAAK,EAAQ,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE1D;;;;;;;GAOG;AAEH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,WAAW,CAAC,EAAE,SAAS,IAAI,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,mDAAmD;IACnD,QAAQ,CAAC,WAAW,EAAE,SAAS,IAAI,EAAE,GAAG,IAAI,CAAC;IAC7C,+BAA+B;IAC/B,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAExD,kDAAkD;IAClD,KAAK,CAAC,EAAE,EAAE,WAAW,GAAG,WAAW,CAAC;IACpC,4BAA4B;IAC5B,EAAE,IAAI,WAAW,CAAC;CACnB;AAED,MAAM,WAAW,kBAAmB,SAAQ,iBAAiB;IAC3D,0CAA0C;IAC1C,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7B;AAsGD,2DAA2D;AAC3D,wBAAgB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,CAsBpE"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { createDoc } from "../model/node.js";
|
|
2
|
+
import { firstTextPath } from "../model/traverse.js";
|
|
3
|
+
import { applyStep, mapPoint } from "./apply.js";
|
|
4
|
+
import { selectionEq, textSelection } from "./selection.js";
|
|
5
|
+
import { TransactionBuilder } from "./transaction.js";
|
|
6
|
+
// ── 구현 ────────────────────────────────────────────────────
|
|
7
|
+
/** 셀렉션 포인트를 step 하나 통과시켜 매핑한다 */
|
|
8
|
+
function mapSelection(sel, step, doc) {
|
|
9
|
+
if (sel.type === "text") {
|
|
10
|
+
const anchor = mapPoint(sel.anchor, step, doc);
|
|
11
|
+
const focus = mapPoint(sel.focus, step, doc);
|
|
12
|
+
return anchor === sel.anchor && focus === sel.focus
|
|
13
|
+
? sel
|
|
14
|
+
: { type: "text", anchor, focus };
|
|
15
|
+
}
|
|
16
|
+
// NodeSelection — 노드 앞 경계 포인트로 매핑 후 path로 환원
|
|
17
|
+
const mapped = mapPoint({ path: sel.path.slice(0, -1), offset: sel.path[sel.path.length - 1] }, step, doc);
|
|
18
|
+
const path = [...mapped.path, mapped.offset];
|
|
19
|
+
return pathEq(path, sel.path) ? sel : { type: "node", path };
|
|
20
|
+
}
|
|
21
|
+
function pathEq(a, b) {
|
|
22
|
+
return a.length === b.length && a.every((v, i) => v === b[i]);
|
|
23
|
+
}
|
|
24
|
+
class EditorStateImpl {
|
|
25
|
+
constructor(schema, doc, selection, storedMarks, pluginState, plugins) {
|
|
26
|
+
Object.defineProperty(this, "schema", {
|
|
27
|
+
enumerable: true,
|
|
28
|
+
configurable: true,
|
|
29
|
+
writable: true,
|
|
30
|
+
value: schema
|
|
31
|
+
});
|
|
32
|
+
Object.defineProperty(this, "doc", {
|
|
33
|
+
enumerable: true,
|
|
34
|
+
configurable: true,
|
|
35
|
+
writable: true,
|
|
36
|
+
value: doc
|
|
37
|
+
});
|
|
38
|
+
Object.defineProperty(this, "selection", {
|
|
39
|
+
enumerable: true,
|
|
40
|
+
configurable: true,
|
|
41
|
+
writable: true,
|
|
42
|
+
value: selection
|
|
43
|
+
});
|
|
44
|
+
Object.defineProperty(this, "storedMarks", {
|
|
45
|
+
enumerable: true,
|
|
46
|
+
configurable: true,
|
|
47
|
+
writable: true,
|
|
48
|
+
value: storedMarks
|
|
49
|
+
});
|
|
50
|
+
Object.defineProperty(this, "pluginState", {
|
|
51
|
+
enumerable: true,
|
|
52
|
+
configurable: true,
|
|
53
|
+
writable: true,
|
|
54
|
+
value: pluginState
|
|
55
|
+
});
|
|
56
|
+
Object.defineProperty(this, "plugins", {
|
|
57
|
+
enumerable: true,
|
|
58
|
+
configurable: true,
|
|
59
|
+
writable: true,
|
|
60
|
+
value: plugins
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
tr() {
|
|
64
|
+
return new TransactionBuilder(this);
|
|
65
|
+
}
|
|
66
|
+
apply(tr) {
|
|
67
|
+
let doc = this.doc;
|
|
68
|
+
let sel = this.selection;
|
|
69
|
+
for (const step of tr.steps) {
|
|
70
|
+
sel = mapSelection(sel, step, doc);
|
|
71
|
+
doc = applyStep(doc, step);
|
|
72
|
+
}
|
|
73
|
+
if (tr.selection)
|
|
74
|
+
sel = tr.selection;
|
|
75
|
+
const docChanged = doc !== this.doc;
|
|
76
|
+
// storedMarks는 "다음 입력에 적용할 마크" — doc 변경(타이핑)으로는
|
|
77
|
+
// 지우지 않는다. 지워지는 경로는 tr.setStoredMarks 명시 호출
|
|
78
|
+
// ([] 클리어 — 커서 이동 시 input.ts가 호출)뿐. PM 관례.
|
|
79
|
+
const storedMarks = tr.storedMarks !== null ? tr.storedMarks : this.storedMarks;
|
|
80
|
+
// pluginState — apply 시그니처에는 doc이 반영된 상태를 넘긴다
|
|
81
|
+
let pluginState = this.pluginState;
|
|
82
|
+
let psChanged = false;
|
|
83
|
+
if (this.plugins.some((p) => p.apply)) {
|
|
84
|
+
const shell = new EditorStateImpl(this.schema, doc, sel, storedMarks, pluginState, this.plugins);
|
|
85
|
+
for (const p of this.plugins) {
|
|
86
|
+
if (!p.apply)
|
|
87
|
+
continue;
|
|
88
|
+
const next = p.apply(tr, pluginState[p.key], this, shell);
|
|
89
|
+
if (next !== pluginState[p.key]) {
|
|
90
|
+
if (!psChanged) {
|
|
91
|
+
pluginState = { ...pluginState };
|
|
92
|
+
psChanged = true;
|
|
93
|
+
}
|
|
94
|
+
pluginState[p.key] = next;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// 아무것도 안 바뀌었으면 같은 참조 — 구독자 참조 비교의 근거
|
|
99
|
+
if (doc === this.doc &&
|
|
100
|
+
selectionEq(sel, this.selection) &&
|
|
101
|
+
storedMarks === this.storedMarks &&
|
|
102
|
+
!psChanged) {
|
|
103
|
+
return this;
|
|
104
|
+
}
|
|
105
|
+
return new EditorStateImpl(this.schema, doc, sel, storedMarks, pluginState, this.plugins);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/** 초기 EditorState 생성 — doc 없으면 빈 문서, selection은 첫 텍스트 앞 */
|
|
109
|
+
export function createState(options) {
|
|
110
|
+
const plugins = options.plugins ?? [];
|
|
111
|
+
const doc = options.doc ?? createDoc([]);
|
|
112
|
+
const firstPath = firstTextPath(doc);
|
|
113
|
+
const selection = options.selection ??
|
|
114
|
+
textSelection(firstPath ? { path: firstPath, offset: 0 } : { path: [0], offset: 0 });
|
|
115
|
+
const pluginState = {};
|
|
116
|
+
const shell = new EditorStateImpl(options.schema, doc, selection, options.storedMarks ?? null, pluginState, plugins);
|
|
117
|
+
for (const p of plugins) {
|
|
118
|
+
if (p.init)
|
|
119
|
+
pluginState[p.key] = p.init(shell);
|
|
120
|
+
}
|
|
121
|
+
return shell;
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/state/state.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAuCtD,6DAA6D;AAE7D,iCAAiC;AACjC,SAAS,YAAY,CAAC,GAAc,EAAE,IAAU,EAAE,GAAY;IAC5D,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;QAC7C,OAAO,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,KAAK,KAAK,GAAG,CAAC,KAAK;YACjD,CAAC,CAAC,GAAG;YACL,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IACtC,CAAC;IACD,6CAA6C;IAC7C,MAAM,MAAM,GAAG,QAAQ,CACrB,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAE,EAAE,EACvE,IAAI,EACJ,GAAG,CACJ,CAAC;IACF,MAAM,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7C,OAAO,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAC/D,CAAC;AAED,SAAS,MAAM,CAAC,CAAoB,EAAE,CAAoB;IACxD,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,eAAe;IACnB,YACW,MAAc,EACd,GAAY,EACZ,SAAoB,EACpB,WAAmC,EACnC,WAA8C,EACtC,OAA0B;QAL3C;;;;mBAAS,MAAM;WAAQ;QACvB;;;;mBAAS,GAAG;WAAS;QACrB;;;;mBAAS,SAAS;WAAW;QAC7B;;;;mBAAS,WAAW;WAAwB;QAC5C;;;;mBAAS,WAAW;WAAmC;QACvD;;;;mBAAiB,OAAO;WAAmB;IAC1C,CAAC;IAEJ,EAAE;QACA,OAAO,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,EAAe;QACnB,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QACnB,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC;QACzB,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC;YAC5B,GAAG,GAAG,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;YACnC,GAAG,GAAG,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC7B,CAAC;QACD,IAAI,EAAE,CAAC,SAAS;YAAE,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC;QAErC,MAAM,UAAU,GAAG,GAAG,KAAK,IAAI,CAAC,GAAG,CAAC;QACpC,gDAAgD;QAChD,4CAA4C;QAC5C,2CAA2C;QAC3C,MAAM,WAAW,GACf,EAAE,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;QAE9D,8CAA8C;QAC9C,IAAI,WAAW,GAA4B,IAAI,CAAC,WAAW,CAAC;QAC5D,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YACtC,MAAM,KAAK,GAAG,IAAI,eAAe,CAC/B,IAAI,CAAC,MAAM,EACX,GAAG,EACH,GAAG,EACH,WAAW,EACX,WAAW,EACX,IAAI,CAAC,OAAO,CACb,CAAC;YACF,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBAC7B,IAAI,CAAC,CAAC,CAAC,KAAK;oBAAE,SAAS;gBACvB,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;gBAC1D,IAAI,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;oBAChC,IAAI,CAAC,SAAS,EAAE,CAAC;wBACf,WAAW,GAAG,EAAE,GAAG,WAAW,EAAE,CAAC;wBACjC,SAAS,GAAG,IAAI,CAAC;oBACnB,CAAC;oBACD,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;gBAC5B,CAAC;YACH,CAAC;QACH,CAAC;QAED,qCAAqC;QACrC,IACE,GAAG,KAAK,IAAI,CAAC,GAAG;YAChB,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC;YAChC,WAAW,KAAK,IAAI,CAAC,WAAW;YAChC,CAAC,SAAS,EACV,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,IAAI,eAAe,CACxB,IAAI,CAAC,MAAM,EACX,GAAG,EACH,GAAG,EACH,WAAW,EACX,WAAW,EACX,IAAI,CAAC,OAAO,CACb,CAAC;IACJ,CAAC;CACF;AAED,2DAA2D;AAC3D,MAAM,UAAU,WAAW,CAAC,OAA2B;IACrD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;IACtC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,SAAS,GACb,OAAO,CAAC,SAAS;QACjB,aAAa,CACX,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CACtE,CAAC;IACJ,MAAM,WAAW,GAA4B,EAAE,CAAC;IAChD,MAAM,KAAK,GAAG,IAAI,eAAe,CAC/B,OAAO,CAAC,MAAM,EACd,GAAG,EACH,SAAS,EACT,OAAO,CAAC,WAAW,IAAI,IAAI,EAC3B,WAAW,EACX,OAAO,CACR,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,IAAI;YAAE,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import type { InputRule } from "../editor/extension.js";
|
|
2
|
+
import type { EditorNode, Mark } from "../model/node.js";
|
|
3
|
+
import type { EditorState } from "./state.js";
|
|
4
|
+
import type { Point, Range, Selection } from "./selection.js";
|
|
5
|
+
/**
|
|
6
|
+
* 트랜잭션 = 하나의 디스패치 단위. Step 배열 + 셀렉션 + 메타데이터.
|
|
7
|
+
*
|
|
8
|
+
* Step은 순수 JSON이다 — { op, ... } 만으로 문서 변경을 완전히 기술한다.
|
|
9
|
+
* 이 결정이 협업(CRDT)의 전제다: Lexical의 editor.update(fn) 클로저는
|
|
10
|
+
* 직렬화 불가라 재생·전송이 안 되고, PM Step은 직렬화 가능하지만
|
|
11
|
+
* 클래스 Fragment에 결합되어 있다. moda-editor Step은 plain object라
|
|
12
|
+
* 그대로 전송·로그·리플레이·Yjs op 변환이 가능하다.
|
|
13
|
+
*
|
|
14
|
+
* 위치 표기는 Point(path+offset) — step끼리 독립 직렬화되므로 협업
|
|
15
|
+
* 바인딩이 문서 해석 없이 step만으로 op를 만들 수 있다.
|
|
16
|
+
*/
|
|
17
|
+
/** doc 구조를 바꾸는 원자 연산 — 전부 JSON 직렬화 가능 */
|
|
18
|
+
export type Step = InsertStep | RemoveStep | SetAttrStep | AddMarkStep | RemoveMarkStep | SplitStep | JoinStep;
|
|
19
|
+
/** at.path 부모 아래 at.offset 위치에 노드 삽입 */
|
|
20
|
+
export interface InsertStep {
|
|
21
|
+
readonly op: "insert";
|
|
22
|
+
readonly at: Point;
|
|
23
|
+
readonly node: EditorNode;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 노드/텍스트 조각 제거 — node에 제거된 내용을 담아 역변환(undo)에
|
|
27
|
+
* 쓴다. 텍스트 일부 제거는 {type:"text", text:"제거분"}이다.
|
|
28
|
+
*/
|
|
29
|
+
export interface RemoveStep {
|
|
30
|
+
readonly op: "remove";
|
|
31
|
+
readonly at: Point;
|
|
32
|
+
readonly node: EditorNode;
|
|
33
|
+
}
|
|
34
|
+
export interface SetAttrStep {
|
|
35
|
+
readonly op: "setAttr";
|
|
36
|
+
readonly path: readonly number[];
|
|
37
|
+
readonly key: string;
|
|
38
|
+
readonly value: unknown;
|
|
39
|
+
/** 이전 값 — undo용 */
|
|
40
|
+
readonly prev?: unknown;
|
|
41
|
+
}
|
|
42
|
+
export interface AddMarkStep {
|
|
43
|
+
readonly op: "addMark";
|
|
44
|
+
/** 정규화된(anchor<=focus) 범위 */
|
|
45
|
+
readonly range: Range;
|
|
46
|
+
readonly mark: Mark;
|
|
47
|
+
}
|
|
48
|
+
export interface RemoveMarkStep {
|
|
49
|
+
readonly op: "removeMark";
|
|
50
|
+
readonly range: Range;
|
|
51
|
+
readonly markType: string;
|
|
52
|
+
}
|
|
53
|
+
/** at 위치에서 depth만큼 상위까지 노드를 둘로 나눈다 (Enter) */
|
|
54
|
+
export interface SplitStep {
|
|
55
|
+
readonly op: "split";
|
|
56
|
+
readonly at: Point;
|
|
57
|
+
readonly depth?: number;
|
|
58
|
+
}
|
|
59
|
+
/** at 위치의 이전/다음 형제를 하나로 합친다 (문단 앞 Backspace) */
|
|
60
|
+
export interface JoinStep {
|
|
61
|
+
readonly op: "join";
|
|
62
|
+
readonly at: Point;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* 트랜잭션 — EditorState.tr()이 만드는 빌더.
|
|
66
|
+
* 메서드는 체이닝 가능하며 this를 반환한다(빌더는 가변, 결과물은 불변).
|
|
67
|
+
* 구현은 Phase 2에서 제공한다.
|
|
68
|
+
*/
|
|
69
|
+
export interface Transaction {
|
|
70
|
+
readonly steps: readonly Step[];
|
|
71
|
+
/** 적용 후 셀렉션 — null이면 스텝에 의해 자동 매핑 */
|
|
72
|
+
readonly selection: Selection | null;
|
|
73
|
+
/** 커서 뒤 입력에 적용할 마크 — null이면 변경 없음 */
|
|
74
|
+
readonly storedMarks: readonly Mark[] | null;
|
|
75
|
+
/** 스텝으로 doc이 바뀌는가 — selection만 바뀐 tr과 구분 */
|
|
76
|
+
readonly docChanged: boolean;
|
|
77
|
+
/** 디스패치 출처/부가 정보 — "pointer", "paste", 플러그인 키 등 */
|
|
78
|
+
readonly meta: Readonly<Record<string, unknown>>;
|
|
79
|
+
insertText(text: string, at?: Point): this;
|
|
80
|
+
insertNode(at: Point, node: EditorNode): this;
|
|
81
|
+
split(at?: Point, depth?: number): this;
|
|
82
|
+
/**
|
|
83
|
+
* 리스트 아이템 분할 (li 안 Enter) — 캐럿 위치에서 아이템의 인라인
|
|
84
|
+
* 블록을 자르고 꼬리를 새 같은-타입 아이템으로 만든다. 아이템 맨
|
|
85
|
+
* 앞이면 빈 아이템을 위에 삽입한다.
|
|
86
|
+
*/
|
|
87
|
+
splitItem(itemPath: readonly number[], caret: Point): this;
|
|
88
|
+
/**
|
|
89
|
+
* 리스트 아이템을 리스트 밖으로 꺼낸다 (빈 아이템 Enter, 아이템 시작
|
|
90
|
+
* Backspace, Shift-Tab) — 아이템의 블록들이 리스트 형제가 된다.
|
|
91
|
+
* 리스트 중간이면 리스트를 둘로 나눠 사이에 끼운다.
|
|
92
|
+
*/
|
|
93
|
+
liftItem(itemPath: readonly number[]): this;
|
|
94
|
+
/**
|
|
95
|
+
* 리스트 아이템을 이전 형제 아래 중첩 리스트로 옮긴다 (Tab).
|
|
96
|
+
* 첫 아이템이면 아무것도 하지 않는다.
|
|
97
|
+
*/
|
|
98
|
+
sinkItem(itemPath: readonly number[]): this;
|
|
99
|
+
delete(range: Range): this;
|
|
100
|
+
/** path의 노드를 다른 노드로 통째 교체 (타입 변경 등) */
|
|
101
|
+
replaceNode(path: readonly number[], node: EditorNode): this;
|
|
102
|
+
/**
|
|
103
|
+
* 파싱된 노드 조각(slice)을 at에 삽입 — 붙여넣기 경로.
|
|
104
|
+
* 단일 텍스트블록/전부 인라인이면 텍스트를 분할해 인라인으로 풀어 넣고,
|
|
105
|
+
* 블록이 섞이면 현재 블록을 나누고 사이에 삽입한다.
|
|
106
|
+
*/
|
|
107
|
+
insertSlice(at: Point, nodes: readonly EditorNode[]): this;
|
|
108
|
+
/** 원시 스텝 추가 — 플러그인/커맨드에서 저수준 연산이 필요할 때 */
|
|
109
|
+
addStep(step: Step): this;
|
|
110
|
+
addMark(range: Range, mark: Mark): this;
|
|
111
|
+
removeMark(range: Range, markType: string): this;
|
|
112
|
+
setNodeAttr(path: readonly number[], key: string, value: unknown): this;
|
|
113
|
+
setSelection(selection: Selection): this;
|
|
114
|
+
setStoredMarks(marks: readonly Mark[] | null): this;
|
|
115
|
+
setMeta(key: string, value: unknown): this;
|
|
116
|
+
/**
|
|
117
|
+
* 입력 규칙 — 캐럿이 멈춘 텍스트블록의 블록 시작~커서 텍스트에
|
|
118
|
+
* 규칙을 순서대로 적용한다. 매치가 커서에서 끝나는 첫 규칙이
|
|
119
|
+
* 같은 tr 위에 변환 스텝을 쌓는다 (입력+변환 = 하나의 undo 단위).
|
|
120
|
+
*/
|
|
121
|
+
applyInputRules(rules: readonly InputRule[]): this;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* 트랜잭션 빌더 — EditorState.tr()이 만든다.
|
|
125
|
+
* delete() 지원 범위 (Phase 2):
|
|
126
|
+
* 같은 노드 안 / 같은 부모 안 형제 / 같은 grandparent 아래 텍스트블록
|
|
127
|
+
* 사이(anchor 블록에 focus 잔여 inline을 join). 더 깊은 중첩은 양끝
|
|
128
|
+
* trim만 하고 join 없이 둔다 — 스키마 검증과 함께 보강 예정.
|
|
129
|
+
*/
|
|
130
|
+
export declare class TransactionBuilder implements Transaction {
|
|
131
|
+
private readonly state;
|
|
132
|
+
steps: Step[];
|
|
133
|
+
selection: Selection | null;
|
|
134
|
+
storedMarks: Mark[] | null;
|
|
135
|
+
meta: Record<string, unknown>;
|
|
136
|
+
constructor(state: EditorState);
|
|
137
|
+
get docChanged(): boolean;
|
|
138
|
+
private get doc();
|
|
139
|
+
/**
|
|
140
|
+
* 이미 쌓인 스텝까지 적용된 doc — 빌더 메서드의 위치 인자는
|
|
141
|
+
* PM 관례상 "직전 스텝까지 적용된 문서" 좌표다. tr.delete(sel) 뒤
|
|
142
|
+
* insertText가 삭제된 노드를 가리키는 일이 없게 한다.
|
|
143
|
+
*/
|
|
144
|
+
private docNow;
|
|
145
|
+
private pushRemove;
|
|
146
|
+
/** atom 리프가 아닌 컨테이너인가 — content가 있거나 spec이 자식을 허용 */
|
|
147
|
+
private isContainer;
|
|
148
|
+
/** 컨테이너가 인라인 자식을 허용하는가 — 스키마 content 표현 기준 */
|
|
149
|
+
private acceptsInline;
|
|
150
|
+
/**
|
|
151
|
+
* DOM 셀렉션에서 오는 임의 포인트를 텍스트 삽입 가능한 형태로 정규화한다.
|
|
152
|
+
* 브라우저는 캐럿을 컨테이너 경계(block 엘리먼트, doc 루트)나
|
|
153
|
+
* contenteditable=false 노드(atom) 안쪽에도 놓는다 — 그대로 insert하면
|
|
154
|
+
* doc 루트에 bare text 같은 잘못된 구조가 나온다.
|
|
155
|
+
* - text : 텍스트 노드 안 포인트 — 문자 오프셋 의미
|
|
156
|
+
* - inside : 인라인 전용 빈 컨테이너 — 텍스트 노드를 자식으로 삽입
|
|
157
|
+
* - block : 블록 경계 — paragraph로 감싼 블록을 삽입
|
|
158
|
+
*/
|
|
159
|
+
private resolveInsert;
|
|
160
|
+
/** 기본 텍스트블록 타입 — paragraph, 없으면 inline을 받는 첫 block */
|
|
161
|
+
private defaultBlockType;
|
|
162
|
+
/** 텍스트를 담는 새 블록 — 스키마에 paragraph가 없으면 inline 블록을 찾는다 */
|
|
163
|
+
private newTextBlock;
|
|
164
|
+
/** 블록 시작 셀렉션 — 텍스트 자식이 있으면 첫 텍스트 앞, 없으면 블록 안 */
|
|
165
|
+
private selStartOfBlock;
|
|
166
|
+
/** 블록 경계에 새 빈 블록을 넣고 캐럿을 그 안에 둔다 */
|
|
167
|
+
private insertEmptyBlock;
|
|
168
|
+
insertText(text: string, at?: Point): this;
|
|
169
|
+
private selectionAfterInsert;
|
|
170
|
+
insertNode(at: Point, node: EditorNode): this;
|
|
171
|
+
/**
|
|
172
|
+
* at 위치에서 노드를 분할한다 (Enter). 생략하면 현재 셀렉션 —
|
|
173
|
+
* 비어있지 않은 셀렉션이면 먼저 지운 뒤 분할한다.
|
|
174
|
+
* 셀렉션은 분할된 "오른쪽" 부분의 시작으로 옮긴다.
|
|
175
|
+
*/
|
|
176
|
+
split(at?: Point, depth?: number): this;
|
|
177
|
+
/**
|
|
178
|
+
* 리스트 아이템 분할 — caret이 가리키는 인라인 블록을 캐럿에서 자르고
|
|
179
|
+
* 꼬리(블록 꼬리 + 이후 아이템 자식들)를 새 아이템으로 만든다.
|
|
180
|
+
* caret은 아이템 안의 텍스트 포인트여야 한다.
|
|
181
|
+
*/
|
|
182
|
+
splitItem(itemPath: readonly number[], caret: Point): this;
|
|
183
|
+
/**
|
|
184
|
+
* 리스트 아이템을 리스트 밖으로 꺼낸다 — 아이템의 블록들이 리스트의
|
|
185
|
+
* 형제가 된다. 리스트가 아이템 하나뿐이면 리스트 통째 교체, 머리/꼬리
|
|
186
|
+
* 아이템이면 리스트 앞/뒤에 삽입, 중간이면 리스트를 둘로 나눠 사이에
|
|
187
|
+
* 끼운다 (PM liftListItem 관례).
|
|
188
|
+
*/
|
|
189
|
+
liftItem(itemPath: readonly number[]): this;
|
|
190
|
+
/**
|
|
191
|
+
* 리스트 아이템을 이전 형제 아래로 넣는다 (Tab 인덴트) — 형제의 마지막
|
|
192
|
+
* 자식이 같은 타입 리스트면 그 끝에, 아니면 새 리스트를 만들어 넣는다.
|
|
193
|
+
*/
|
|
194
|
+
sinkItem(itemPath: readonly number[]): this;
|
|
195
|
+
replaceNode(path: readonly number[], node: EditorNode): this;
|
|
196
|
+
addStep(step: Step): this;
|
|
197
|
+
private isInlineNode;
|
|
198
|
+
private isTextBlock;
|
|
199
|
+
insertSlice(at: Point, nodes: readonly EditorNode[]): this;
|
|
200
|
+
/** 인라인 조각 — 텍스트를 o에서 나누고 사이에 끼운다 */
|
|
201
|
+
private insertInlineSlice;
|
|
202
|
+
/** 블록 조각 — 현재 블록을 나누고 사이에 삽입 (doc 최상위 기준) */
|
|
203
|
+
private insertBlockSlice;
|
|
204
|
+
/** 지금까지 쌓인 스텝을 doc에 적용한 결과 — 캐럿 계산용 */
|
|
205
|
+
private simulate;
|
|
206
|
+
/**
|
|
207
|
+
* 문서 순서 비교 — pointCmp와 다른 점: 컨테이너 경계 포인트를
|
|
208
|
+
* "자식 offset 앞"으로 해석한다. pointCmp는 [i]/k < [i,j]/m이지만
|
|
209
|
+
* 실제 문서 순서에선 [i]/k 는 k>j 이면 [i,j] 안쪽 "뒤"다 —
|
|
210
|
+
* DOM 셀렉션이 만드는 (블록엘리먼트, 자식인덱스) 포인트를 정렬할 때
|
|
211
|
+
* pointCmp를 쓰면 범위가 뒤집힌다.
|
|
212
|
+
*/
|
|
213
|
+
private docOrderCmp;
|
|
214
|
+
/** atom 리프 안 포인트를 부모 경계로 올린다 — dir>0이면 노드 "뒤" 경계 */
|
|
215
|
+
private resolveBoundary;
|
|
216
|
+
delete(range: Range): this;
|
|
217
|
+
/** a<f로 정렬 + atom 경계 해석이 끝난 범위 삭제 — 재귀용 내부 구현 */
|
|
218
|
+
private deleteOrdered;
|
|
219
|
+
addMark(range: Range, mark: Mark): this;
|
|
220
|
+
removeMark(range: Range, markType: string): this;
|
|
221
|
+
setNodeAttr(path: readonly number[], key: string, value: unknown): this;
|
|
222
|
+
setSelection(selection: Selection): this;
|
|
223
|
+
setStoredMarks(marks: readonly Mark[] | null): this;
|
|
224
|
+
/**
|
|
225
|
+
* 입력 규칙 — 마크다운식 변환(`# `→heading, `**x**`→bold).
|
|
226
|
+
* 캐럿이 속한 인라인 블록의 블록 시작~커서 텍스트를 만들어 각
|
|
227
|
+
* 규칙의 pattern에 매칭한다. 매치가 커서에서 끝나는 첫 규칙이
|
|
228
|
+
* 이 tr 위에 변환 스텝을 쌓는다 — 위치는 docNow 좌표라 규칙
|
|
229
|
+
* 핸들러가 쌓은 스텝도 직전 스텝 기준으로 해석된다.
|
|
230
|
+
*/
|
|
231
|
+
applyInputRules(rules: readonly InputRule[]): this;
|
|
232
|
+
setMeta(key: string, value: unknown): this;
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=transaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../src/state/transaction.ts"],"names":[],"mappings":"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"}
|