@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
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 park-taejoon
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# @moda-editor/core
|
|
2
|
+
|
|
3
|
+
헤드리스 코어 — 프레임워크에 무관한 상태·스냅샷·이벤트·DOM 렌더러.
|
|
4
|
+
|
|
5
|
+
- `WidgetCore` — 상태 관리 코어 (옵션 → 스냅샷 → subscribe)
|
|
6
|
+
- `mountWidget(el, opts)` — 어댑터 없이 DOM에 직접 마운트 (vanilla/CDN)
|
|
7
|
+
- `runWidgetConformance` — 어댑터 공용 렌더 계약 스펙
|
|
8
|
+
- `styles.css` — 공통 스타일 (`--me-*` 변수)
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
import { WidgetCore, mountWidget } from "@moda-editor/core";
|
|
12
|
+
import "@moda-editor/core/styles.css";
|
|
13
|
+
|
|
14
|
+
const widget = new WidgetCore({ items, getItemText: (i) => i.label });
|
|
15
|
+
mountWidget(document.getElementById("app")!, { items, getItemText });
|
|
16
|
+
```
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { Command, InputRule } from "./editor/extension.js";
|
|
2
|
+
import type { EditorNode } from "./model/node.js";
|
|
3
|
+
import type { Point, Range } from "./state/selection.js";
|
|
4
|
+
import type { EditorState } from "./state/state.js";
|
|
5
|
+
import type { Transaction } from "./state/transaction.js";
|
|
6
|
+
/**
|
|
7
|
+
* 기능 모듈 공용 헬퍼 — 두 개 이상의 feature가 쓰는 캐럿 해석·
|
|
8
|
+
* 마크 유틸·입력 규칙 팩토리를 모은다. 기능 전용 헬퍼는 각
|
|
9
|
+
* feature 파일에 둔다.
|
|
10
|
+
*/
|
|
11
|
+
/** 범위 안 텍스트가 전부 markType을 가지면 true */
|
|
12
|
+
export declare function rangeHasMark(doc: EditorNode, range: Range, markType: string): boolean;
|
|
13
|
+
/** 마크 토글 커맨드 — collapsed면 storedMarks, 범위면 add/remove */
|
|
14
|
+
export declare function toggleMark(markType: string): Command;
|
|
15
|
+
/**
|
|
16
|
+
* 캐럿/선택에 markType이 활성인가.
|
|
17
|
+
* collapsed면 storedMarks(토글 직후) → 커서 위치 텍스트 마크 순으로 보고,
|
|
18
|
+
* 범위 선택이면 범위 전체가 마크를 가질 때만 true다.
|
|
19
|
+
*/
|
|
20
|
+
export declare function isMarkActive(state: EditorState, markType: string): boolean;
|
|
21
|
+
/** 캐럿이 속한 텍스트블록이 type인가 — 중첩(li>p 등) 안에서도 동작 */
|
|
22
|
+
export declare function isBlockActive(state: EditorState, type: string): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* 캐럿이 type 노드 안에 있는가 — 텍스트블록 자신(코드블록)이거나
|
|
25
|
+
* 조상 컨테이너(리스트·인용구·콜아웃)면 true. 툴바 active 판정용.
|
|
26
|
+
*/
|
|
27
|
+
export declare function isInNode(state: EditorState, type: string): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* 셀렉션 포인트를 품은 텍스트블록 경로 — 트랜잭션이 만드는 컨테이너
|
|
30
|
+
* 포인트(빈 블록 안 {path:블록,offset:0} 등)도 안쪽 텍스트블록으로
|
|
31
|
+
* 내려간다. 커맨드들의 공용 캐럿 해석.
|
|
32
|
+
*/
|
|
33
|
+
export declare function caretBlockPath(state: EditorState): readonly number[] | null;
|
|
34
|
+
/** 캐럿을 품은 리스트 아이템 컨텍스트 — 없으면 null */
|
|
35
|
+
export declare function itemContext(state: EditorState): {
|
|
36
|
+
itemPath: readonly number[];
|
|
37
|
+
listPath: readonly number[];
|
|
38
|
+
} | null;
|
|
39
|
+
/** 캐럿을 품은 텍스트블록을 type으로 교체 — 중첩 안에서도 동작 */
|
|
40
|
+
export declare function setBlockType(type: string, attrs?: Record<string, unknown>): Command;
|
|
41
|
+
/** 인라인 자식들의 텍스트를 순서대로 합친다 (hardBreak 등은 무시) */
|
|
42
|
+
export declare function blockText(node: EditorNode): string;
|
|
43
|
+
/**
|
|
44
|
+
* doc Point → 블록 문자 오프셋 — 텍스트 자식들을 하나의 문자열로
|
|
45
|
+
* 펼쳤을 때의 위치. 앞쪽 텍스트 자식들의 길이 합 + 노드 안 offset.
|
|
46
|
+
* 코드형 블록(자동 들여쓰기·자동 쌍)처럼 플랫 텍스트 좌표가 필요한
|
|
47
|
+
* 입력 훅이 쓴다.
|
|
48
|
+
*/
|
|
49
|
+
export declare function blockTextOffset(block: EditorNode, p: Point): number;
|
|
50
|
+
/** 블록 문자 오프셋 → doc Point — 텍스트 자식 경계로 해석한다 */
|
|
51
|
+
export declare function blockTextPoint(block: EditorNode, blockPath: readonly number[], off: number): Point;
|
|
52
|
+
export declare function samePath(a: readonly number[], b: readonly number[]): boolean;
|
|
53
|
+
/**
|
|
54
|
+
* 마크 입력 규칙 — `**x**`, `*x*`, `` `x` ``, `~~x~~` 형태.
|
|
55
|
+
* fence 위치는 매치 끝(= 캐럿)에서 문자열 길이로 역산한다 — 패턴이
|
|
56
|
+
* 앞쪽 컨텍스트((?:^|[^*]) 등)를 포함해도 안전하다. fence 전체가
|
|
57
|
+
* 같은 텍스트 노드에 있을 때만 변환 — 경계를 걸치면 스킵.
|
|
58
|
+
*/
|
|
59
|
+
export declare function markRule(pattern: RegExp, markType: string, open: string, close?: string): InputRule;
|
|
60
|
+
/**
|
|
61
|
+
* 블록 입력 규칙 — 블록 시작 패턴(`# `, `## `…)이면 블록을 교체한다.
|
|
62
|
+
* fn은 매치와 현재 블록을 받아 교체할 노드 조각(Partial)을 돌려준다 —
|
|
63
|
+
* null이면 규칙 폴스루.
|
|
64
|
+
*/
|
|
65
|
+
export declare function blockRule(pattern: RegExp, fn: (m: RegExpMatchArray, block: EditorNode) => Partial<EditorNode> | null): InputRule;
|
|
66
|
+
/** 정렬 attr → DOMSpec — left 기본값은 style을 내지 않는다 */
|
|
67
|
+
export declare function alignDOM(tag: string, n: EditorNode): {
|
|
68
|
+
tag: string;
|
|
69
|
+
attrs?: Record<string, string>;
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* 래핑 입력 규칙 헬퍼 — `- `, `> `처럼 매치된 블록을 wrapper 안에
|
|
73
|
+
* 넣는다. make()의 content는 블록이 들어갈 빈 슬롯 경로를 표현한다
|
|
74
|
+
* (리스트는 li 껍데기, 인용구는 빈 content). 접두 텍스트는 래핑 후
|
|
75
|
+
* 한 단계 깊어진 위치에서 지운다.
|
|
76
|
+
*/
|
|
77
|
+
export declare function wrapBlock(tr: Transaction, range: Range, doc: EditorNode, make: () => EditorNode | null): boolean;
|
|
78
|
+
//# sourceMappingURL=commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
|
package/dist/commands.js
ADDED
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
import { expandTextNodes, nodeAt } from "./model/traverse.js";
|
|
2
|
+
import { coveredOffsets } from "./state/apply.js";
|
|
3
|
+
import { normalizedRange, pointEq, textSelection, } from "./state/selection.js";
|
|
4
|
+
/**
|
|
5
|
+
* 기능 모듈 공용 헬퍼 — 두 개 이상의 feature가 쓰는 캐럿 해석·
|
|
6
|
+
* 마크 유틸·입력 규칙 팩토리를 모은다. 기능 전용 헬퍼는 각
|
|
7
|
+
* feature 파일에 둔다.
|
|
8
|
+
*/
|
|
9
|
+
/** 범위 안 텍스트가 전부 markType을 가지면 true */
|
|
10
|
+
export function rangeHasMark(doc, range, markType) {
|
|
11
|
+
let any = false;
|
|
12
|
+
let all = true;
|
|
13
|
+
expandTextNodes(doc, [], (node, path) => {
|
|
14
|
+
if (coveredOffsets(node, path, range)) {
|
|
15
|
+
any = true;
|
|
16
|
+
if (!(node.marks ?? []).some((m) => m.type === markType))
|
|
17
|
+
all = false;
|
|
18
|
+
}
|
|
19
|
+
return [node];
|
|
20
|
+
});
|
|
21
|
+
return any && all;
|
|
22
|
+
}
|
|
23
|
+
/** 마크 토글 커맨드 — collapsed면 storedMarks, 범위면 add/remove */
|
|
24
|
+
export function toggleMark(markType) {
|
|
25
|
+
return ({ state, tr, dispatch }) => {
|
|
26
|
+
const sel = state.selection;
|
|
27
|
+
if (sel.type !== "text")
|
|
28
|
+
return false;
|
|
29
|
+
const range = normalizedRange(sel);
|
|
30
|
+
if (pointEq(range.anchor, range.focus)) {
|
|
31
|
+
const cur = state.storedMarks ?? [];
|
|
32
|
+
const has = cur.some((m) => m.type === markType);
|
|
33
|
+
tr.setStoredMarks(has ? cur.filter((m) => m.type !== markType) : [...cur, { type: markType }]);
|
|
34
|
+
}
|
|
35
|
+
else if (rangeHasMark(state.doc, range, markType)) {
|
|
36
|
+
tr.removeMark(range, markType);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
tr.addMark(range, { type: markType });
|
|
40
|
+
}
|
|
41
|
+
dispatch();
|
|
42
|
+
return true;
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
// ── UI 상태 조회 — 툴바/메뉴의 active·disabled 판정용 ─────────
|
|
46
|
+
/**
|
|
47
|
+
* 캐럿/선택에 markType이 활성인가.
|
|
48
|
+
* collapsed면 storedMarks(토글 직후) → 커서 위치 텍스트 마크 순으로 보고,
|
|
49
|
+
* 범위 선택이면 범위 전체가 마크를 가질 때만 true다.
|
|
50
|
+
*/
|
|
51
|
+
export function isMarkActive(state, markType) {
|
|
52
|
+
const sel = state.selection;
|
|
53
|
+
if (sel.type !== "text")
|
|
54
|
+
return false;
|
|
55
|
+
const range = normalizedRange(sel);
|
|
56
|
+
if (pointEq(range.anchor, range.focus)) {
|
|
57
|
+
if (state.storedMarks?.some((m) => m.type === markType))
|
|
58
|
+
return true;
|
|
59
|
+
const node = nodeAt(state.doc, range.anchor.path);
|
|
60
|
+
return (node?.type === "text" &&
|
|
61
|
+
!!node.marks?.some((m) => m.type === markType));
|
|
62
|
+
}
|
|
63
|
+
return rangeHasMark(state.doc, range, markType);
|
|
64
|
+
}
|
|
65
|
+
/** 캐럿이 속한 텍스트블록이 type인가 — 중첩(li>p 등) 안에서도 동작 */
|
|
66
|
+
export function isBlockActive(state, type) {
|
|
67
|
+
const path = caretBlockPath(state);
|
|
68
|
+
return !!path && nodeAt(state.doc, path)?.type === type;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* 캐럿이 type 노드 안에 있는가 — 텍스트블록 자신(코드블록)이거나
|
|
72
|
+
* 조상 컨테이너(리스트·인용구·콜아웃)면 true. 툴바 active 판정용.
|
|
73
|
+
*/
|
|
74
|
+
export function isInNode(state, type) {
|
|
75
|
+
const blockPath = caretBlockPath(state);
|
|
76
|
+
if (!blockPath)
|
|
77
|
+
return false;
|
|
78
|
+
if (nodeAt(state.doc, blockPath)?.type === type)
|
|
79
|
+
return true;
|
|
80
|
+
for (let d = blockPath.length - 1; d > 0; d--) {
|
|
81
|
+
if (nodeAt(state.doc, blockPath.slice(0, d))?.type === type)
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* 셀렉션 포인트를 품은 텍스트블록 경로 — 트랜잭션이 만드는 컨테이너
|
|
88
|
+
* 포인트(빈 블록 안 {path:블록,offset:0} 등)도 안쪽 텍스트블록으로
|
|
89
|
+
* 내려간다. 커맨드들의 공용 캐럿 해석.
|
|
90
|
+
*/
|
|
91
|
+
export function caretBlockPath(state) {
|
|
92
|
+
const sel = state.selection;
|
|
93
|
+
if (sel.type !== "text")
|
|
94
|
+
return null;
|
|
95
|
+
let path = sel.anchor.path.slice();
|
|
96
|
+
let node = nodeAt(state.doc, path);
|
|
97
|
+
if (node?.type === "text") {
|
|
98
|
+
path = path.slice(0, -1);
|
|
99
|
+
node = nodeAt(state.doc, path);
|
|
100
|
+
}
|
|
101
|
+
// 블록 전용 컨테이너(li, doc 등) 안 포인트는 자식으로 한 단계씩
|
|
102
|
+
while (node &&
|
|
103
|
+
!/inline/.test(state.schema.nodeSpec(node.type)?.content ?? "") &&
|
|
104
|
+
(node.content?.length ?? 0) > 0) {
|
|
105
|
+
const i = Math.min(sel.anchor.offset, (node.content?.length ?? 1) - 1);
|
|
106
|
+
path = [...path, Math.max(0, i)];
|
|
107
|
+
node = nodeAt(state.doc, path);
|
|
108
|
+
}
|
|
109
|
+
return path;
|
|
110
|
+
}
|
|
111
|
+
/** 캐럿을 품은 리스트 아이템 컨텍스트 — 없으면 null */
|
|
112
|
+
export function itemContext(state) {
|
|
113
|
+
const blockPath = caretBlockPath(state);
|
|
114
|
+
if (!blockPath)
|
|
115
|
+
return null;
|
|
116
|
+
const parentPath = blockPath.slice(0, -1);
|
|
117
|
+
if (!parentPath.length)
|
|
118
|
+
return null;
|
|
119
|
+
const parent = nodeAt(state.doc, parentPath);
|
|
120
|
+
if (!parent || !state.schema.nodeSpec(parent.type)?.listItem)
|
|
121
|
+
return null;
|
|
122
|
+
return { itemPath: parentPath, listPath: parentPath.slice(0, -1) };
|
|
123
|
+
}
|
|
124
|
+
/** 캐럿을 품은 텍스트블록을 type으로 교체 — 중첩 안에서도 동작 */
|
|
125
|
+
export function setBlockType(type, attrs) {
|
|
126
|
+
return ({ state, tr, dispatch }) => {
|
|
127
|
+
const sel = state.selection;
|
|
128
|
+
const blockPath = caretBlockPath(state);
|
|
129
|
+
if (!blockPath || sel.type !== "text")
|
|
130
|
+
return false;
|
|
131
|
+
const block = nodeAt(state.doc, blockPath);
|
|
132
|
+
const spec = block && state.schema.nodeSpec(block.type);
|
|
133
|
+
if (!block || block.type === type)
|
|
134
|
+
return false;
|
|
135
|
+
// 인라인을 담는 블록만 교체 대상
|
|
136
|
+
if (!spec || !/inline/.test(spec.content ?? ""))
|
|
137
|
+
return false;
|
|
138
|
+
tr.replaceNode(blockPath, {
|
|
139
|
+
...block,
|
|
140
|
+
type,
|
|
141
|
+
...(attrs ? { attrs } : {}),
|
|
142
|
+
});
|
|
143
|
+
const firstText = block.content?.[0];
|
|
144
|
+
if (firstText?.type === "text") {
|
|
145
|
+
tr.setSelection(textSelection({
|
|
146
|
+
path: [...blockPath, 0],
|
|
147
|
+
offset: Math.min(sel.anchor.offset, firstText.text?.length ?? 0),
|
|
148
|
+
}));
|
|
149
|
+
}
|
|
150
|
+
dispatch();
|
|
151
|
+
return true;
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
/** 인라인 자식들의 텍스트를 순서대로 합친다 (hardBreak 등은 무시) */
|
|
155
|
+
export function blockText(node) {
|
|
156
|
+
return (node.content ?? []).map((c) => c.text ?? "").join("");
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* doc Point → 블록 문자 오프셋 — 텍스트 자식들을 하나의 문자열로
|
|
160
|
+
* 펼쳤을 때의 위치. 앞쪽 텍스트 자식들의 길이 합 + 노드 안 offset.
|
|
161
|
+
* 코드형 블록(자동 들여쓰기·자동 쌍)처럼 플랫 텍스트 좌표가 필요한
|
|
162
|
+
* 입력 훅이 쓴다.
|
|
163
|
+
*/
|
|
164
|
+
export function blockTextOffset(block, p) {
|
|
165
|
+
const tIdx = p.path[p.path.length - 1] ?? 0;
|
|
166
|
+
let off = p.offset;
|
|
167
|
+
for (let i = 0; i < tIdx && i < (block.content?.length ?? 0); i++) {
|
|
168
|
+
off += block.content[i].text?.length ?? 0;
|
|
169
|
+
}
|
|
170
|
+
return off;
|
|
171
|
+
}
|
|
172
|
+
/** 블록 문자 오프셋 → doc Point — 텍스트 자식 경계로 해석한다 */
|
|
173
|
+
export function blockTextPoint(block, blockPath, off) {
|
|
174
|
+
const kids = block.content ?? [];
|
|
175
|
+
let rest = off;
|
|
176
|
+
for (let i = 0; i < kids.length; i++) {
|
|
177
|
+
const t = kids[i].text?.length ?? 0;
|
|
178
|
+
if (rest <= t || i === kids.length - 1) {
|
|
179
|
+
return { path: [...blockPath, i], offset: Math.min(rest, t) };
|
|
180
|
+
}
|
|
181
|
+
rest -= t;
|
|
182
|
+
}
|
|
183
|
+
return { path: [...blockPath, 0], offset: 0 };
|
|
184
|
+
}
|
|
185
|
+
export function samePath(a, b) {
|
|
186
|
+
return a.length === b.length && a.every((v, i) => v === b[i]);
|
|
187
|
+
}
|
|
188
|
+
// ── 입력 규칙 팩토리 ────────────────────────────────────────
|
|
189
|
+
/**
|
|
190
|
+
* 마크 입력 규칙 — `**x**`, `*x*`, `` `x` ``, `~~x~~` 형태.
|
|
191
|
+
* fence 위치는 매치 끝(= 캐럿)에서 문자열 길이로 역산한다 — 패턴이
|
|
192
|
+
* 앞쪽 컨텍스트((?:^|[^*]) 등)를 포함해도 안전하다. fence 전체가
|
|
193
|
+
* 같은 텍스트 노드에 있을 때만 변환 — 경계를 걸치면 스킵.
|
|
194
|
+
*/
|
|
195
|
+
export function markRule(pattern, markType, open, close = open) {
|
|
196
|
+
return {
|
|
197
|
+
pattern,
|
|
198
|
+
handler: ({ tr }, m, range) => {
|
|
199
|
+
const inner = m[1] ?? "";
|
|
200
|
+
if (!inner)
|
|
201
|
+
return false;
|
|
202
|
+
const { anchor: a, focus: f } = range;
|
|
203
|
+
if (!samePath(a.path, f.path))
|
|
204
|
+
return false;
|
|
205
|
+
const closeStart = f.offset - close.length;
|
|
206
|
+
const innerStart = closeStart - inner.length;
|
|
207
|
+
const openStart = innerStart - open.length;
|
|
208
|
+
if (openStart < 0)
|
|
209
|
+
return false;
|
|
210
|
+
// 닫힘 fence(큰 오프셋)부터 지워야 앞쪽 좌표가 안 밀린다
|
|
211
|
+
tr.delete({ anchor: { path: f.path, offset: closeStart }, focus: f });
|
|
212
|
+
tr.delete({
|
|
213
|
+
anchor: { path: f.path, offset: openStart },
|
|
214
|
+
focus: { path: f.path, offset: innerStart },
|
|
215
|
+
});
|
|
216
|
+
// fence 삭제 후 inner는 [openStart, openStart+inner.length)
|
|
217
|
+
tr.addMark({
|
|
218
|
+
anchor: { path: f.path, offset: openStart },
|
|
219
|
+
focus: { path: f.path, offset: openStart + inner.length },
|
|
220
|
+
}, { type: markType });
|
|
221
|
+
tr.setSelection(textSelection({
|
|
222
|
+
path: f.path,
|
|
223
|
+
offset: openStart + inner.length,
|
|
224
|
+
}));
|
|
225
|
+
return true;
|
|
226
|
+
},
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* 블록 입력 규칙 — 블록 시작 패턴(`# `, `## `…)이면 블록을 교체한다.
|
|
231
|
+
* fn은 매치와 현재 블록을 받아 교체할 노드 조각(Partial)을 돌려준다 —
|
|
232
|
+
* null이면 규칙 폴스루.
|
|
233
|
+
*/
|
|
234
|
+
export function blockRule(pattern, fn) {
|
|
235
|
+
return {
|
|
236
|
+
pattern,
|
|
237
|
+
handler: ({ tr }, m, range, doc) => {
|
|
238
|
+
const blockPath = range.anchor.path.slice(0, -1);
|
|
239
|
+
const block = nodeAt(doc, blockPath);
|
|
240
|
+
if (!block)
|
|
241
|
+
return false;
|
|
242
|
+
const patch = fn(m, block);
|
|
243
|
+
if (!patch)
|
|
244
|
+
return false;
|
|
245
|
+
// 타입 교체를 먼저 하고(기존 내용 유지) 접두사를 지운다 —
|
|
246
|
+
// 스텝은 순차 적용되므로 delete 좌표도 그대로 유효하다
|
|
247
|
+
tr.replaceNode(blockPath, { ...block, ...patch });
|
|
248
|
+
tr.delete(range);
|
|
249
|
+
tr.setSelection(textSelection(range.anchor));
|
|
250
|
+
return true;
|
|
251
|
+
},
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
/** 정렬 attr → DOMSpec — left 기본값은 style을 내지 않는다 */
|
|
255
|
+
export function alignDOM(tag, n) {
|
|
256
|
+
const a = String(n.attrs?.["align"] ?? "left");
|
|
257
|
+
return a === "left" ? { tag } : { tag, attrs: { style: `text-align: ${a}` } };
|
|
258
|
+
}
|
|
259
|
+
/** wrapper의 가장 깊은 빈 자리에 block을 채운다 — 래핑 입력 규칙용 */
|
|
260
|
+
function fillLast(wrapper, block) {
|
|
261
|
+
const kids = wrapper.content;
|
|
262
|
+
if (!kids?.length) {
|
|
263
|
+
return { node: { ...wrapper, content: [block] }, innerPath: [0] };
|
|
264
|
+
}
|
|
265
|
+
const i = kids.length - 1;
|
|
266
|
+
const inner = fillLast(kids[i], block);
|
|
267
|
+
if (!inner)
|
|
268
|
+
return null;
|
|
269
|
+
return {
|
|
270
|
+
node: { ...wrapper, content: [...kids.slice(0, i), inner.node] },
|
|
271
|
+
innerPath: [i, ...inner.innerPath],
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* 래핑 입력 규칙 헬퍼 — `- `, `> `처럼 매치된 블록을 wrapper 안에
|
|
276
|
+
* 넣는다. make()의 content는 블록이 들어갈 빈 슬롯 경로를 표현한다
|
|
277
|
+
* (리스트는 li 껍데기, 인용구는 빈 content). 접두 텍스트는 래핑 후
|
|
278
|
+
* 한 단계 깊어진 위치에서 지운다.
|
|
279
|
+
*/
|
|
280
|
+
export function wrapBlock(tr, range, doc, make) {
|
|
281
|
+
const blockPath = range.anchor.path.slice(0, -1);
|
|
282
|
+
const block = nodeAt(doc, blockPath);
|
|
283
|
+
const wrapper = block && make();
|
|
284
|
+
if (!block || !wrapper)
|
|
285
|
+
return false;
|
|
286
|
+
const filled = fillLast(wrapper, block);
|
|
287
|
+
if (!filled)
|
|
288
|
+
return false;
|
|
289
|
+
const tIdx = range.anchor.path[range.anchor.path.length - 1];
|
|
290
|
+
const innerPath = [...blockPath, ...filled.innerPath, tIdx];
|
|
291
|
+
tr.replaceNode(blockPath, filled.node);
|
|
292
|
+
tr.delete({
|
|
293
|
+
anchor: { path: innerPath, offset: range.anchor.offset },
|
|
294
|
+
focus: { path: innerPath, offset: range.focus.offset },
|
|
295
|
+
});
|
|
296
|
+
tr.setSelection(textSelection({ path: innerPath, offset: range.anchor.offset }));
|
|
297
|
+
return true;
|
|
298
|
+
}
|
|
299
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { Editor } from "./editor/editor.js";
|
|
2
|
+
/**
|
|
3
|
+
* 어댑터 공통 렌더 계약 (conformance) 스펙.
|
|
4
|
+
*
|
|
5
|
+
* 5개 렌더러(React/Vue3/Vue2/Svelte/mountWidget)가 같은 UI를 각각 구현한다.
|
|
6
|
+
* 기능 추가 시 한쪽이 빠지는 회귀를 막기 위해, 동일한 옵션에 대한 DOM
|
|
7
|
+
* 계약을 여기에 한 번만 선언하고 각 어댑터의 vitest가 자기 마운트 함수를
|
|
8
|
+
* 주입해 실행한다.
|
|
9
|
+
*
|
|
10
|
+
* runWidgetConformance("vue3", async (opts) => {
|
|
11
|
+
* const el = document.createElement("div");
|
|
12
|
+
* const app = createApp(WidgetView, opts);
|
|
13
|
+
* app.mount(el);
|
|
14
|
+
* return { el, flush: nextTick, destroy: () => app.unmount() };
|
|
15
|
+
* });
|
|
16
|
+
*
|
|
17
|
+
* 새 기능을 추가할 때는 여기에 계약(선택자 + 상호작용 + 기대 DOM)을 추가한다 —
|
|
18
|
+
* 그러면 5개 렌더러 전부에서 자동으로 검증된다.
|
|
19
|
+
*/
|
|
20
|
+
/** 스펙이 사용하는 고정 픽스처 항목 */
|
|
21
|
+
export interface ConformanceItem {
|
|
22
|
+
id: number;
|
|
23
|
+
label: string;
|
|
24
|
+
}
|
|
25
|
+
/** 어댑터 마운트 결과 — 스펙이 상호작용/단언하는 대상 */
|
|
26
|
+
export interface MountedWidgetHandle {
|
|
27
|
+
/** 컴포넌트가 렌더된 컨테이너 (마운트 직후 1차 렌더 완료 상태) */
|
|
28
|
+
el: HTMLElement;
|
|
29
|
+
/**
|
|
30
|
+
* DOM 반영 대기. 액션(입력 등) 후 호출된다.
|
|
31
|
+
* vue/svelte은 nextTick/tick, react는 act, vanilla는 생략 가능.
|
|
32
|
+
*/
|
|
33
|
+
flush?: () => void | Promise<void>;
|
|
34
|
+
destroy(): void;
|
|
35
|
+
}
|
|
36
|
+
/** 각 어댑터가 구현하는 마운트 함수 — opts를 자기 props/옵션으로 번역한다 */
|
|
37
|
+
export type ConformanceMount = (opts: {
|
|
38
|
+
items: ConformanceItem[];
|
|
39
|
+
getItemText?: (item: ConformanceItem) => string;
|
|
40
|
+
}) => MountedWidgetHandle | Promise<MountedWidgetHandle>;
|
|
41
|
+
export declare function runWidgetConformance(label: string, mount: ConformanceMount): void;
|
|
42
|
+
/** 에디터 어댑터 마운트 함수 — editor를 자기 props로 번역한다 */
|
|
43
|
+
export type EditorConformanceMount = (opts: {
|
|
44
|
+
editor: Editor;
|
|
45
|
+
/**
|
|
46
|
+
* nodeViews[타입]이 truthy면 그 타입의 표준 컨포먼스 뷰를 등록한다 —
|
|
47
|
+
* 어댑터는 자기 프레임워크의 컴포넌트로 번역하고, 그 컴포넌트는
|
|
48
|
+
* `.me-custom-view` 클래스에 `node.attrs.label`을 출력해야 한다.
|
|
49
|
+
*/
|
|
50
|
+
nodeViews?: Record<string, unknown>;
|
|
51
|
+
}) => MountedWidgetHandle | Promise<MountedWidgetHandle>;
|
|
52
|
+
/**
|
|
53
|
+
* 에디터 어댑터 공통 DOM 계약 — 5개 렌더러가 같은 구조를 출력한다:
|
|
54
|
+
* .me-root > .me-editor[contenteditable][data-me-path=""]
|
|
55
|
+
* > [data-me-path="0"], [data-me-path="1"] … 블록 엘리먼트
|
|
56
|
+
* 트랜잭션 디스패치 → DOM 갱신, destroy → 정리까지 검증한다.
|
|
57
|
+
*/
|
|
58
|
+
export declare function runEditorConformance(label: string, mount: EditorConformanceMount): void;
|
|
59
|
+
//# sourceMappingURL=conformance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conformance.d.ts","sourceRoot":"","sources":["../src/conformance.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAQjD;;;;;;;;;;;;;;;;;GAiBG;AAEH,yBAAyB;AACzB,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf;AAED,oCAAoC;AACpC,MAAM,WAAW,mBAAmB;IAClC,0CAA0C;IAC1C,EAAE,EAAE,WAAW,CAAC;IAChB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,oDAAoD;AACpD,MAAM,MAAM,gBAAgB,GAAG,CAAC,IAAI,EAAE;IACpC,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,MAAM,CAAC;CACjD,KAAK,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAmBzD,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,gBAAgB,GACtB,IAAI,CAqCN;AAID,8CAA8C;AAC9C,MAAM,MAAM,sBAAsB,GAAG,CAAC,IAAI,EAAE;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC,KAAK,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAczD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,sBAAsB,GAC5B,IAAI,CAypDN"}
|