@moda-editor/core 0.1.5 → 0.2.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.
Files changed (151) hide show
  1. package/dist/collab.d.ts +7 -0
  2. package/dist/collab.d.ts.map +1 -1
  3. package/dist/collab.js +11 -2
  4. package/dist/collab.js.map +1 -1
  5. package/dist/commands.d.ts +32 -1
  6. package/dist/commands.d.ts.map +1 -1
  7. package/dist/commands.js +101 -23
  8. package/dist/commands.js.map +1 -1
  9. package/dist/conformance/editor-base.d.ts.map +1 -1
  10. package/dist/conformance/editor-base.js +24 -0
  11. package/dist/conformance/editor-base.js.map +1 -1
  12. package/dist/conformance/editor-nodeview.d.ts.map +1 -1
  13. package/dist/conformance/editor-nodeview.js +49 -0
  14. package/dist/conformance/editor-nodeview.js.map +1 -1
  15. package/dist/conformance/editor-overlay.d.ts.map +1 -1
  16. package/dist/conformance/editor-overlay.js +23 -1
  17. package/dist/conformance/editor-overlay.js.map +1 -1
  18. package/dist/editor/editor.d.ts +6 -0
  19. package/dist/editor/editor.d.ts.map +1 -1
  20. package/dist/editor/editor.js +32 -5
  21. package/dist/editor/editor.js.map +1 -1
  22. package/dist/features/ace.d.ts.map +1 -1
  23. package/dist/features/ace.js +31 -7
  24. package/dist/features/ace.js.map +1 -1
  25. package/dist/features/alignment.d.ts.map +1 -1
  26. package/dist/features/alignment.js +6 -0
  27. package/dist/features/alignment.js.map +1 -1
  28. package/dist/features/block-dnd.d.ts.map +1 -1
  29. package/dist/features/block-dnd.js +6 -1
  30. package/dist/features/block-dnd.js.map +1 -1
  31. package/dist/features/blockquote.d.ts.map +1 -1
  32. package/dist/features/blockquote.js +40 -11
  33. package/dist/features/blockquote.js.map +1 -1
  34. package/dist/features/code-block.d.ts.map +1 -1
  35. package/dist/features/code-block.js +61 -14
  36. package/dist/features/code-block.js.map +1 -1
  37. package/dist/features/code-edit.d.ts.map +1 -1
  38. package/dist/features/code-edit.js +25 -4
  39. package/dist/features/code-edit.js.map +1 -1
  40. package/dist/features/code-format.d.ts.map +1 -1
  41. package/dist/features/code-format.js +80 -24
  42. package/dist/features/code-format.js.map +1 -1
  43. package/dist/features/doc.d.ts +16 -0
  44. package/dist/features/doc.d.ts.map +1 -1
  45. package/dist/features/doc.js +166 -3
  46. package/dist/features/doc.js.map +1 -1
  47. package/dist/features/heading.d.ts.map +1 -1
  48. package/dist/features/heading.js +3 -2
  49. package/dist/features/heading.js.map +1 -1
  50. package/dist/features/horizontal-rule.d.ts.map +1 -1
  51. package/dist/features/horizontal-rule.js +13 -5
  52. package/dist/features/horizontal-rule.js.map +1 -1
  53. package/dist/features/image.d.ts +3 -1
  54. package/dist/features/image.d.ts.map +1 -1
  55. package/dist/features/image.js +34 -9
  56. package/dist/features/image.js.map +1 -1
  57. package/dist/features/inline-style.d.ts.map +1 -1
  58. package/dist/features/inline-style.js +20 -6
  59. package/dist/features/inline-style.js.map +1 -1
  60. package/dist/features/link.d.ts.map +1 -1
  61. package/dist/features/link.js +23 -6
  62. package/dist/features/link.js.map +1 -1
  63. package/dist/features/lists.d.ts.map +1 -1
  64. package/dist/features/lists.js +16 -7
  65. package/dist/features/lists.js.map +1 -1
  66. package/dist/features/markdown.d.ts.map +1 -1
  67. package/dist/features/markdown.js +7 -1
  68. package/dist/features/markdown.js.map +1 -1
  69. package/dist/features/marks.d.ts.map +1 -1
  70. package/dist/features/marks.js +23 -11
  71. package/dist/features/marks.js.map +1 -1
  72. package/dist/features/script.d.ts.map +1 -1
  73. package/dist/features/script.js +5 -2
  74. package/dist/features/script.js.map +1 -1
  75. package/dist/features/search.d.ts +5 -2
  76. package/dist/features/search.d.ts.map +1 -1
  77. package/dist/features/search.js +55 -13
  78. package/dist/features/search.js.map +1 -1
  79. package/dist/features/table.d.ts.map +1 -1
  80. package/dist/features/table.js +24 -4
  81. package/dist/features/table.js.map +1 -1
  82. package/dist/features/task-list.d.ts.map +1 -1
  83. package/dist/features/task-list.js +23 -3
  84. package/dist/features/task-list.js.map +1 -1
  85. package/dist/history.d.ts.map +1 -1
  86. package/dist/history.js +45 -6
  87. package/dist/history.js.map +1 -1
  88. package/dist/index.d.ts +4 -2
  89. package/dist/index.d.ts.map +1 -1
  90. package/dist/index.js +4 -2
  91. package/dist/index.js.map +1 -1
  92. package/dist/parse/html.d.ts.map +1 -1
  93. package/dist/parse/html.js +22 -9
  94. package/dist/parse/html.js.map +1 -1
  95. package/dist/parse/sanitize.d.ts +6 -0
  96. package/dist/parse/sanitize.d.ts.map +1 -1
  97. package/dist/parse/sanitize.js +39 -3
  98. package/dist/parse/sanitize.js.map +1 -1
  99. package/dist/presets/markdown-parse.d.ts.map +1 -1
  100. package/dist/presets/markdown-parse.js +29 -8
  101. package/dist/presets/markdown-parse.js.map +1 -1
  102. package/dist/presets/markdown.d.ts +2 -1
  103. package/dist/presets/markdown.d.ts.map +1 -1
  104. package/dist/presets/markdown.js +23 -7
  105. package/dist/presets/markdown.js.map +1 -1
  106. package/dist/state/apply.d.ts +1 -1
  107. package/dist/state/apply.d.ts.map +1 -1
  108. package/dist/state/apply.js +34 -8
  109. package/dist/state/apply.js.map +1 -1
  110. package/dist/state/delete-ops.js +12 -0
  111. package/dist/state/delete-ops.js.map +1 -1
  112. package/dist/state/insert-ops.d.ts +5 -2
  113. package/dist/state/insert-ops.d.ts.map +1 -1
  114. package/dist/state/insert-ops.js +7 -5
  115. package/dist/state/insert-ops.js.map +1 -1
  116. package/dist/state/list-ops.d.ts.map +1 -1
  117. package/dist/state/list-ops.js +13 -6
  118. package/dist/state/list-ops.js.map +1 -1
  119. package/dist/state/resolve-insert.d.ts.map +1 -1
  120. package/dist/state/resolve-insert.js +9 -2
  121. package/dist/state/resolve-insert.js.map +1 -1
  122. package/dist/state/slice-ops.js +11 -1
  123. package/dist/state/slice-ops.js.map +1 -1
  124. package/dist/state/state.d.ts.map +1 -1
  125. package/dist/state/state.js +23 -8
  126. package/dist/state/state.js.map +1 -1
  127. package/dist/state/transaction.d.ts +6 -3
  128. package/dist/state/transaction.d.ts.map +1 -1
  129. package/dist/state/transaction.js +6 -1
  130. package/dist/state/transaction.js.map +1 -1
  131. package/dist/styles.css +253 -196
  132. package/dist/theme.d.ts +29 -0
  133. package/dist/theme.d.ts.map +1 -0
  134. package/dist/theme.js +347 -0
  135. package/dist/theme.js.map +1 -0
  136. package/dist/view/decoration.d.ts.map +1 -1
  137. package/dist/view/decoration.js +58 -35
  138. package/dist/view/decoration.js.map +1 -1
  139. package/dist/view/hook-ctx.d.ts.map +1 -1
  140. package/dist/view/hook-ctx.js +30 -9
  141. package/dist/view/hook-ctx.js.map +1 -1
  142. package/dist/view/ime.d.ts.map +1 -1
  143. package/dist/view/ime.js +6 -3
  144. package/dist/view/ime.js.map +1 -1
  145. package/dist/view/input.d.ts.map +1 -1
  146. package/dist/view/input.js +113 -11
  147. package/dist/view/input.js.map +1 -1
  148. package/dist/view/render.d.ts.map +1 -1
  149. package/dist/view/render.js +40 -3
  150. package/dist/view/render.js.map +1 -1
  151. package/package.json +1 -1
