@moda-editor/core 0.1.3 → 0.1.5
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/dist/collab.d.ts +61 -0
- package/dist/collab.d.ts.map +1 -0
- package/dist/collab.js +67 -0
- package/dist/collab.js.map +1 -0
- package/dist/commands.d.ts +11 -0
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +48 -4
- package/dist/commands.js.map +1 -1
- package/dist/conformance/editor-base.d.ts +7 -0
- package/dist/conformance/editor-base.d.ts.map +1 -0
- package/dist/conformance/editor-base.js +280 -0
- package/dist/conformance/editor-base.js.map +1 -0
- package/dist/conformance/editor-codeblock.d.ts +8 -0
- package/dist/conformance/editor-codeblock.d.ts.map +1 -0
- package/dist/conformance/editor-codeblock.js +402 -0
- package/dist/conformance/editor-codeblock.js.map +1 -0
- package/dist/conformance/editor-ime.d.ts +7 -0
- package/dist/conformance/editor-ime.d.ts.map +1 -0
- package/dist/conformance/editor-ime.js +166 -0
- package/dist/conformance/editor-ime.js.map +1 -0
- package/dist/conformance/editor-input.d.ts +8 -0
- package/dist/conformance/editor-input.d.ts.map +1 -0
- package/dist/conformance/editor-input.js +676 -0
- package/dist/conformance/editor-input.js.map +1 -0
- package/dist/conformance/editor-nodeview.d.ts +7 -0
- package/dist/conformance/editor-nodeview.d.ts.map +1 -0
- package/dist/conformance/editor-nodeview.js +120 -0
- package/dist/conformance/editor-nodeview.js.map +1 -0
- package/dist/conformance/editor-overlay.d.ts +8 -0
- package/dist/conformance/editor-overlay.d.ts.map +1 -0
- package/dist/conformance/editor-overlay.js +323 -0
- package/dist/conformance/editor-overlay.js.map +1 -0
- package/dist/conformance/fixtures.d.ts +4 -0
- package/dist/conformance/fixtures.d.ts.map +1 -0
- package/dist/conformance/fixtures.js +15 -0
- package/dist/conformance/fixtures.js.map +1 -0
- package/dist/conformance/index.d.ts +14 -0
- package/dist/conformance/index.d.ts.map +1 -0
- package/dist/conformance/index.js +28 -0
- package/dist/conformance/index.js.map +1 -0
- package/dist/conformance/types.d.ts +51 -0
- package/dist/conformance/types.d.ts.map +1 -0
- package/dist/conformance/types.js +2 -0
- package/dist/conformance/types.js.map +1 -0
- package/dist/conformance/widget.d.ts +3 -0
- package/dist/conformance/widget.d.ts.map +1 -0
- package/dist/conformance/widget.js +49 -0
- package/dist/conformance/widget.js.map +1 -0
- package/dist/conformance.d.ts +1 -58
- package/dist/conformance.d.ts.map +1 -1
- package/dist/conformance.js +3 -1748
- package/dist/conformance.js.map +1 -1
- package/dist/editor/extension.d.ts +47 -3
- package/dist/editor/extension.d.ts.map +1 -1
- package/dist/features/ace.d.ts +4 -0
- package/dist/features/ace.d.ts.map +1 -1
- package/dist/features/ace.js +34 -13
- package/dist/features/ace.js.map +1 -1
- package/dist/features/block-dnd.d.ts +7 -0
- package/dist/features/block-dnd.d.ts.map +1 -0
- package/dist/features/block-dnd.js +207 -0
- package/dist/features/block-dnd.js.map +1 -0
- package/dist/features/code-block.d.ts +9 -84
- package/dist/features/code-block.d.ts.map +1 -1
- package/dist/features/code-block.js +37 -1027
- package/dist/features/code-block.js.map +1 -1
- package/dist/features/code-context.d.ts +81 -0
- package/dist/features/code-context.d.ts.map +1 -0
- package/dist/features/code-context.js +322 -0
- package/dist/features/code-context.js.map +1 -0
- package/dist/features/code-edit.d.ts +50 -0
- package/dist/features/code-edit.d.ts.map +1 -0
- package/dist/features/code-edit.js +412 -0
- package/dist/features/code-edit.js.map +1 -0
- package/dist/features/code-format.d.ts +21 -0
- package/dist/features/code-format.d.ts.map +1 -0
- package/dist/features/code-format.js +410 -0
- package/dist/features/code-format.js.map +1 -0
- package/dist/features/doc.d.ts.map +1 -1
- package/dist/features/doc.js +1 -1
- package/dist/features/doc.js.map +1 -1
- package/dist/features/heading.d.ts.map +1 -1
- package/dist/features/heading.js.map +1 -1
- package/dist/features/image.d.ts.map +1 -1
- package/dist/features/image.js +11 -2
- package/dist/features/image.js.map +1 -1
- package/dist/features/index.d.ts +7 -0
- package/dist/features/index.d.ts.map +1 -1
- package/dist/features/index.js +16 -0
- package/dist/features/index.js.map +1 -1
- package/dist/features/inline-style.d.ts.map +1 -1
- package/dist/features/inline-style.js +4 -1
- package/dist/features/inline-style.js.map +1 -1
- package/dist/features/link.d.ts.map +1 -1
- package/dist/features/link.js +1 -1
- package/dist/features/link.js.map +1 -1
- package/dist/features/markdown.d.ts +15 -0
- package/dist/features/markdown.d.ts.map +1 -0
- package/dist/features/markdown.js +80 -0
- package/dist/features/markdown.js.map +1 -0
- package/dist/features/marks.d.ts.map +1 -1
- package/dist/features/marks.js +49 -4
- package/dist/features/marks.js.map +1 -1
- package/dist/features/mention.d.ts +30 -0
- package/dist/features/mention.d.ts.map +1 -0
- package/dist/features/mention.js +89 -0
- package/dist/features/mention.js.map +1 -0
- package/dist/features/script.d.ts.map +1 -1
- package/dist/features/script.js.map +1 -1
- package/dist/features/search.d.ts +73 -0
- package/dist/features/search.d.ts.map +1 -0
- package/dist/features/search.js +252 -0
- package/dist/features/search.js.map +1 -0
- package/dist/features/shared.d.ts +69 -0
- package/dist/features/shared.d.ts.map +1 -0
- package/dist/features/shared.js +272 -0
- package/dist/features/shared.js.map +1 -0
- package/dist/features/table.d.ts.map +1 -1
- package/dist/features/table.js +17 -3
- package/dist/features/table.js.map +1 -1
- package/dist/features/testkit.d.ts.map +1 -1
- package/dist/features/testkit.js +1 -1
- package/dist/features/testkit.js.map +1 -1
- package/dist/history.d.ts.map +1 -1
- package/dist/history.js +65 -20
- package/dist/history.js.map +1 -1
- package/dist/index.d.ts +19 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -6
- package/dist/index.js.map +1 -1
- package/dist/model/schema.d.ts.map +1 -1
- package/dist/model/schema.js +2 -1
- package/dist/model/schema.js.map +1 -1
- package/dist/parse/html.d.ts.map +1 -1
- package/dist/parse/html.js +38 -6
- package/dist/parse/html.js.map +1 -1
- package/dist/parse/sanitize.d.ts.map +1 -1
- package/dist/parse/sanitize.js +4 -1
- package/dist/parse/sanitize.js.map +1 -1
- package/dist/presets/highlight.d.ts.map +1 -1
- package/dist/presets/highlight.js +1 -4
- package/dist/presets/highlight.js.map +1 -1
- package/dist/presets/markdown-parse.d.ts +13 -0
- package/dist/presets/markdown-parse.d.ts.map +1 -0
- package/dist/presets/markdown-parse.js +398 -0
- package/dist/presets/markdown-parse.js.map +1 -0
- package/dist/presets/markdown.d.ts +45 -0
- package/dist/presets/markdown.d.ts.map +1 -0
- package/dist/presets/markdown.js +195 -0
- package/dist/presets/markdown.js.map +1 -0
- package/dist/state/apply.d.ts.map +1 -1
- package/dist/state/apply.js +19 -11
- package/dist/state/apply.js.map +1 -1
- package/dist/state/delete-ops.d.ts +34 -0
- package/dist/state/delete-ops.d.ts.map +1 -0
- package/dist/state/delete-ops.js +204 -0
- package/dist/state/delete-ops.js.map +1 -0
- package/dist/state/input-rules.d.ts +30 -0
- package/dist/state/input-rules.d.ts.map +1 -0
- package/dist/state/input-rules.js +70 -0
- package/dist/state/input-rules.js.map +1 -0
- package/dist/state/insert-ops.d.ts +54 -0
- package/dist/state/insert-ops.d.ts.map +1 -0
- package/dist/state/insert-ops.js +186 -0
- package/dist/state/insert-ops.js.map +1 -0
- package/dist/state/list-ops.d.ts +46 -0
- package/dist/state/list-ops.d.ts.map +1 -0
- package/dist/state/list-ops.js +231 -0
- package/dist/state/list-ops.js.map +1 -0
- package/dist/state/navigate.d.ts.map +1 -1
- package/dist/state/navigate.js +3 -1
- package/dist/state/navigate.js.map +1 -1
- package/dist/state/resolve-insert.d.ts +55 -0
- package/dist/state/resolve-insert.d.ts.map +1 -0
- package/dist/state/resolve-insert.js +118 -0
- package/dist/state/resolve-insert.js.map +1 -0
- package/dist/state/slice-ops.d.ts +46 -0
- package/dist/state/slice-ops.d.ts.map +1 -0
- package/dist/state/slice-ops.js +150 -0
- package/dist/state/slice-ops.js.map +1 -0
- package/dist/state/state.d.ts +6 -1
- package/dist/state/state.d.ts.map +1 -1
- package/dist/state/state.js +10 -0
- package/dist/state/state.js.map +1 -1
- package/dist/state/transaction.d.ts +43 -49
- package/dist/state/transaction.d.ts.map +1 -1
- package/dist/state/transaction.js +62 -858
- package/dist/state/transaction.js.map +1 -1
- package/dist/styles.css +160 -29
- package/dist/view/adapter.d.ts +84 -0
- package/dist/view/adapter.d.ts.map +1 -0
- package/dist/view/adapter.js +76 -0
- package/dist/view/adapter.js.map +1 -0
- package/dist/view/caret.d.ts +25 -0
- package/dist/view/caret.d.ts.map +1 -0
- package/dist/view/caret.js +43 -0
- package/dist/view/caret.js.map +1 -0
- package/dist/view/decoration.d.ts +9 -0
- package/dist/view/decoration.d.ts.map +1 -0
- package/dist/view/decoration.js +214 -0
- package/dist/view/decoration.js.map +1 -0
- package/dist/view/dirty-keys.d.ts +18 -0
- package/dist/view/dirty-keys.d.ts.map +1 -0
- package/dist/view/dirty-keys.js +31 -0
- package/dist/view/dirty-keys.js.map +1 -0
- package/dist/view/dom.d.ts.map +1 -1
- package/dist/view/dom.js +7 -5
- package/dist/view/dom.js.map +1 -1
- package/dist/view/hook-ctx.d.ts +32 -0
- package/dist/view/hook-ctx.d.ts.map +1 -0
- package/dist/view/hook-ctx.js +64 -0
- package/dist/view/hook-ctx.js.map +1 -0
- package/dist/view/ime.d.ts +72 -0
- package/dist/view/ime.d.ts.map +1 -0
- package/dist/view/ime.js +185 -0
- package/dist/view/ime.js.map +1 -0
- package/dist/view/input.d.ts +12 -12
- package/dist/view/input.d.ts.map +1 -1
- package/dist/view/input.js +83 -534
- package/dist/view/input.js.map +1 -1
- package/dist/view/keys.d.ts +25 -0
- package/dist/view/keys.d.ts.map +1 -0
- package/dist/view/keys.js +106 -0
- package/dist/view/keys.js.map +1 -0
- package/dist/view/line-nav.d.ts +13 -0
- package/dist/view/line-nav.d.ts.map +1 -0
- package/dist/view/line-nav.js +114 -0
- package/dist/view/line-nav.js.map +1 -0
- package/dist/view/mount.d.ts.map +1 -1
- package/dist/view/mount.js +43 -39
- package/dist/view/mount.js.map +1 -1
- package/dist/view/node-selection.d.ts +33 -0
- package/dist/view/node-selection.d.ts.map +1 -0
- package/dist/view/node-selection.js +107 -0
- package/dist/view/node-selection.js.map +1 -0
- package/dist/view/render.d.ts +4 -1
- package/dist/view/render.d.ts.map +1 -1
- package/dist/view/render.js +13 -3
- package/dist/view/render.js.map +1 -1
- package/dist/view/serialize.d.ts.map +1 -1
- package/dist/view/serialize.js +14 -5
- package/dist/view/serialize.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import { normalizedRange, pointCmp, textSelection, } from "../state/selection.js";
|
|
2
|
+
import { pointToDOM } from "../view/dom.js";
|
|
3
|
+
import { defineFeature } from "./feature.js";
|
|
4
|
+
/** 플러그인 키 — tr.meta와 pluginState 양쪽의 채널 이름 */
|
|
5
|
+
export const SEARCH_KEY = "search";
|
|
6
|
+
const EMPTY = {
|
|
7
|
+
query: "",
|
|
8
|
+
caseSensitive: false,
|
|
9
|
+
matches: [],
|
|
10
|
+
active: -1,
|
|
11
|
+
};
|
|
12
|
+
/** state.pluginState에서 검색 상태를 읽는다 — 없으면 비활성 상태 */
|
|
13
|
+
export function searchStateOf(state) {
|
|
14
|
+
return state.pluginState[SEARCH_KEY] ?? EMPTY;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* doc 안에서 query가 나타나는 모든 위치를 문서 순서대로 돌려준다.
|
|
18
|
+
* 텍스트 노드 단위로만 찾는다 — 노드를 넘는 매치는 잡지 않는다.
|
|
19
|
+
*/
|
|
20
|
+
export function collectMatches(doc, query, caseSensitive = false) {
|
|
21
|
+
if (!query)
|
|
22
|
+
return [];
|
|
23
|
+
const needle = caseSensitive ? query : query.toLowerCase();
|
|
24
|
+
const out = [];
|
|
25
|
+
const walk = (node, path) => {
|
|
26
|
+
if (node.type === "text") {
|
|
27
|
+
const raw = node.text ?? "";
|
|
28
|
+
const hay = caseSensitive ? raw : raw.toLowerCase();
|
|
29
|
+
let i = hay.indexOf(needle);
|
|
30
|
+
while (i !== -1) {
|
|
31
|
+
out.push({
|
|
32
|
+
anchor: { path, offset: i },
|
|
33
|
+
focus: { path, offset: i + needle.length },
|
|
34
|
+
});
|
|
35
|
+
i = hay.indexOf(needle, i + needle.length);
|
|
36
|
+
}
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
(node.content ?? []).forEach((c, i) => walk(c, [...path, i]));
|
|
40
|
+
};
|
|
41
|
+
(doc.content ?? []).forEach((c, i) => walk(c, [i]));
|
|
42
|
+
return out;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* 검색어 설정 — 쿼리를 등록하고 캐럿 이후 첫 매치(없으면 첫 매치로
|
|
46
|
+
* 랩)를 선택한다. 빈 문자열은 검색 해제와 같다.
|
|
47
|
+
* UI(검색 입력창)가 호출하는 진입점.
|
|
48
|
+
*/
|
|
49
|
+
export const setSearch = ({ state, tr, dispatch }, query, caseSensitive) => {
|
|
50
|
+
if (typeof query !== "string")
|
|
51
|
+
return false;
|
|
52
|
+
const cs = caseSensitive === true;
|
|
53
|
+
const meta = { query, caseSensitive: cs };
|
|
54
|
+
if (!query) {
|
|
55
|
+
meta["active"] = -1;
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
const matches = collectMatches(state.doc, query, cs);
|
|
59
|
+
const sel = state.selection;
|
|
60
|
+
const caret = sel.type === "text" ? normalizedRange(sel).focus : null;
|
|
61
|
+
// 캐럿 위치 이후의 첫 매치 — 문서 순환(GDocs/VS Code 관례)
|
|
62
|
+
let idx = caret
|
|
63
|
+
? matches.findIndex((m) => pointCmp(m.focus, caret) > 0)
|
|
64
|
+
: 0;
|
|
65
|
+
if (idx === -1)
|
|
66
|
+
idx = matches.length ? 0 : -1;
|
|
67
|
+
const m = idx >= 0 ? matches[idx] : undefined;
|
|
68
|
+
if (m) {
|
|
69
|
+
tr.setSelection(textSelection(m.anchor, m.focus));
|
|
70
|
+
meta["active"] = idx;
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
meta["active"] = -1;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
tr.setMeta(SEARCH_KEY, meta);
|
|
77
|
+
dispatch();
|
|
78
|
+
return true;
|
|
79
|
+
};
|
|
80
|
+
/** 다음/이전 매치로 이동 — active를 순환시키고 해당 매치를 선택한다 */
|
|
81
|
+
const findStep = (dir) => ({ state, tr, dispatch }) => {
|
|
82
|
+
const st = searchStateOf(state);
|
|
83
|
+
const n = st.matches.length;
|
|
84
|
+
if (!st.query || !n)
|
|
85
|
+
return false;
|
|
86
|
+
const next = st.active >= 0 ? (st.active + dir + n) % n : dir === 1 ? 0 : n - 1;
|
|
87
|
+
const m = st.matches[next];
|
|
88
|
+
tr.setSelection(textSelection(m.anchor, m.focus));
|
|
89
|
+
tr.setMeta(SEARCH_KEY, { active: next });
|
|
90
|
+
dispatch();
|
|
91
|
+
return true;
|
|
92
|
+
};
|
|
93
|
+
export const findNext = findStep(1);
|
|
94
|
+
export const findPrev = findStep(-1);
|
|
95
|
+
/**
|
|
96
|
+
* 현재 매치 하나를 replacement로 치환 — active가 유효하면 그 매치,
|
|
97
|
+
* 아니면 첫 매치. 치환 후 같은 인덱스를 유지하면 자연스럽게
|
|
98
|
+
* "다음 매치"가 active가 된다 (삭제로 앞 매치가 지워지지 않는 한).
|
|
99
|
+
* 일반 편집 트랜잭션이라 undo 단위가 된다.
|
|
100
|
+
*/
|
|
101
|
+
export const replaceNext = ({ state, tr, dispatch }, rep) => {
|
|
102
|
+
const st = searchStateOf(state);
|
|
103
|
+
if (!st.query || !st.matches.length)
|
|
104
|
+
return false;
|
|
105
|
+
const text = typeof rep === "string" ? rep : "";
|
|
106
|
+
const i = st.active >= 0 && st.active < st.matches.length ? st.active : 0;
|
|
107
|
+
const m = st.matches[i];
|
|
108
|
+
tr.delete({ anchor: m.anchor, focus: m.focus });
|
|
109
|
+
if (text)
|
|
110
|
+
tr.insertText(text, m.anchor);
|
|
111
|
+
tr.setSelection(textSelection({
|
|
112
|
+
path: m.anchor.path,
|
|
113
|
+
offset: m.anchor.offset + text.length,
|
|
114
|
+
}));
|
|
115
|
+
tr.setMeta(SEARCH_KEY, { active: i });
|
|
116
|
+
dispatch();
|
|
117
|
+
return true;
|
|
118
|
+
};
|
|
119
|
+
/**
|
|
120
|
+
* 모든 매치를 replacement로 일괄 치환 — 뒤쪽 매치부터 처리해 앞쪽
|
|
121
|
+
* 매치의 좌표가 밀리지 않게 한다 (스텝 좌표는 누적 적용 기준).
|
|
122
|
+
* 한 트랜잭션 = 한 undo 단위다.
|
|
123
|
+
*/
|
|
124
|
+
export const replaceAll = ({ state, tr, dispatch }, rep) => {
|
|
125
|
+
const st = searchStateOf(state);
|
|
126
|
+
if (!st.query || !st.matches.length)
|
|
127
|
+
return false;
|
|
128
|
+
const text = typeof rep === "string" ? rep : "";
|
|
129
|
+
const ordered = [...st.matches].sort((a, b) => pointCmp(a.anchor, b.anchor));
|
|
130
|
+
for (let i = ordered.length - 1; i >= 0; i--) {
|
|
131
|
+
const m = ordered[i];
|
|
132
|
+
tr.delete({ anchor: m.anchor, focus: m.focus });
|
|
133
|
+
if (text)
|
|
134
|
+
tr.insertText(text, m.anchor);
|
|
135
|
+
}
|
|
136
|
+
const first = ordered[0];
|
|
137
|
+
tr.setSelection(textSelection({
|
|
138
|
+
path: first.anchor.path,
|
|
139
|
+
offset: first.anchor.offset + text.length,
|
|
140
|
+
}));
|
|
141
|
+
tr.setMeta(SEARCH_KEY, { active: -1 });
|
|
142
|
+
dispatch();
|
|
143
|
+
return true;
|
|
144
|
+
};
|
|
145
|
+
/** 검색 해제 — 쿼리·매치·하이라이트를 전부 지운다 */
|
|
146
|
+
export const clearSearch = ({ tr, dispatch }) => {
|
|
147
|
+
tr.setMeta(SEARCH_KEY, { query: "", active: -1 });
|
|
148
|
+
dispatch();
|
|
149
|
+
return true;
|
|
150
|
+
};
|
|
151
|
+
/**
|
|
152
|
+
* 검색 플러그인 — pluginState의 매치 목록을 doc과 동기화한다.
|
|
153
|
+
* doc이 바뀌거나 쿼리가 바뀐 tr에서만 재수집한다 — 셀렉션/active만
|
|
154
|
+
* 바뀌는 tr(커서 이동, findNext)은 matches를 그대로 재사용한다.
|
|
155
|
+
*/
|
|
156
|
+
const searchPlugin = {
|
|
157
|
+
key: SEARCH_KEY,
|
|
158
|
+
init: () => EMPTY,
|
|
159
|
+
apply(tr, prev, prevState, state) {
|
|
160
|
+
const cur = prev;
|
|
161
|
+
const meta = tr.meta[SEARCH_KEY];
|
|
162
|
+
let query = cur.query;
|
|
163
|
+
let caseSensitive = cur.caseSensitive;
|
|
164
|
+
let active = cur.active;
|
|
165
|
+
if (meta) {
|
|
166
|
+
if (typeof meta["query"] === "string")
|
|
167
|
+
query = meta["query"];
|
|
168
|
+
if (typeof meta["caseSensitive"] === "boolean") {
|
|
169
|
+
caseSensitive = meta["caseSensitive"];
|
|
170
|
+
}
|
|
171
|
+
if (typeof meta["active"] === "number")
|
|
172
|
+
active = meta["active"];
|
|
173
|
+
}
|
|
174
|
+
// 검색 해제 — 빈 상태로 접는다
|
|
175
|
+
if (!query) {
|
|
176
|
+
return cur.query === "" && cur.active === -1 ? cur : { ...EMPTY };
|
|
177
|
+
}
|
|
178
|
+
const stale = state.doc !== prevState.doc ||
|
|
179
|
+
query !== cur.query ||
|
|
180
|
+
caseSensitive !== cur.caseSensitive;
|
|
181
|
+
// 셀렉션/active만의 변경 — 매치 재계산 없이 인덱스만 반영
|
|
182
|
+
if (!stale) {
|
|
183
|
+
return active === cur.active ? cur : { ...cur, active };
|
|
184
|
+
}
|
|
185
|
+
const matches = collectMatches(state.doc, query, caseSensitive);
|
|
186
|
+
if (!matches.length) {
|
|
187
|
+
return { query, caseSensitive, matches, active: -1 };
|
|
188
|
+
}
|
|
189
|
+
if (active < 0)
|
|
190
|
+
active = 0;
|
|
191
|
+
return {
|
|
192
|
+
query,
|
|
193
|
+
caseSensitive,
|
|
194
|
+
matches,
|
|
195
|
+
active: Math.min(active, matches.length - 1),
|
|
196
|
+
};
|
|
197
|
+
},
|
|
198
|
+
};
|
|
199
|
+
/**
|
|
200
|
+
* CSS Custom Highlight 등록 — me-bracket(code-block)과 같은
|
|
201
|
+
* DOM-비접촉 계약. 지원하지 않는 환경에서는 조용히 스킵한다.
|
|
202
|
+
*/
|
|
203
|
+
function paintSearchHighlights(el, st) {
|
|
204
|
+
const win = el.ownerDocument.defaultView;
|
|
205
|
+
const reg = win
|
|
206
|
+
?.CSS?.highlights;
|
|
207
|
+
const H = win?.Highlight;
|
|
208
|
+
if (!reg || !H)
|
|
209
|
+
return;
|
|
210
|
+
const all = [];
|
|
211
|
+
const act = [];
|
|
212
|
+
if (st.query) {
|
|
213
|
+
st.matches.forEach((m, i) => {
|
|
214
|
+
const a = pointToDOM(el, m.anchor);
|
|
215
|
+
const f = pointToDOM(el, m.focus);
|
|
216
|
+
if (!a || !f)
|
|
217
|
+
return;
|
|
218
|
+
const r = el.ownerDocument.createRange();
|
|
219
|
+
r.setStart(a.node, a.offset);
|
|
220
|
+
r.setEnd(f.node, f.offset);
|
|
221
|
+
(i === st.active ? act : all).push(r);
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
if (all.length)
|
|
225
|
+
reg.set("me-find", new H(...all));
|
|
226
|
+
else
|
|
227
|
+
reg.delete("me-find");
|
|
228
|
+
if (act.length)
|
|
229
|
+
reg.set("me-find-active", new H(...act));
|
|
230
|
+
else
|
|
231
|
+
reg.delete("me-find-active");
|
|
232
|
+
}
|
|
233
|
+
export const searchFeature = defineFeature({
|
|
234
|
+
name: "search",
|
|
235
|
+
description: "검색/치환 — setSearch/findNext/replaceNext/replaceAll 커맨드 + ::highlight(me-find) 매치 표시",
|
|
236
|
+
commands: {
|
|
237
|
+
setSearch,
|
|
238
|
+
findNext,
|
|
239
|
+
findPrev,
|
|
240
|
+
replaceNext,
|
|
241
|
+
replaceAll,
|
|
242
|
+
clearSearch,
|
|
243
|
+
},
|
|
244
|
+
plugins: [searchPlugin],
|
|
245
|
+
input: {
|
|
246
|
+
/** 매치 하이라이트 — doc 변경 없이 Range만 등록한다 */
|
|
247
|
+
paintOverlay(el, state) {
|
|
248
|
+
paintSearchHighlights(el, searchStateOf(state));
|
|
249
|
+
},
|
|
250
|
+
},
|
|
251
|
+
});
|
|
252
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/features/search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { Command, InputRule } from "../editor/extension.js";
|
|
2
|
+
import type { EditorNode } from "../model/node.js";
|
|
3
|
+
import type { 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
|
+
export declare function samePath(a: readonly number[], b: readonly number[]): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* 마크 입력 규칙 — `**x**`, `*x*`, `` `x` ``, `~~x~~` 형태.
|
|
46
|
+
* fence 위치는 매치 끝(= 캐럿)에서 문자열 길이로 역산한다 — 패턴이
|
|
47
|
+
* 앞쪽 컨텍스트((?:^|[^*]) 등)를 포함해도 안전하다. fence 전체가
|
|
48
|
+
* 같은 텍스트 노드에 있을 때만 변환 — 경계를 걸치면 스킵.
|
|
49
|
+
*/
|
|
50
|
+
export declare function markRule(pattern: RegExp, markType: string, open: string, close?: string): InputRule;
|
|
51
|
+
/**
|
|
52
|
+
* 블록 입력 규칙 — 블록 시작 패턴(`# `, `## `…)이면 블록을 교체한다.
|
|
53
|
+
* fn은 매치와 현재 블록을 받아 교체할 노드 조각(Partial)을 돌려준다 —
|
|
54
|
+
* null이면 규칙 폴스루.
|
|
55
|
+
*/
|
|
56
|
+
export declare function blockRule(pattern: RegExp, fn: (m: RegExpMatchArray, block: EditorNode) => Partial<EditorNode> | null): InputRule;
|
|
57
|
+
/** 정렬 attr → DOMSpec — left 기본값은 style을 내지 않는다 */
|
|
58
|
+
export declare function alignDOM(tag: string, n: EditorNode): {
|
|
59
|
+
tag: string;
|
|
60
|
+
attrs?: Record<string, string>;
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* 래핑 입력 규칙 헬퍼 — `- `, `> `처럼 매치된 블록을 wrapper 안에
|
|
64
|
+
* 넣는다. make()의 content는 블록이 들어갈 빈 슬롯 경로를 표현한다
|
|
65
|
+
* (리스트는 li 껍데기, 인용구는 빈 content). 접두 텍스트는 래핑 후
|
|
66
|
+
* 한 단계 깊어진 위치에서 지운다.
|
|
67
|
+
*/
|
|
68
|
+
export declare function wrapBlock(tr: Transaction, range: Range, doc: EditorNode, make: () => EditorNode | null): boolean;
|
|
69
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/features/shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAQnD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D;;;;GAIG;AAEH,sCAAsC;AACtC,wBAAgB,YAAY,CAC1B,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,MAAM,GACf,OAAO,CAWT;AAED,yDAAyD;AACzD,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAmBpD;AAID;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAa1E;AAED,gDAAgD;AAChD,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAGvE;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAQlE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,WAAW,GACjB,SAAS,MAAM,EAAE,GAAG,IAAI,CAuB1B;AAED,qCAAqC;AACrC,wBAAgB,WAAW,CACzB,KAAK,EAAE,WAAW,GACjB;IAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CAQrE;AAED,2CAA2C;AAC3C,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CA2BT;AAED,+CAA+C;AAC/C,wBAAgB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAElD;AAED,wBAAgB,QAAQ,CACtB,CAAC,EAAE,SAAS,MAAM,EAAE,EACpB,CAAC,EAAE,SAAS,MAAM,EAAE,GACnB,OAAO,CAET;AAID;;;;;GAKG;AACH,wBAAgB,QAAQ,CACtB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,KAAK,SAAO,GACX,SAAS,CAmCX;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,CAAC,CAAC,EAAE,gBAAgB,EAAE,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,GACzE,SAAS,CAiBX;AAED,kDAAkD;AAClD,wBAAgB,QAAQ,CACtB,GAAG,EAAE,MAAM,EACX,CAAC,EAAE,UAAU,GACZ;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAGjD;AAoBD;;;;;GAKG;AACH,wBAAgB,SAAS,CACvB,EAAE,EAAE,WAAW,EACf,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,UAAU,EACf,IAAI,EAAE,MAAM,UAAU,GAAG,IAAI,GAC5B,OAAO,CAkBT"}
|
|
@@ -0,0 +1,272 @@
|
|
|
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
|
+
export function samePath(a, b) {
|
|
159
|
+
return a.length === b.length && a.every((v, i) => v === b[i]);
|
|
160
|
+
}
|
|
161
|
+
// ── 입력 규칙 팩토리 ────────────────────────────────────────
|
|
162
|
+
/**
|
|
163
|
+
* 마크 입력 규칙 — `**x**`, `*x*`, `` `x` ``, `~~x~~` 형태.
|
|
164
|
+
* fence 위치는 매치 끝(= 캐럿)에서 문자열 길이로 역산한다 — 패턴이
|
|
165
|
+
* 앞쪽 컨텍스트((?:^|[^*]) 등)를 포함해도 안전하다. fence 전체가
|
|
166
|
+
* 같은 텍스트 노드에 있을 때만 변환 — 경계를 걸치면 스킵.
|
|
167
|
+
*/
|
|
168
|
+
export function markRule(pattern, markType, open, close = open) {
|
|
169
|
+
return {
|
|
170
|
+
pattern,
|
|
171
|
+
handler: ({ tr }, m, range) => {
|
|
172
|
+
const inner = m[1] ?? "";
|
|
173
|
+
if (!inner)
|
|
174
|
+
return false;
|
|
175
|
+
const { anchor: a, focus: f } = range;
|
|
176
|
+
if (!samePath(a.path, f.path))
|
|
177
|
+
return false;
|
|
178
|
+
const closeStart = f.offset - close.length;
|
|
179
|
+
const innerStart = closeStart - inner.length;
|
|
180
|
+
const openStart = innerStart - open.length;
|
|
181
|
+
if (openStart < 0)
|
|
182
|
+
return false;
|
|
183
|
+
// 닫힘 fence(큰 오프셋)부터 지워야 앞쪽 좌표가 안 밀린다
|
|
184
|
+
tr.delete({ anchor: { path: f.path, offset: closeStart }, focus: f });
|
|
185
|
+
tr.delete({
|
|
186
|
+
anchor: { path: f.path, offset: openStart },
|
|
187
|
+
focus: { path: f.path, offset: innerStart },
|
|
188
|
+
});
|
|
189
|
+
// fence 삭제 후 inner는 [openStart, openStart+inner.length)
|
|
190
|
+
tr.addMark({
|
|
191
|
+
anchor: { path: f.path, offset: openStart },
|
|
192
|
+
focus: { path: f.path, offset: openStart + inner.length },
|
|
193
|
+
}, { type: markType });
|
|
194
|
+
tr.setSelection(textSelection({
|
|
195
|
+
path: f.path,
|
|
196
|
+
offset: openStart + inner.length,
|
|
197
|
+
}));
|
|
198
|
+
return true;
|
|
199
|
+
},
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* 블록 입력 규칙 — 블록 시작 패턴(`# `, `## `…)이면 블록을 교체한다.
|
|
204
|
+
* fn은 매치와 현재 블록을 받아 교체할 노드 조각(Partial)을 돌려준다 —
|
|
205
|
+
* null이면 규칙 폴스루.
|
|
206
|
+
*/
|
|
207
|
+
export function blockRule(pattern, fn) {
|
|
208
|
+
return {
|
|
209
|
+
pattern,
|
|
210
|
+
handler: ({ tr }, m, range, doc) => {
|
|
211
|
+
const blockPath = range.anchor.path.slice(0, -1);
|
|
212
|
+
const block = nodeAt(doc, blockPath);
|
|
213
|
+
if (!block)
|
|
214
|
+
return false;
|
|
215
|
+
const patch = fn(m, block);
|
|
216
|
+
if (!patch)
|
|
217
|
+
return false;
|
|
218
|
+
// 타입 교체를 먼저 하고(기존 내용 유지) 접두사를 지운다 —
|
|
219
|
+
// 스텝은 순차 적용되므로 delete 좌표도 그대로 유효하다
|
|
220
|
+
tr.replaceNode(blockPath, { ...block, ...patch });
|
|
221
|
+
tr.delete(range);
|
|
222
|
+
tr.setSelection(textSelection(range.anchor));
|
|
223
|
+
return true;
|
|
224
|
+
},
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
/** 정렬 attr → DOMSpec — left 기본값은 style을 내지 않는다 */
|
|
228
|
+
export function alignDOM(tag, n) {
|
|
229
|
+
const a = String(n.attrs?.["align"] ?? "left");
|
|
230
|
+
return a === "left" ? { tag } : { tag, attrs: { style: `text-align: ${a}` } };
|
|
231
|
+
}
|
|
232
|
+
/** wrapper의 가장 깊은 빈 자리에 block을 채운다 — 래핑 입력 규칙용 */
|
|
233
|
+
function fillLast(wrapper, block) {
|
|
234
|
+
const kids = wrapper.content;
|
|
235
|
+
if (!kids?.length) {
|
|
236
|
+
return { node: { ...wrapper, content: [block] }, innerPath: [0] };
|
|
237
|
+
}
|
|
238
|
+
const i = kids.length - 1;
|
|
239
|
+
const inner = fillLast(kids[i], block);
|
|
240
|
+
if (!inner)
|
|
241
|
+
return null;
|
|
242
|
+
return {
|
|
243
|
+
node: { ...wrapper, content: [...kids.slice(0, i), inner.node] },
|
|
244
|
+
innerPath: [i, ...inner.innerPath],
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* 래핑 입력 규칙 헬퍼 — `- `, `> `처럼 매치된 블록을 wrapper 안에
|
|
249
|
+
* 넣는다. make()의 content는 블록이 들어갈 빈 슬롯 경로를 표현한다
|
|
250
|
+
* (리스트는 li 껍데기, 인용구는 빈 content). 접두 텍스트는 래핑 후
|
|
251
|
+
* 한 단계 깊어진 위치에서 지운다.
|
|
252
|
+
*/
|
|
253
|
+
export function wrapBlock(tr, range, doc, make) {
|
|
254
|
+
const blockPath = range.anchor.path.slice(0, -1);
|
|
255
|
+
const block = nodeAt(doc, blockPath);
|
|
256
|
+
const wrapper = block && make();
|
|
257
|
+
if (!block || !wrapper)
|
|
258
|
+
return false;
|
|
259
|
+
const filled = fillLast(wrapper, block);
|
|
260
|
+
if (!filled)
|
|
261
|
+
return false;
|
|
262
|
+
const tIdx = range.anchor.path[range.anchor.path.length - 1];
|
|
263
|
+
const innerPath = [...blockPath, ...filled.innerPath, tIdx];
|
|
264
|
+
tr.replaceNode(blockPath, filled.node);
|
|
265
|
+
tr.delete({
|
|
266
|
+
anchor: { path: innerPath, offset: range.anchor.offset },
|
|
267
|
+
focus: { path: innerPath, offset: range.focus.offset },
|
|
268
|
+
});
|
|
269
|
+
tr.setSelection(textSelection({ path: innerPath, offset: range.anchor.offset }));
|
|
270
|
+
return true;
|
|
271
|
+
}
|
|
272
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/features/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +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;AAUtD;;;;;;;;;GASG;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,8CAA8C;AAC9C,eAAO,MAAM,cAAc,EAAE,OAiB5B,CAAC;AAEF,yCAAyC;AACzC,eAAO,MAAM,cAAc,EAAE,OAqB5B,CAAC;AAEF,yCAAyC;AACzC,eAAO,MAAM,iBAAiB,EAAE,OAuB/B,CAAC;AAEF;;6CAE6C;AAC7C,eAAO,MAAM,iBAAiB,EAAE,
|
|
1
|
+
{"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../src/features/table.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAUtD;;;;;;;;;GASG;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,8CAA8C;AAC9C,eAAO,MAAM,cAAc,EAAE,OAiB5B,CAAC;AAEF,yCAAyC;AACzC,eAAO,MAAM,cAAc,EAAE,OAqB5B,CAAC;AAEF,yCAAyC;AACzC,eAAO,MAAM,iBAAiB,EAAE,OAuB/B,CAAC;AAEF;;6CAE6C;AAC7C,eAAO,MAAM,iBAAiB,EAAE,OA0B/B,CAAC;AAEF,8BAA8B;AAC9B,eAAO,MAAM,WAAW,EAAE,OAgBzB,CAAC;AAgOF,eAAO,MAAM,YAAY,gCAyEvB,CAAC"}
|