@moda-editor/core 0.1.3 → 0.2.0
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 +304 -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 +169 -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 +345 -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/editor.d.ts.map +1 -1
- package/dist/editor/editor.js +18 -1
- package/dist/editor/editor.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 +59 -20
- 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 +84 -1034
- 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 +16 -0
- package/dist/features/doc.d.ts.map +1 -1
- package/dist/features/doc.js +154 -2
- 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 +3 -1
- package/dist/features/image.d.ts.map +1 -1
- package/dist/features/image.js +27 -9
- 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 +76 -0
- package/dist/features/search.d.ts.map +1 -0
- package/dist/features/search.js +281 -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 +21 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -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 +46 -0
- package/dist/presets/markdown.d.ts.map +1 -0
- package/dist/presets/markdown.js +196 -0
- package/dist/presets/markdown.js.map +1 -0
- package/dist/state/apply.d.ts.map +1 -1
- package/dist/state/apply.js +25 -13
- 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 +401 -213
- package/dist/theme.d.ts +29 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +347 -0
- package/dist/theme.js.map +1 -0
- 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 +156 -535
- 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 +22 -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,207 @@
|
|
|
1
|
+
import { point } from "../state/selection.js";
|
|
2
|
+
import { defineFeature } from "./feature.js";
|
|
3
|
+
/**
|
|
4
|
+
* 블록 드래그&드롭 — Notion식 블록 재배치.
|
|
5
|
+
*
|
|
6
|
+
* DOM 계약: `.me-editor`의 직계 요소 자식은 doc 루트 블록과 1:1 —
|
|
7
|
+
* 자식 인덱스가 곧 블록 경로다. 최상위 블록만 이동 대상으로 한다
|
|
8
|
+
* (중첩 블록의 리스트/표 내부 재배치는 별개 기능).
|
|
9
|
+
*
|
|
10
|
+
* UI는 .me-editor의 형제 오버레이(.me-dnd)로 그린다 — 편집 DOM 안에
|
|
11
|
+
* 핸들을 넣으면 DOM↔Point 매핑과 IME 경계가 깨진다. 거터 스트립
|
|
12
|
+
* (왼쪽 여백)에만 겹치게 둬 Chrome 캐럿 줄 경계 계산을 지킨다.
|
|
13
|
+
*
|
|
14
|
+
* .me-dnd (pointer-events:none)
|
|
15
|
+
* ├ .me-drag-handle (pointer-events:auto, draggable) — 호버 블록 좌측
|
|
16
|
+
* └ .me-drop-line — dragover 중 삽입 경계 표시
|
|
17
|
+
*
|
|
18
|
+
* 데이터는 "application/x-moda-block" MIME로 나른다 — 파일 드롭
|
|
19
|
+
* (imageFeature의 files 훅)과 섞이지 않게 자기 타입일 때만
|
|
20
|
+
* dragover/drop을 소비한다.
|
|
21
|
+
*/
|
|
22
|
+
const MIME = "application/x-moda-block";
|
|
23
|
+
const dndViews = new WeakMap();
|
|
24
|
+
/**
|
|
25
|
+
* 포인터 아래의 최상위 블록 — target에서 올라가 el의 직계 자식을
|
|
26
|
+
* 찾는다. 직계 자식 인덱스 = doc 루트 블록 인덱스 (DOM 계약).
|
|
27
|
+
* 노드 뷰 래퍼(.me-node-view)도 직계 자식이므로 같은 규칙이 성립한다.
|
|
28
|
+
*/
|
|
29
|
+
function topBlockAt(el, target) {
|
|
30
|
+
const ElementCtor = el.ownerDocument.defaultView?.Element;
|
|
31
|
+
if (!ElementCtor || !(target instanceof ElementCtor))
|
|
32
|
+
return null;
|
|
33
|
+
let host = target;
|
|
34
|
+
while (host && host.parentElement !== el)
|
|
35
|
+
host = host.parentElement;
|
|
36
|
+
if (!host)
|
|
37
|
+
return null;
|
|
38
|
+
return { host, index: Array.prototype.indexOf.call(el.children, host) };
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* dragover의 삽입 경계 — 블록 중간선 기준 before/after를 계산한다.
|
|
42
|
+
* to는 "원래 배열의 삽입 경계"(블록 i 앞=i, 뒤=i+1), y는 표시선 위치.
|
|
43
|
+
*/
|
|
44
|
+
function dropTargetAt(el, e) {
|
|
45
|
+
const hit = topBlockAt(el, e.target);
|
|
46
|
+
if (!hit)
|
|
47
|
+
return null;
|
|
48
|
+
const r = hit.host.getBoundingClientRect();
|
|
49
|
+
const after = e.clientY > r.top + r.height / 2;
|
|
50
|
+
return { to: hit.index + (after ? 1 : 0), y: after ? r.bottom : r.top };
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* 오버레이 DOM과 이벤트 리스너를 지연 바인딩한다 — paintOverlay는
|
|
54
|
+
* 렌더 커밋마다 호출되므로 WeakMap으로 한 번만 붙인다.
|
|
55
|
+
*/
|
|
56
|
+
function ensureBound(el, editor) {
|
|
57
|
+
const prev = dndViews.get(el);
|
|
58
|
+
if (prev)
|
|
59
|
+
return prev;
|
|
60
|
+
const doc = el.ownerDocument;
|
|
61
|
+
const root = el.parentElement;
|
|
62
|
+
// .me-root 형제로 올라가야 하므로 부모가 없으면 오버레이를 못 둔다
|
|
63
|
+
if (!root)
|
|
64
|
+
return null;
|
|
65
|
+
const overlay = doc.createElement("div");
|
|
66
|
+
overlay.className = "me-dnd";
|
|
67
|
+
overlay.setAttribute("contenteditable", "false");
|
|
68
|
+
const handle = doc.createElement("div");
|
|
69
|
+
handle.className = "me-drag-handle";
|
|
70
|
+
handle.draggable = true;
|
|
71
|
+
handle.title = "드래그해서 블록 이동";
|
|
72
|
+
handle.textContent = "⋮⋮";
|
|
73
|
+
const line = doc.createElement("div");
|
|
74
|
+
line.className = "me-drop-line";
|
|
75
|
+
overlay.append(handle, line);
|
|
76
|
+
root.appendChild(overlay);
|
|
77
|
+
const vs = {
|
|
78
|
+
overlay,
|
|
79
|
+
handle,
|
|
80
|
+
line,
|
|
81
|
+
hover: -1,
|
|
82
|
+
from: null,
|
|
83
|
+
listeners: [],
|
|
84
|
+
};
|
|
85
|
+
const on = (t, type, fn) => {
|
|
86
|
+
t.addEventListener(type, fn);
|
|
87
|
+
vs.listeners.push([t, type, fn]);
|
|
88
|
+
};
|
|
89
|
+
// 블록 위 호버 → 핸들을 그 블록의 왼쪽 거터 자리에 표시한다
|
|
90
|
+
on(el, "mousemove", ((e) => {
|
|
91
|
+
if (vs.from !== null)
|
|
92
|
+
return; // 드래그 중에는 핸들을 감춘 채 둔다
|
|
93
|
+
const hit = topBlockAt(el, e.target);
|
|
94
|
+
if (!hit) {
|
|
95
|
+
vs.hover = -1;
|
|
96
|
+
handle.classList.remove("is-visible");
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
vs.hover = hit.index;
|
|
100
|
+
const r = hit.host.getBoundingClientRect();
|
|
101
|
+
const rr = overlay.getBoundingClientRect();
|
|
102
|
+
handle.style.top = `${r.top - rr.top}px`;
|
|
103
|
+
handle.classList.add("is-visible");
|
|
104
|
+
}));
|
|
105
|
+
on(el, "mouseleave", (() => {
|
|
106
|
+
vs.hover = -1;
|
|
107
|
+
handle.classList.remove("is-visible");
|
|
108
|
+
}));
|
|
109
|
+
on(handle, "dragstart", ((e) => {
|
|
110
|
+
if (vs.hover < 0) {
|
|
111
|
+
e.preventDefault();
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
vs.from = vs.hover;
|
|
115
|
+
e.dataTransfer?.setData(MIME, String(vs.from));
|
|
116
|
+
// effectAllowed가 없으면 일부 브라우저가 drop을 보내지 않는다
|
|
117
|
+
if (e.dataTransfer)
|
|
118
|
+
e.dataTransfer.effectAllowed = "move";
|
|
119
|
+
handle.classList.remove("is-visible");
|
|
120
|
+
}));
|
|
121
|
+
const clearDrag = () => {
|
|
122
|
+
vs.from = null;
|
|
123
|
+
line.classList.remove("is-visible");
|
|
124
|
+
handle.classList.remove("is-visible");
|
|
125
|
+
};
|
|
126
|
+
on(handle, "dragend", clearDrag);
|
|
127
|
+
on(el, "dragover", ((e) => {
|
|
128
|
+
// 우리 MIME이 아니면(파일 드롭 등) 관여하지 않는다
|
|
129
|
+
if (!e.dataTransfer?.types.includes(MIME))
|
|
130
|
+
return;
|
|
131
|
+
const t = dropTargetAt(el, e);
|
|
132
|
+
if (!t)
|
|
133
|
+
return;
|
|
134
|
+
e.preventDefault(); // drop 허용
|
|
135
|
+
if (e.dataTransfer)
|
|
136
|
+
e.dataTransfer.dropEffect = "move";
|
|
137
|
+
const rr = overlay.getBoundingClientRect();
|
|
138
|
+
line.style.top = `${t.y - rr.top}px`;
|
|
139
|
+
line.classList.add("is-visible");
|
|
140
|
+
}));
|
|
141
|
+
on(el, "drop", ((e) => {
|
|
142
|
+
if (!e.dataTransfer?.types.includes(MIME))
|
|
143
|
+
return;
|
|
144
|
+
const t = dropTargetAt(el, e);
|
|
145
|
+
const from = vs.from ?? Number(e.dataTransfer.getData(MIME));
|
|
146
|
+
clearDrag();
|
|
147
|
+
if (!t || !Number.isFinite(from))
|
|
148
|
+
return;
|
|
149
|
+
e.preventDefault();
|
|
150
|
+
editor.commands["moveBlock"](from, t.to);
|
|
151
|
+
}));
|
|
152
|
+
on(el, "dragleave", (() => {
|
|
153
|
+
line.classList.remove("is-visible");
|
|
154
|
+
}));
|
|
155
|
+
dndViews.set(el, vs);
|
|
156
|
+
return vs;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* 블록 드래그&드롭 피처 — `moveBlock(from, to)` 커맨드 + 호버 핸들/
|
|
160
|
+
* 드롭 라인 오버레이. `to`는 제거 전 기준 삽입 경계다
|
|
161
|
+
* (예: 블록0을 블록2 뒤로 → moveBlock(0, 3)).
|
|
162
|
+
*/
|
|
163
|
+
export const blockDndFeature = defineFeature({
|
|
164
|
+
name: "block-dnd",
|
|
165
|
+
description: "블록 드래그&드롭 — .me-drag-handle로 최상위 블록 재배치 (moveBlock)",
|
|
166
|
+
commands: {
|
|
167
|
+
/**
|
|
168
|
+
* 최상위 블록 from을 경계 to로 이동한다. to는 "원래 배열의 삽입
|
|
169
|
+
* 경계" — 블록 i 앞이 i, 뒤가 i+1. from 제거로 생기는 인덱스
|
|
170
|
+
* 시프트(to>from이면 -1)는 여기서 정규화한다.
|
|
171
|
+
*/
|
|
172
|
+
moveBlock(ctx, ...args) {
|
|
173
|
+
const from = args[0];
|
|
174
|
+
const to = args[1];
|
|
175
|
+
if (typeof from !== "number" || typeof to !== "number")
|
|
176
|
+
return false;
|
|
177
|
+
const len = ctx.state.doc.content?.length ?? 0;
|
|
178
|
+
if (from < 0 || from >= len || to < 0 || to > len)
|
|
179
|
+
return false;
|
|
180
|
+
if (to === from || to === from + 1)
|
|
181
|
+
return true; // 제자리 — no-op
|
|
182
|
+
const node = ctx.state.doc.content[from];
|
|
183
|
+
const adj = to > from ? to - 1 : to;
|
|
184
|
+
ctx.tr
|
|
185
|
+
.delete({ anchor: point([], from), focus: point([], from + 1) })
|
|
186
|
+
.insertNode(point([], adj), node);
|
|
187
|
+
ctx.dispatch();
|
|
188
|
+
return true;
|
|
189
|
+
},
|
|
190
|
+
},
|
|
191
|
+
input: {
|
|
192
|
+
paintOverlay(el, _state, editor) {
|
|
193
|
+
ensureBound(el, editor);
|
|
194
|
+
},
|
|
195
|
+
destroyOverlay(el) {
|
|
196
|
+
const vs = dndViews.get(el);
|
|
197
|
+
if (!vs)
|
|
198
|
+
return;
|
|
199
|
+
for (const [t, type, fn] of vs.listeners) {
|
|
200
|
+
t.removeEventListener(type, fn);
|
|
201
|
+
}
|
|
202
|
+
vs.overlay.remove();
|
|
203
|
+
dndViews.delete(el);
|
|
204
|
+
},
|
|
205
|
+
},
|
|
206
|
+
});
|
|
207
|
+
//# sourceMappingURL=block-dnd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"block-dnd.js","sourceRoot":"","sources":["../../src/features/block-dnd.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
import type { Command } from "../editor/extension.js";
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
/**
|
|
3
|
+
* 코드블록 — ` ``` ` 입력 규칙, 구문 하이라이트, Ace/VS Code 관례의
|
|
4
|
+
* 코드 편집 명령(들여쓰기·주석 토글·줄 이동/복제·괄호 매칭·화살표
|
|
5
|
+
* 탈출). 코드 텍스트는 마크 없는 순수 텍스트다.
|
|
6
|
+
*
|
|
7
|
+
* 모듈 구성 — 이 파일은 스키마·블록 변환·크롬 UI·feature 정의만 갖고,
|
|
8
|
+
* 컨텍스트 해석은 code-context.ts, 편집 커맨드는 code-edit.ts,
|
|
9
|
+
* 서식 엔진은 code-format.ts에 있다.
|
|
10
|
+
*/
|
|
4
11
|
/**
|
|
5
12
|
* 코드블록 — ` ``` ` 입력 규칙, 구문 하이라이트, Ace/VS Code 관례의
|
|
6
13
|
* 코드 편집 명령(들여쓰기·주석 토글·줄 이동/복제·괄호 매칭·화살표
|
|
@@ -20,87 +27,5 @@ export declare function setCodeLanguage(language: string): Command;
|
|
|
20
27
|
* 무관하게 특정 블록을 바꿀 때 쓴다.
|
|
21
28
|
*/
|
|
22
29
|
export declare function setCodeLanguageAt(blockPath: readonly number[], language: string): Command;
|
|
23
|
-
/**
|
|
24
|
-
* 코드 서식 정리 — 언어 서버 없이 안전한 수준만 한다:
|
|
25
|
-
* - 언어가 json이거나(미지정이고 {/[ 로 시작할 때) JSON으로 파싱되면
|
|
26
|
-
* 2칸 pretty-print
|
|
27
|
-
* - 중괄호 계열(js/ts/java/c/go/rust/php/css…): 브래킷 깊이로
|
|
28
|
-
* 재들여쓰기 — 문자열·주석·템플릿·정규식 안의 기호는 세지 않는다
|
|
29
|
-
* - 마크업(html/xml/vue/svelte): 태그 깊이로 재들여쓰기
|
|
30
|
-
* - 쉘(sh/bash): if/fi·do/done·case/esac·{} 블록으로 재들여쓰기
|
|
31
|
-
* - sql: 예약어 대문자화
|
|
32
|
-
* - 모든 언어: 줄 끝 공백 제거 + 3개 이상 연속 빈 줄을 2개로 +
|
|
33
|
-
* 파일 끝 빈 줄 제거 (EditorConfig/prettier 공통 규칙)
|
|
34
|
-
* 들여쓰기 단위는 기존 코드에서 추정하고 없으면 2칸. 줄 구조는 바꾸지
|
|
35
|
-
* 않는다 — 선행 공백만 다시 쓰는 수준이라 깨진 코드에서도 안전하다.
|
|
36
|
-
* 바뀔 게 없으면 null.
|
|
37
|
-
*/
|
|
38
|
-
export declare function formatCodeText(code: string, language: string): string | null;
|
|
39
|
-
/**
|
|
40
|
-
* 경로로 지정한 코드블록 서식 정리 — 노드 뷰 크롬 바처럼 캐럿과
|
|
41
|
-
* 무관하게 특정 블록을 정리할 때 쓴다. 이 블록 안의 셀렉션
|
|
42
|
-
* 엔드포인트는 새 텍스트 길이로 클램프해 보존한다.
|
|
43
|
-
*/
|
|
44
|
-
export declare function formatCodeAt(blockPath: readonly number[]): Command;
|
|
45
|
-
/** 캐럿 코드블록 서식 정리 — Shift-Alt-F/정리 버튼 (VS Code 관례) */
|
|
46
|
-
export declare const formatCode: Command;
|
|
47
|
-
/**
|
|
48
|
-
* 문자열/주석 토큰 안의 문자 오프셋 판정 — spec.codeHighlighter로
|
|
49
|
-
* 토큰화해 그 구간에 있으면 true를 돌린다 (Ace가 페어링·매칭을
|
|
50
|
-
* 끌 때 쓰는 isCodeLike 관례). 하이라이터가 없으면 null.
|
|
51
|
-
*/
|
|
52
|
-
export declare function codeStringMask(state: EditorState, block: EditorNode): ((off: number) => boolean) | null;
|
|
53
|
-
/**
|
|
54
|
-
* Tab — 코드블록 들여쓰기. collapsed면 캐럿에 \t 삽입,
|
|
55
|
-
* 범위 선택이면 걸친 줄 전부의 앞에 \t를 단다 (VS Code 관례).
|
|
56
|
-
* 코드블록 밖이면 false — 리스트/표 키바인딩으로 폴스루.
|
|
57
|
-
*/
|
|
58
|
-
export declare const indentCode: Command;
|
|
59
|
-
/**
|
|
60
|
-
* Shift-Tab — 코드블록 내어쓰기. 걸친 각 줄의 앞에서 \t 하나 또는
|
|
61
|
-
* 스페이스 최대 tabSize개를 지운다. 코드블록 밖이면 false로 폴스루.
|
|
62
|
-
*/
|
|
63
|
-
export declare const dedentCode: Command;
|
|
64
|
-
/**
|
|
65
|
-
* ArrowDown/ArrowUp — 코드블록 가장자리 줄 탈출 (Tiptap
|
|
66
|
-
* exitOnArrowDown/Up 관례). 마지막 줄에서 ArrowDown을 누르면 블록
|
|
67
|
-
* 뒤로, 첫 줄에서 ArrowUp이면 블록 앞으로 나간다 — 이웃 블록이
|
|
68
|
-
* 없으면 빈 문단을 만든다. Notion의 코드블록 화살표 탈출과 같다.
|
|
69
|
-
*/
|
|
70
|
-
export declare function exitCodeArrow(direction: "up" | "down"): Command;
|
|
71
|
-
/** 캐럿 코드블록의 텍스트 — 복사 버튼 등 UI용. 밖이면 null */
|
|
72
|
-
export declare function codeTextAt(state: EditorState): string | null;
|
|
73
|
-
/** 코드블록 안 캐럿의 줄/열 (Ace 상태바 Ln:Col 관례). 밖이면 null */
|
|
74
|
-
export declare function codeCaret(state: EditorState): {
|
|
75
|
-
line: number;
|
|
76
|
-
col: number;
|
|
77
|
-
} | null;
|
|
78
|
-
/**
|
|
79
|
-
* Mod-/ — 코드블록 줄 주석 토글 (Ace toggleCommentLines 관례).
|
|
80
|
-
* 걸친 줄이 전부 주석이면 해제, 아니면 주석을 단다 — 마커는
|
|
81
|
-
* 선행 공백 뒤에 붙어 들여쓰기가 보존된다 (VS Code 관례).
|
|
82
|
-
* 블록 주석 언어(css/html 등)는 줄마다 블록 마커로 감싼다.
|
|
83
|
-
*/
|
|
84
|
-
export declare const toggleCodeComment: Command;
|
|
85
|
-
/**
|
|
86
|
-
* Alt-↑/↓ — 선택이 걸친 줄들을 위/아래 한 줄 이동 (Ace movelines·
|
|
87
|
-
* VS Code 관례). 첫/마지막 줄 가장자리에선 false로 폴스루한다.
|
|
88
|
-
*/
|
|
89
|
-
export declare function moveCodeLines(direction: "up" | "down"): Command;
|
|
90
|
-
/**
|
|
91
|
-
* Mod-Shift-D — 선택이 걸친 줄들을 바로 아래에 복제
|
|
92
|
-
* (Ace duplicateSelection 관례). 사본이 선택된다.
|
|
93
|
-
*/
|
|
94
|
-
export declare const duplicateCodeLines: Command;
|
|
95
|
-
/**
|
|
96
|
-
* 캐럿 인접 괄호와 짝의 문자 오프셋 (Ace bracket matching 관례).
|
|
97
|
-
* 캐럿 앞/뒤의 ()[]{}를 보고 같은 종류만 세는 깊이 스캔으로 짝을
|
|
98
|
-
* 찾는다 — 문자열/주석 토큰 안쪽의 괄호는 코드로 세지 않는다.
|
|
99
|
-
* 없으면 null.
|
|
100
|
-
*/
|
|
101
|
-
export declare function codeBracketAt(state: EditorState): {
|
|
102
|
-
a: number;
|
|
103
|
-
b: number;
|
|
104
|
-
} | null;
|
|
105
30
|
export declare const codeBlockFeature: import("./feature.js").Feature;
|
|
106
31
|
//# sourceMappingURL=code-block.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-block.d.ts","sourceRoot":"","sources":["../../src/features/code-block.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"code-block.d.ts","sourceRoot":"","sources":["../../src/features/code-block.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAkCtD;;;;;;;;GAQG;AAEH;;;;GAIG;AAIH;;;;;GAKG;AACH,eAAO,MAAM,eAAe,EAAE,OAmE7B,CAAC;AAEF,uDAAuD;AACvD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAazD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,QAAQ,EAAE,MAAM,GACf,OAAO,CAQT;AAsJD,eAAO,MAAM,gBAAgB,gCA8U3B,CAAC"}
|