@@ -1,8 +1,8 @@
1
- import { nodeAt } from "../model/traverse.js";
2
- import { leafPoint } from "../state/apply.js";
1
+ import { expandTextNodes, nodeAt } from "../model/traverse.js";
2
+ import { coveredOffsets, leafPoint } from "../state/apply.js";
3
3
  import { normalizedRange, pointEq } from "../state/selection.js";
4
4
  import { defineFeature } from "./feature.js";
5
- import { rangeHasMark } from "../commands.js";
5
+ import { caretMarks } from "../commands.js";
6
6
  /**
7
7
  * 인라인 스타일 — 글자색·형광펜·글자 크기 마크와 서식 지우기.
8
8
  * attrs를 가지는 마크라 setMarkAttr로 값을 싣고 같은 값이면 해제한다.
@@ -17,7 +17,8 @@ export function setMarkAttr(markType, attrs) {
17
17
  const clear = (m) => m.type === markType &&
18
18
  Object.entries(attrs).every(([k, v]) => m.attrs?.[k] === v);
19
19
  if (pointEq(range.anchor, range.focus)) {
20
- const cur = state.storedMarks ?? [];
20
+ // 실효 마크 기준 — storedMarks가 없으면 캐럿 아래 텍스트 마크
21
+ const cur = caretMarks(state);
21
22
  tr.setStoredMarks(cur.some(clear)
22
23
  ? cur.filter((m) => m.type !== markType)
23
24
  : [
@@ -26,9 +27,22 @@ export function setMarkAttr(markType, attrs) {
26
27
  ]);
27
28
  }
28
29
  else {
30
+ // "같은 값이 이미 전 범위에 걸려 있으면"만 해제 — 다른 값(구 색)이
31
+ // 섞여 있으면 remove만 하고 끝나 서식이 날아간다. 값이 다르면
32
+ // 새 값으로 덮어써야 토글이 아니라 재지정이 된다
33
+ let allSame = true;
34
+ let any = false;
35
+ expandTextNodes(state.doc, [], (node, path) => {
36
+ if (!coveredOffsets(node, path, range))
37
+ return [node];
38
+ any = true;
39
+ const m = (node.marks ?? []).find((x) => x.type === markType);
40
+ if (!m || !clear(m))
41
+ allSame = false;
42
+ return [node];
43
+ });
29
44
  tr.removeMark(range, markType);
30
- const covered = rangeHasMark(state.doc, range, markType);
31
- if (!covered)
45
+ if (!any || !allSame)
32
46
  tr.addMark(range, { type: markType, attrs });
33
47
  }
34
48
  dispatch();
@@ -1 +1 @@
1
- {"version":3,"file":"inline-style.js","sourceRoot":"","sources":["../../src/features/inline-style.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"inline-style.js","sourceRoot":"","sources":["../../src/features/inline-style.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/features/link.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAKtD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD;;;;GAIG;AAEH;;;GAGG;AACH,eAAO,MAAM,OAAO,EAAE,OAkBrB,CAAC;AAEF,mDAAmD;AACnD,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,CAkB5D;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,WAAW,GACjB;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAiCrD;AAED,kDAAkD;AAClD,eAAO,MAAM,SAAS,EAAE,OAcvB,CAAC;AAEF,eAAO,MAAM,WAAW,gCAmFtB,CAAC"}
1
+ {"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/features/link.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAKtD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAKrD;;;;GAIG;AAEH;;;GAGG;AACH,eAAO,MAAM,OAAO,EAAE,OAuBrB,CAAC;AAEF,mDAAmD;AACnD,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,CAkB5D;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,WAAW,GACjB;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAiCrD;AAED,kDAAkD;AAClD,eAAO,MAAM,SAAS,EAAE,OAcvB,CAAC;AAEF,eAAO,MAAM,WAAW,gCA4FtB,CAAC"}
@@ -2,7 +2,8 @@ import { expandTextNodes, nodeAt } from "../model/traverse.js";
2
2
  import { coveredOffsets } from "../state/apply.js";
3
3
  import { normalizedRange, pointEq, textSelection } from "../state/selection.js";
4
4
  import { defineFeature } from "./feature.js";
5
- import { samePath } from "../commands.js";
5
+ import { caretMarks, pointBlockPath, samePath } from "../commands.js";
6
+ import { isSafeUrl } from "../parse/sanitize.js";
6
7
  /**
7
8
  * 링크 — href attrs 마크 + setLink/unsetLink + `[텍스트](url)` 입력
8
9
  * 규칙 + Mod-k. 캐럿이 앉은 링크의 href·범위 조회 헬퍼를 함께 둔다
@@ -21,10 +22,16 @@ export const setLink = ({ state, tr, dispatch }, href) => {
21
22
  : (globalThis.prompt?.("링크 URL") ?? null);
22
23
  if (!url)
23
24
  return false;
25
+ // sanitizer는 붙여넣기만 지킨다 — 커맨드로 만든 javascript: 링크는
26
+ // <a href>에 그대로 출력되므로 여기서도 같은 검사를 한다
27
+ if (!isSafeUrl(url))
28
+ return false;
24
29
  const mark = { type: "link", attrs: { href: url } };
25
30
  const range = normalizedRange(sel);
26
31
  if (pointEq(range.anchor, range.focus)) {
27
- const cur = (state.storedMarks ?? []).filter((m) => m.type !== "link");
32
+ // 실효 마크를 유지하며 link만 추가/교체 — 볼드 텍스트 안에서 링크를
33
+ // 걸면 타이핑이 볼드를 잃는다 (storedMarks가 리프 마크를 덮어쓰므로)
34
+ const cur = caretMarks(state).filter((m) => m.type !== "link");
28
35
  tr.setStoredMarks([...cur, mark]);
29
36
  }
30
37
  else {
@@ -159,7 +166,13 @@ export const linkFeature = defineFeature({
159
166
  return false;
160
167
  if (pointEq(ctx.anchor, ctx.focus))
161
168
  return false;
162
- const bspec = ctx.state.schema.nodeSpec(nodeAt(ctx.state.doc, ctx.anchor.path.slice(0, -1))?.type ?? "");
169
+ // 경계 포인트 캐럿도 안쪽 블록으로 해석 — 빈 코드블록의
170
+ // {path:블록,offset:0}에서 slice(0,-1)은 doc을 보게 돼 코드
171
+ // 판정을 놓치고 link 마크가 코드 안에 들어간다
172
+ const bp = pointBlockPath(ctx.state.doc, ctx.state.schema, ctx.anchor);
173
+ const bspec = bp
174
+ ? ctx.state.schema.nodeSpec(nodeAt(ctx.state.doc, bp)?.type ?? "")
175
+ : undefined;
163
176
  if (bspec?.code)
164
177
  return false;
165
178
  ctx.tr.addMark({ anchor: ctx.anchor, focus: ctx.focus }, { type: "link", attrs: { href: url } });
@@ -175,7 +188,7 @@ export const linkFeature = defineFeature({
175
188
  handler: ({ tr }, m, range) => {
176
189
  const inner = m[1] ?? "";
177
190
  const href = m[2] ?? "";
178
- if (!inner || !href)
191
+ if (!inner || !href || !isSafeUrl(href))
179
192
  return false;
180
193
  const { anchor: a, focus: f } = range;
181
194
  if (!samePath(a.path, f.path))
@@ -186,9 +199,13 @@ export const linkFeature = defineFeature({
186
199
  anchor: { path: a.path, offset: a.offset },
187
200
  focus: { path: a.path, offset: a.offset + inner.length },
188
201
  }, { type: "link", attrs: { href } });
202
+ // addMark가 텍스트 노드를 [head, marked, tail?]로 분할한다 —
203
+ // a.offset>0이면 marked는 다음 형제라 캐럿을 거기로 둬야 한다
204
+ // (markRule과 같은 규약 — 원본 경로+오프셋은 head를 넘어선다)
205
+ const ti = a.path[a.path.length - 1];
189
206
  tr.setSelection(textSelection({
190
- path: a.path,
191
- offset: a.offset + inner.length,
207
+ path: a.offset > 0 ? [...a.path.slice(0, -1), ti + 1] : a.path,
208
+ offset: inner.length,
192
209
  }));
193
210
  return true;
194
211
  },
@@ -1 +1 @@
1
- {"version":3,"file":"link.js","sourceRoot":"","sources":["../../src/features/link.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"link.js","sourceRoot":"","sources":["../../src/features/link.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"lists.d.ts","sourceRoot":"","sources":["../../src/features/lists.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAqBtD;;;GAGG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,YAAY,GAAG,aAAa,GAAG,UAAU,GAC9C,OAAO,CA4CT;AAED,6CAA6C;AAC7C,eAAO,MAAM,YAAY,EAAE,OAQ1B,CAAC;AAEF,sDAAsD;AACtD,eAAO,MAAM,YAAY,EAAE,OAM1B,CAAC;AAEF,yDAAyD;AACzD,eAAO,MAAM,mBAAmB,EAAE,OAgBjC,CAAC;AAEF,eAAO,MAAM,YAAY,gCAuEvB,CAAC"}
1
+ {"version":3,"file":"lists.d.ts","sourceRoot":"","sources":["../../src/features/lists.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAqBtD;;;GAGG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,YAAY,GAAG,aAAa,GAAG,UAAU,GAC9C,OAAO,CAmDT;AAED,6CAA6C;AAC7C,eAAO,MAAM,YAAY,EAAE,OAQ1B,CAAC;AAEF,sDAAsD;AACtD,eAAO,MAAM,YAAY,EAAE,OAM1B,CAAC;AAEF,yDAAyD;AACzD,eAAO,MAAM,mBAAmB,EAAE,OAgBjC,CAAC;AAEF,eAAO,MAAM,YAAY,gCAuEvB,CAAC"}
@@ -53,13 +53,22 @@ export function toggleList(type) {
53
53
  type,
54
54
  content: [{ type: itemType, content: [block] }],
55
55
  });
56
- const tIdx = nodeAt(state.doc, sel.anchor.path)?.type === "text"
57
- ? sel.anchor.path[sel.anchor.path.length - 1]
58
- : 0;
59
- tr.setSelection(textSelection({
60
- path: [...blockPath, 0, 0, tIdx],
61
- offset: sel.anchor.offset,
62
- }));
56
+ // 앵커가 텍스트 리프면 블록+li 두 단계 내려 같은 자식/오프셋을
57
+ // 따라간다. 컨테이너 경계 포인트(빈 문단의 {path:block,offset:0}
58
+ // 관례)는 경계 포인트로 유지한다 — [...blockPath,0,0,0]은 빈
59
+ // 문단에 없는 text 자식 인덱스를 가리키는 무효 경로다
60
+ const sel2 = nodeAt(state.doc, sel.anchor.path)?.type === "text"
61
+ ? {
62
+ path: [
63
+ ...blockPath,
64
+ 0,
65
+ 0,
66
+ sel.anchor.path[sel.anchor.path.length - 1],
67
+ ],
68
+ offset: sel.anchor.offset,
69
+ }
70
+ : { path: [...blockPath, 0, 0], offset: sel.anchor.offset };
71
+ tr.setSelection(textSelection(sel2));
63
72
  dispatch();
64
73
  return true;
65
74
  };
@@ -1 +1 @@
1
- {"version":3,"file":"lists.js","sourceRoot":"","sources":["../../src/features/lists.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lists.js","sourceRoot":"","sources":["../../src/features/lists.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/features/markdown.ts"],"names":[],"mappings":"AAoBA;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,eAAe,gCAmD1B,CAAC"}
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/features/markdown.ts"],"names":[],"mappings":"AAqBA;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,eAAe,gCAsD1B,CAAC"}
@@ -2,6 +2,7 @@ import { nodeAt } from "../model/traverse.js";
2
2
  import { parseMarkdown } from "../presets/markdown-parse.js";
3
3
  import { point, pointEq } from "../state/selection.js";
4
4
  import { defineFeature } from "./feature.js";
5
+ import { pointBlockPath } from "../commands.js";
5
6
  /**
6
7
  * 붙여넣기 텍스트가 마크다운으로 보이는가 — 블록 마커나 명확한
7
8
  * 인라인 구분자가 하나라도 있어야 변환을 시도한다.
@@ -55,7 +56,12 @@ export const markdownFeature = defineFeature({
55
56
  insertFromPaste(ctx, data) {
56
57
  if (data.html || !hasMarkdownSignal(data.text))
57
58
  return false;
58
- const bspec = ctx.state.schema.nodeSpec(nodeAt(ctx.state.doc, ctx.anchor.path.slice(0, -1))?.type ?? "");
59
+ // 경계 포인트 캐럿도 안쪽 블록으로 해석 — 빈 코드블록에서
60
+ // slice(0,-1)은 doc을 봐서 코드 판정을 놓친다
61
+ const bp = pointBlockPath(ctx.state.doc, ctx.state.schema, ctx.anchor);
62
+ const bspec = bp
63
+ ? ctx.state.schema.nodeSpec(nodeAt(ctx.state.doc, bp)?.type ?? "")
64
+ : undefined;
59
65
  if (bspec?.code)
60
66
  return false;
61
67
  const nodes = parseMarkdown(data.text);
@@ -1 +1 @@
1
- {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/features/markdown.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/features/markdown.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"marks.d.ts","sourceRoot":"","sources":["../../src/features/marks.ts"],"names":[],"mappings":"AAmDA;;;GAGG;AACH,eAAO,MAAM,YAAY,gCAyFvB,CAAC"}
1
+ {"version":3,"file":"marks.d.ts","sourceRoot":"","sources":["../../src/features/marks.ts"],"names":[],"mappings":"AA+DA;;;GAGG;AACH,eAAO,MAAM,YAAY,gCAyFvB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { defineFeature } from "./feature.js";
2
+ import { REMOTE_META } from "../collab.js";
2
3
  import { CODE_CHIP, markRule, toggleCodeMark, toggleMark, } from "../commands.js";
3
4
  import { expandTextNodes } from "../model/traverse.js";
4
5
  import { normalizedRange, pointCmp, pointEq } from "../state/selection.js";
@@ -10,10 +11,17 @@ import { normalizedRange, pointCmp, pointEq } from "../state/selection.js";
10
11
  */
11
12
  const codeChipCleanup = {
12
13
  key: "codeChip",
13
- appendTransaction(_tr, _prev, state) {
14
- if (state.selection.type !== "text")
14
+ appendTransaction(tr, _prev, state) {
15
+ // 원격 tr에 로컬 후속을 얹으면 그 삭제가 "로컬 편집"으로
16
+ // 재송신돼 원격 피어의 칩 처리와 어긋난다 — 원격이 넣은 칩은
17
+ // 원격 피어가 자기 규칙으로 정리한다
18
+ if (tr.meta[REMOTE_META])
15
19
  return null;
16
- const sel = normalizedRange(state.selection);
20
+ const sel = state.selection;
21
+ // 칩은 텍스트 범위 셀렉션으로만 살아있을 수 있다 — 노드 선택
22
+ // (atom 클릭) 상태에서 나간 칩을 남기면 `</>` 자리표시자가
23
+ // 지워지지 않는 상태로 문서에 남는다
24
+ const range = sel.type === "text" ? normalizedRange(sel) : null;
17
25
  const dead = [];
18
26
  expandTextNodes(state.doc, [], (node, path) => {
19
27
  if (node.text !== CODE_CHIP)
@@ -21,27 +29,31 @@ const codeChipCleanup = {
21
29
  const a = { path, offset: 0 };
22
30
  const f = { path, offset: 1 };
23
31
  // 칩 [a,f) 전체를 덮는 범위 선택이면 살아있는 칩 — 그 외(밖
24
- // 캐럿·부분 덮개)는 버려진 칩
25
- const covered = pointCmp(sel.anchor, a) <= 0 &&
26
- pointCmp(f, sel.focus) <= 0 &&
27
- !pointEq(sel.anchor, sel.focus);
32
+ // 캐럿·부분 덮개·노드 선택)는 버려진 칩
33
+ const covered = range !== null &&
34
+ pointCmp(range.anchor, a) <= 0 &&
35
+ pointCmp(f, range.focus) <= 0 &&
36
+ !pointEq(range.anchor, range.focus);
28
37
  if (!covered)
29
38
  dead.push([...path]);
30
39
  return [node];
31
40
  });
32
41
  if (!dead.length)
33
42
  return null;
34
- const tr = state.tr();
35
- for (const path of dead) {
43
+ const follow = state.tr();
44
+ // 스텝 좌표는 누적 적용 기준 — 앞 칩을 지우면 뒤 칩의 경로가
45
+ // 앞당겨진다. 문서 역순으로 지워야 아직 안 지운 경로가 유효하다
46
+ for (let i = dead.length - 1; i >= 0; i--) {
47
+ const path = dead[i];
36
48
  // 글자가 아니라 노드 통째로 — 빈 텍스트 노드가 남지 않게
37
49
  const parent = path.slice(0, -1);
38
50
  const idx = path[path.length - 1];
39
- tr.delete({
51
+ follow.delete({
40
52
  anchor: { path: parent, offset: idx },
41
53
  focus: { path: parent, offset: idx + 1 },
42
54
  });
43
55
  }
44
- return tr;
56
+ return follow;
45
57
  },
46
58
  };
47
59
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"marks.js","sourceRoot":"","sources":["../../src/features/marks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"marks.js","sourceRoot":"","sources":["../../src/features/marks.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"script.d.ts","sourceRoot":"","sources":["../../src/features/script.ts"],"names":[],"mappings":"AAmCA,eAAO,MAAM,aAAa,gCAqBxB,CAAC"}
1
+ {"version":3,"file":"script.d.ts","sourceRoot":"","sources":["../../src/features/script.ts"],"names":[],"mappings":"AAsCA,eAAO,MAAM,aAAa,gCAqBxB,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { normalizedRange, pointEq } from "../state/selection.js";
2
2
  import { defineFeature } from "./feature.js";
3
- import { rangeHasMark } from "../commands.js";
3
+ import { caretMarks, rangeHasMark } from "../commands.js";
4
4
  /**
5
5
  * 위/아래 첨자 — subscript·superscript 마크.
6
6
  * 둘은 상호 배타적 — 한쪽을 켜면 다른 쪽은 벗긴다.
@@ -13,7 +13,10 @@ function toggleExclusive(markType, other) {
13
13
  return false;
14
14
  const range = normalizedRange(sel);
15
15
  if (pointEq(range.anchor, range.focus)) {
16
- const cur = (state.storedMarks ?? []).filter((m) => m.type !== other);
16
+ // 실효 마크 기준 — storedMarks가 없으면 캐럿 아래 텍스트의
17
+ // 마크를 본다. 리프를 무시하면 마크된 텍스트 안에서 토글이
18
+ // 반전된다 (sup 텍스트 안에서 Mod-. → sup 유지)
19
+ const cur = caretMarks(state).filter((m) => m.type !== other);
17
20
  const has = cur.some((m) => m.type === markType);
18
21
  tr.setStoredMarks(has
19
22
  ? cur.filter((m) => m.type !== markType)
@@ -1 +1 @@
1
- {"version":3,"file":"script.js","sourceRoot":"","sources":["../../src/features/script.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C;;;GAGG;AAEH,2CAA2C;AAC3C,SAAS,eAAe,CAAC,QAAgB,EAAE,KAAa;IACtD,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACjC,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC;QAC5B,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,KAAK,CAAC;QACtC,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YACvC,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;YACtE,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YACjD,EAAE,CAAC,cAAc,CACf,GAAG;gBACD,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;gBACxC,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CACjC,CAAC;QACJ,CAAC;aAAM,IAAI,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;YACpD,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC5B,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QACxC,CAAC;QACD,QAAQ,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAAC;IACzC,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,6CAA6C;IAC1D,KAAK,EAAE;QACL,SAAS,EAAE;YACT,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;YAC7B,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;SAC3B;QACD,WAAW,EAAE;YACX,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;YAC7B,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;SAC3B;KACF;IACD,QAAQ,EAAE;QACR,eAAe,EAAE,eAAe,CAAC,WAAW,EAAE,aAAa,CAAC;QAC5D,iBAAiB,EAAE,eAAe,CAAC,aAAa,EAAE,WAAW,CAAC;KAC/D;IACD,MAAM,EAAE;QACN,OAAO,EAAE,eAAe,CAAC,aAAa,EAAE,WAAW,CAAC;QACpD,OAAO,EAAE,eAAe,CAAC,WAAW,EAAE,aAAa,CAAC;KACrD;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"script.js","sourceRoot":"","sources":["../../src/features/script.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE1D;;;GAGG;AAEH,2CAA2C;AAC3C,SAAS,eAAe,CAAC,QAAgB,EAAE,KAAa;IACtD,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACjC,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC;QAC5B,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,KAAK,CAAC;QACtC,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YACvC,yCAAyC;YACzC,mCAAmC;YACnC,oCAAoC;YACpC,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;YAC9D,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YACjD,EAAE,CAAC,cAAc,CACf,GAAG;gBACD,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;gBACxC,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CACjC,CAAC;QACJ,CAAC;aAAM,IAAI,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;YACpD,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC5B,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QACxC,CAAC;QACD,QAAQ,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAAC;IACzC,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,6CAA6C;IAC1D,KAAK,EAAE;QACL,SAAS,EAAE;YACT,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;YAC7B,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;SAC3B;QACD,WAAW,EAAE;YACX,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;YAC7B,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;SAC3B;KACF;IACD,QAAQ,EAAE;QACR,eAAe,EAAE,eAAe,CAAC,WAAW,EAAE,aAAa,CAAC;QAC5D,iBAAiB,EAAE,eAAe,CAAC,aAAa,EAAE,WAAW,CAAC;KAC/D;IACD,MAAM,EAAE;QACN,OAAO,EAAE,eAAe,CAAC,aAAa,EAAE,WAAW,CAAC;QACpD,OAAO,EAAE,eAAe,CAAC,WAAW,EAAE,aAAa,CAAC;KACrD;CACF,CAAC,CAAC"}
@@ -47,8 +47,11 @@ export declare function searchStateOf(state: {
47
47
  */
48
48
  export declare function collectMatches(doc: EditorNode, query: string, caseSensitive?: boolean): SearchMatch[];
49
49
  /**
50
- * 검색어 설정 — 쿼리를 등록하고 캐럿 이후 첫 매치(없으면 첫 매치로
51
- * 랩)를 선택한다. 빈 문자열은 검색 해제와 같다.
50
+ * 검색어 설정 — 쿼리를 등록하고 매치를 수집해 하이라이트한다.
51
+ * 셀렉션은 움직이지 않는다 — 입력창에 타이핑하는 동안 캐럿이
52
+ * 튀지 않도록 매치로의 이동은 findNext/findPrev의 몫이다.
53
+ * active에는 캐럿 이후 첫 매치 인덱스를 두어 n/total 카운터와
54
+ * 첫 내비게이션의 도착점으로 쓴다. 빈 문자열은 검색 해제와 같다.
52
55
  * UI(검색 입력창)가 호출하는 진입점.
53
56
  */
54
57
  export declare const setSearch: Command;
@@ -1 +1 @@
1
- {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/features/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAU,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAMnD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAKnD;;;;;;;;;;;;;;;;;GAiBG;AAEH,2CAA2C;AAC3C,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,KAAK,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;CACd;AAED,qCAAqC;AACrC,MAAM,WAAW,WAAW;IAC1B,8BAA8B;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,iBAAiB;IACjB,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,wBAAwB;IACxB,QAAQ,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC;IACzC,6BAA6B;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,8CAA8C;AAC9C,eAAO,MAAM,UAAU,WAAW,CAAC;AASnC,kDAAkD;AAClD,wBAAgB,aAAa,CAAC,KAAK,EAAE;IACnC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAChD,GAAG,WAAW,CAEd;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,MAAM,EACb,aAAa,UAAQ,GACpB,WAAW,EAAE,CAsBf;AAED;;;;GAIG;AACH,eAAO,MAAM,SAAS,EAAE,OA8BvB,CAAC;AAkBF,eAAO,MAAM,QAAQ,EAAE,OAAqB,CAAC;AAC7C,eAAO,MAAM,QAAQ,EAAE,OAAsB,CAAC;AAE9C;;;;;GAKG;AACH,eAAO,MAAM,WAAW,EAAE,OAiBzB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,OAoBxB,CAAC;AAEF,kCAAkC;AAClC,eAAO,MAAM,WAAW,EAAE,OAIzB,CAAC;AA+EF,eAAO,MAAM,aAAa,gCAmBxB,CAAC"}
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/features/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAU,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAOnD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAKnD;;;;;;;;;;;;;;;;;GAiBG;AAEH,2CAA2C;AAC3C,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,KAAK,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;CACd;AAED,qCAAqC;AACrC,MAAM,WAAW,WAAW;IAC1B,8BAA8B;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,iBAAiB;IACjB,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,wBAAwB;IACxB,QAAQ,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC;IACzC,6BAA6B;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,8CAA8C;AAC9C,eAAO,MAAM,UAAU,WAAW,CAAC;AASnC,kDAAkD;AAClD,wBAAgB,aAAa,CAAC,KAAK,EAAE;IACnC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAChD,GAAG,WAAW,CAEd;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,MAAM,EACb,aAAa,UAAQ,GACpB,WAAW,EAAE,CAsBf;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,EAAE,OAwBvB,CAAC;AA6CF,eAAO,MAAM,QAAQ,EAAE,OAAqB,CAAC;AAC7C,eAAO,MAAM,QAAQ,EAAE,OAAsB,CAAC;AAE9C;;;;;GAKG;AACH,eAAO,MAAM,WAAW,EAAE,OAiBzB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,OAoBxB,CAAC;AAEF,kCAAkC;AAClC,eAAO,MAAM,WAAW,EAAE,OAIzB,CAAC;AA4FF,eAAO,MAAM,aAAa,gCA4BxB,CAAC"}
@@ -1,4 +1,4 @@
1
- import { normalizedRange, pointCmp, textSelection, } from "../state/selection.js";
1
+ import { normalizedRange, pointCmp, pointEq, textSelection, } from "../state/selection.js";
2
2
  import { pointToDOM } from "../view/dom.js";
3
3
  import { defineFeature } from "./feature.js";
4
4
  /** 플러그인 키 — tr.meta와 pluginState 양쪽의 채널 이름 */
@@ -42,8 +42,11 @@ export function collectMatches(doc, query, caseSensitive = false) {
42
42
  return out;
43
43
  }
44
44
  /**
45
- * 검색어 설정 — 쿼리를 등록하고 캐럿 이후 첫 매치(없으면 첫 매치로
46
- * 랩)를 선택한다. 빈 문자열은 검색 해제와 같다.
45
+ * 검색어 설정 — 쿼리를 등록하고 매치를 수집해 하이라이트한다.
46
+ * 셀렉션은 움직이지 않는다 — 입력창에 타이핑하는 동안 캐럿이
47
+ * 튀지 않도록 매치로의 이동은 findNext/findPrev의 몫이다.
48
+ * active에는 캐럿 이후 첫 매치 인덱스를 두어 n/total 카운터와
49
+ * 첫 내비게이션의 도착점으로 쓴다. 빈 문자열은 검색 해제와 같다.
47
50
  * UI(검색 입력창)가 호출하는 진입점.
48
51
  */
49
52
  export const setSearch = ({ state, tr, dispatch }, query, caseSensitive) => {
@@ -64,26 +67,46 @@ export const setSearch = ({ state, tr, dispatch }, query, caseSensitive) => {
64
67
  : 0;
65
68
  if (idx === -1)
66
69
  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
- }
70
+ meta["active"] = idx;
75
71
  }
76
72
  tr.setMeta(SEARCH_KEY, meta);
77
73
  dispatch();
78
74
  return true;
79
75
  };
80
- /** 다음/이전 매치로 이동 — active를 순환시키고 해당 매치를 선택한다 */
76
+ /**
77
+ * 다음/이전 매치로 이동 — 셀렉션이 이미 active 매치 위에 있으면
78
+ * 순환하고, 아직 아무 매치로도 가지 않은 상태면 캐럿 기준
79
+ * 이후(또는 이전) 매치로 간다. 이동할 때만 매치를 선택한다.
80
+ */
81
81
  const findStep = (dir) => ({ state, tr, dispatch }) => {
82
82
  const st = searchStateOf(state);
83
83
  const n = st.matches.length;
84
84
  if (!st.query || !n)
85
85
  return false;
86
- const next = st.active >= 0 ? (st.active + dir + n) % n : dir === 1 ? 0 : n - 1;
86
+ const sel = state.selection;
87
+ const cur = st.active >= 0 ? st.matches[st.active] : undefined;
88
+ const onActive = !!cur &&
89
+ sel.type === "text" &&
90
+ pointEq(sel.anchor, cur.anchor) &&
91
+ pointEq(sel.focus, cur.focus);
92
+ let next;
93
+ if (onActive) {
94
+ next = (st.active + dir + n) % n;
95
+ }
96
+ else {
97
+ const caret = sel.type === "text" ? normalizedRange(sel).focus : null;
98
+ const i = caret
99
+ ? st.matches.findIndex((m) => pointCmp(m.focus, caret) > 0)
100
+ : -1;
101
+ next =
102
+ dir === 1
103
+ ? i === -1
104
+ ? 0
105
+ : i
106
+ : i === -1
107
+ ? n - 1
108
+ : (i - 1 + n) % n;
109
+ }
87
110
  const m = st.matches[next];
88
111
  tr.setSelection(textSelection(m.anchor, m.focus));
89
112
  tr.setMeta(SEARCH_KEY, { active: next });
@@ -229,6 +252,18 @@ function paintSearchHighlights(el, st) {
229
252
  reg.set("me-find-active", new H(...act));
230
253
  else
231
254
  reg.delete("me-find-active");
255
+ // 찾기 바에 포커스가 있는 동안엔 DOM 셀렉션이 갱신되지 않으므로
256
+ // active 매치를 스크롤로 따라간다 (Chrome 찾기 관례) — nearest라
257
+ // 이미 보이면 아무 동작도 하지 않는다. 단 포커스가 에디터 안일 때는
258
+ // 스크롤하지 않는다 — paintOverlay는 매 커밋·selectionchange마다
259
+ // 도는데 무조건 스크롤하면 타이핑/스크롤 중에 위치를 계속 뺏긴다
260
+ const ae = el.ownerDocument.activeElement;
261
+ const outsideFocus = !!ae && ae !== el.ownerDocument.body && !el.contains(ae);
262
+ if (outsideFocus) {
263
+ const c = act[0]?.startContainer;
264
+ const target = c && (c.nodeType === 1 ? c : c.parentElement);
265
+ target?.scrollIntoView({ block: "nearest", inline: "nearest" });
266
+ }
232
267
  }
233
268
  export const searchFeature = defineFeature({
234
269
  name: "search",
@@ -247,6 +282,13 @@ export const searchFeature = defineFeature({
247
282
  paintOverlay(el, state) {
248
283
  paintSearchHighlights(el, searchStateOf(state));
249
284
  },
285
+ destroyOverlay(el) {
286
+ // 등록한 ::highlight를 지운다 — 안 지우면 CSS.highlights가
287
+ // 분리된 DOM의 Range를 붙잡아 에디터 언마운트 후에도 누수된다
288
+ const reg = el.ownerDocument.defaultView?.CSS?.highlights;
289
+ reg?.delete("me-find");
290
+ reg?.delete("me-find-active");
291
+ },
250
292
  },
251
293
  });
252
294
  //# sourceMappingURL=search.js.map