@moda-editor/core 0.2.3 → 0.3.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 (99) hide show
  1. package/dist/collab.d.ts.map +1 -1
  2. package/dist/collab.js +14 -18
  3. package/dist/collab.js.map +1 -1
  4. package/dist/commands.d.ts.map +1 -1
  5. package/dist/commands.js +24 -4
  6. package/dist/commands.js.map +1 -1
  7. package/dist/conformance/editor-base.d.ts.map +1 -1
  8. package/dist/conformance/editor-base.js +57 -0
  9. package/dist/conformance/editor-base.js.map +1 -1
  10. package/dist/conformance/editor-ime.d.ts.map +1 -1
  11. package/dist/conformance/editor-ime.js +78 -0
  12. package/dist/conformance/editor-ime.js.map +1 -1
  13. package/dist/conformance/fixtures.d.ts +2 -2
  14. package/dist/conformance/fixtures.d.ts.map +1 -1
  15. package/dist/conformance/fixtures.js +6 -2
  16. package/dist/conformance/fixtures.js.map +1 -1
  17. package/dist/editor/dev.d.ts +7 -0
  18. package/dist/editor/dev.d.ts.map +1 -0
  19. package/dist/editor/dev.js +9 -0
  20. package/dist/editor/dev.js.map +1 -0
  21. package/dist/editor/editor.d.ts +120 -3
  22. package/dist/editor/editor.d.ts.map +1 -1
  23. package/dist/editor/editor.js +133 -27
  24. package/dist/editor/editor.js.map +1 -1
  25. package/dist/features/block-dnd.d.ts.map +1 -1
  26. package/dist/features/block-dnd.js +4 -1
  27. package/dist/features/block-dnd.js.map +1 -1
  28. package/dist/features/code-block.d.ts.map +1 -1
  29. package/dist/features/code-block.js +17 -12
  30. package/dist/features/code-block.js.map +1 -1
  31. package/dist/features/image.d.ts.map +1 -1
  32. package/dist/features/image.js +3 -1
  33. package/dist/features/image.js.map +1 -1
  34. package/dist/features/markdown.d.ts.map +1 -1
  35. package/dist/features/markdown.js +4 -9
  36. package/dist/features/markdown.js.map +1 -1
  37. package/dist/features/search.d.ts.map +1 -1
  38. package/dist/features/search.js +9 -19
  39. package/dist/features/search.js.map +1 -1
  40. package/dist/features/table.d.ts.map +1 -1
  41. package/dist/features/table.js +3 -1
  42. package/dist/features/table.js.map +1 -1
  43. package/dist/history.d.ts.map +1 -1
  44. package/dist/history.js +3 -0
  45. package/dist/history.js.map +1 -1
  46. package/dist/index.d.ts +10 -8
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +6 -6
  49. package/dist/index.js.map +1 -1
  50. package/dist/model/node.d.ts +14 -0
  51. package/dist/model/node.d.ts.map +1 -1
  52. package/dist/model/node.js +67 -0
  53. package/dist/model/node.js.map +1 -1
  54. package/dist/model/schema.d.ts +8 -1
  55. package/dist/model/schema.d.ts.map +1 -1
  56. package/dist/model/schema.js +29 -0
  57. package/dist/model/schema.js.map +1 -1
  58. package/dist/model/traverse.d.ts +4 -0
  59. package/dist/model/traverse.d.ts.map +1 -1
  60. package/dist/model/traverse.js +10 -0
  61. package/dist/model/traverse.js.map +1 -1
  62. package/dist/presets/starter.d.ts +13 -0
  63. package/dist/presets/starter.d.ts.map +1 -1
  64. package/dist/presets/starter.js +9 -1
  65. package/dist/presets/starter.js.map +1 -1
  66. package/dist/state/apply.d.ts.map +1 -1
  67. package/dist/state/apply.js +42 -11
  68. package/dist/state/apply.js.map +1 -1
  69. package/dist/state/resolve-insert.d.ts.map +1 -1
  70. package/dist/state/resolve-insert.js +5 -2
  71. package/dist/state/resolve-insert.js.map +1 -1
  72. package/dist/state/slice-ops.js +16 -9
  73. package/dist/state/slice-ops.js.map +1 -1
  74. package/dist/state/transaction.d.ts +18 -1
  75. package/dist/state/transaction.d.ts.map +1 -1
  76. package/dist/state/transaction.js +27 -2
  77. package/dist/state/transaction.js.map +1 -1
  78. package/dist/styles.css +316 -84
  79. package/dist/theme.d.ts.map +1 -1
  80. package/dist/theme.js +10 -0
  81. package/dist/theme.js.map +1 -1
  82. package/dist/view/highlight-registry.d.ts +22 -0
  83. package/dist/view/highlight-registry.d.ts.map +1 -0
  84. package/dist/view/highlight-registry.js +73 -0
  85. package/dist/view/highlight-registry.js.map +1 -0
  86. package/dist/view/ime.d.ts.map +1 -1
  87. package/dist/view/ime.js +37 -3
  88. package/dist/view/ime.js.map +1 -1
  89. package/dist/view/input.d.ts.map +1 -1
  90. package/dist/view/input.js +21 -3
  91. package/dist/view/input.js.map +1 -1
  92. package/dist/view/mount.d.ts +5 -0
  93. package/dist/view/mount.d.ts.map +1 -1
  94. package/dist/view/mount.js +19 -1
  95. package/dist/view/mount.js.map +1 -1
  96. package/dist/view/node-selection.d.ts.map +1 -1
  97. package/dist/view/node-selection.js +9 -2
  98. package/dist/view/node-selection.js.map +1 -1
  99. package/package.json +1 -1
package/dist/index.d.ts CHANGED
@@ -4,21 +4,23 @@ export { mountWidget } from "./mount.js";
4
4
  export type { MountedWidget, MountWidgetOptions } from "./mount.js";
5
5
  export type { WidgetCoreOptions, WidgetEventHandlers, WidgetEventMap, WidgetEventType, WidgetSnapshot, RowData, } from "./types.js";
6
6
  export type { Attrs, DocNode, EditorNode, Mark } from "./model/node.js";
7
- export { createDoc, createText, isLeaf, isTextNode } from "./model/node.js";
7
+ export { attrsJsonEqual, createDoc, createText, docJsonEqual, isLeaf, isTextNode, marksJsonEqual, } from "./model/node.js";
8
8
  export type { AttrSpec, DOMSpec, MarkSpec, NodeSpec, ParseRule, Schema, SchemaSpec, } from "./model/schema.js";
9
- export { createSchema } from "./model/schema.js";
10
- export { firstTextPath, lastTextPath, nodeAt } from "./model/traverse.js";
9
+ export { createSchema, normalizeDoc } from "./model/schema.js";
10
+ export { docText, firstTextPath, lastTextPath, nodeAt, textOfNode, } from "./model/traverse.js";
11
11
  export { applyStep, computeSplitOps, coveredOffsets, leafPoint, mapPoint, marksEq, resolveMarkPoint, } from "./state/apply.js";
12
12
  export type { SplitOp } from "./state/apply.js";
13
13
  export type { NodeSelection, Point, Range, Selection, TextSelection, } from "./state/selection.js";
14
14
  export { isCollapsed, nodeSelection, normalizedRange, point, pointCmp, pointEq, selectionEq, textSelection, } from "./state/selection.js";
15
- export type { AddMarkStep, InsertStep, JoinStep, RemoveMarkStep, RemoveStep, SetAttrStep, SplitStep, Step, Transaction, } from "./state/transaction.js";
15
+ export type { AddMarkStep, InsertStep, JoinStep, RemoveMarkStep, RemoveStep, ReplaceDocStep, SetAttrStep, SplitStep, Step, Transaction, } from "./state/transaction.js";
16
16
  export type { CreateStateOptions, EditorState, EditorStateConfig, } from "./state/state.js";
17
17
  export { createState } from "./state/state.js";
18
18
  export { defaultBlockTypeOf } from "./state/list-ops.js";
19
19
  export type { BlockTextCtx, Command, CommandContext, Decoration, DecorationAttrs, Extension, FileDropCtx, InputHooks, InputRule, Keymap, PasteData, Plugin, RangeCtx, } from "./editor/extension.js";
20
- export type { Editor, EditorEventHandlers, EditorEventMap, EditorEventType, EditorOptions, } from "./editor/editor.js";
21
- export { createEditor } from "./editor/editor.js";
20
+ export type { Editor, EditorEventHandlers, EditorEventMap, EditorEventType, EditorOptions, SetDocOptions, } from "./editor/editor.js";
21
+ export { createEditor, schemaFromExtensions } from "./editor/editor.js";
22
+ export type { CommandFn, CommandRegistry, StarterCommands, } from "./editor/editor.js";
23
+ export type { StarterCommandName } from "./presets/starter.js";
22
24
  export type { NodeViewProps, RenderNode } from "./view/render.js";
23
25
  export { nodeViewEditable, nodeViewFor, renderChildren, } from "./view/render.js";
24
26
  export { bindEditorInput } from "./view/input.js";
@@ -39,11 +41,11 @@ export { pointAfter, pointBefore } from "./state/navigate.js";
39
41
  export { historyExtension, historyOf, invertStep, invertSteps, } from "./history.js";
40
42
  export type { HistoryEntry, HistoryState } from "./history.js";
41
43
  export type { Feature } from "./features/index.js";
42
- export { aceFeature, alignmentFeature, blockquoteFeature, codeBlockFeature, defineFeature, docFeature, hardBreakFeature, headingFeature, horizontalRuleFeature, imageFeature, inlineStyleFeature, linkFeature, listsFeature, marksFeature, mentionFeature, scriptFeature, searchFeature, starterFeatures, tableFeature, taskListFeature, } from "./features/index.js";
44
+ export { aceFeature, alignmentFeature, blockDndFeature, blockquoteFeature, codeBlockFeature, defineFeature, docFeature, hardBreakFeature, headingFeature, horizontalRuleFeature, imageFeature, inlineStyleFeature, linkFeature, listsFeature, markdownFeature, marksFeature, mentionFeature, scriptFeature, searchFeature, starterFeatures, tableFeature, taskListFeature, } from "./features/index.js";
43
45
  export { alignDOM, blockRule, blockText, blockTextOffset, blockTextPoint, caretBlockPath, isBlockActive, isInNode, isMarkActive, itemContext, markRule, rangeHasMark, samePath, setBlockType, toggleMark, wrapBlock, } from "./commands.js";
44
46
  export type { SearchMatch, SearchState } from "./features/search.js";
45
47
  export { collectMatches, searchStateOf, SEARCH_KEY, } from "./features/search.js";
46
- export { addTableColumn, addTableRow, canRedo, canUndo, clearFormat, codeBracketAt, codeCaret, codeTextAt, dedentCode, deleteTable, duplicateCodeLines, exitBlock, exitCodeArrow, indentCode, clearSearch, findNext, findPrev, insertHardBreak, insertHorizontalRule, insertImage, insertMention, insertTable, liftListItem, liftOnItemBackspace, linkHrefAt, linkRangeAt, moveCodeLines, nextCell, prevCell, replaceAll, replaceNext, setAlign, formatCode, formatCodeAt, formatCodeText, setCodeLanguage, setCodeLanguageAt, setLink, setMarkAttr, setSearch, sinkListItem, splitBlock, starterExtensions, toggleCodeBlock, toggleCodeComment, toggleList, toggleQuote, toggleTaskItem, unsetLink, } from "./presets/starter.js";
48
+ export { addTableColumn, addTableRow, canRedo, canUndo, clearFormat, codeBracketAt, codeCaret, codeTextAt, dedentCode, deleteImage, deleteTable, deleteTableColumn, deleteTableRow, duplicateCodeLines, exitBlock, exitCodeArrow, fileToDataUrl, indentCode, clearSearch, findNext, findPrev, insertHardBreak, insertHorizontalRule, insertImage, insertMention, insertTable, liftListItem, liftOnItemBackspace, linkHrefAt, linkRangeAt, moveCodeLines, nextCell, prevCell, replaceAll, replaceNext, setAlign, formatCode, formatCodeAt, formatCodeText, setCodeLanguage, setCodeLanguageAt, setLink, setMarkAttr, setSearch, setTableColWidths, sinkListItem, splitBlock, starterExtensions, starterSchema, toggleCodeBlock, toggleCodeComment, toggleList, toggleQuote, toggleTaskItem, unsetLink, updateImage, } from "./presets/starter.js";
47
49
  export { highlightCode } from "./presets/highlight.js";
48
50
  export { CODE_LANG_OPTIONS, codeLangOptions } from "./presets/highlight.js";
49
51
  export type { CodeHighlighter, CodeToken } from "./presets/highlight.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,15 +1,15 @@
1
1
  // ── 템플릿 예시 (골든 패스 레퍼런스) — 에디터 뷰로 교체 예정 ──
2
2
  export { WidgetCore } from "./core.js";
3
3
  export { mountWidget } from "./mount.js";
4
- export { createDoc, createText, isLeaf, isTextNode } from "./model/node.js";
5
- export { createSchema } from "./model/schema.js";
4
+ export { attrsJsonEqual, createDoc, createText, docJsonEqual, isLeaf, isTextNode, marksJsonEqual, } from "./model/node.js";
5
+ export { createSchema, normalizeDoc } from "./model/schema.js";
6
6
  // ── 상태 계층: 셀렉션/트랜잭션/에디터 상태 ───────────────────
7
- export { firstTextPath, lastTextPath, nodeAt } from "./model/traverse.js";
7
+ export { docText, firstTextPath, lastTextPath, nodeAt, textOfNode, } from "./model/traverse.js";
8
8
  export { applyStep, computeSplitOps, coveredOffsets, leafPoint, mapPoint, marksEq, resolveMarkPoint, } from "./state/apply.js";
9
9
  export { isCollapsed, nodeSelection, normalizedRange, point, pointCmp, pointEq, selectionEq, textSelection, } from "./state/selection.js";
10
10
  export { createState } from "./state/state.js";
11
11
  export { defaultBlockTypeOf } from "./state/list-ops.js";
12
- export { createEditor } from "./editor/editor.js";
12
+ export { createEditor, schemaFromExtensions } from "./editor/editor.js";
13
13
  export { nodeViewEditable, nodeViewFor, renderChildren, } from "./view/render.js";
14
14
  export { bindEditorInput } from "./view/input.js";
15
15
  export { DirtyKeyMap } from "./view/dirty-keys.js";
@@ -28,12 +28,12 @@ export { sanitizeHTML, isSafeUrl } from "./parse/sanitize.js";
28
28
  export { pointAfter, pointBefore } from "./state/navigate.js";
29
29
  // ── 히스토리 ────────────────────────────────────────────────
30
30
  export { historyExtension, historyOf, invertStep, invertSteps, } from "./history.js";
31
- export { aceFeature, alignmentFeature, blockquoteFeature, codeBlockFeature, defineFeature, docFeature, hardBreakFeature, headingFeature, horizontalRuleFeature, imageFeature, inlineStyleFeature, linkFeature, listsFeature, marksFeature, mentionFeature, scriptFeature, searchFeature, starterFeatures, tableFeature, taskListFeature, } from "./features/index.js";
31
+ export { aceFeature, alignmentFeature, blockDndFeature, blockquoteFeature, codeBlockFeature, defineFeature, docFeature, hardBreakFeature, headingFeature, horizontalRuleFeature, imageFeature, inlineStyleFeature, linkFeature, listsFeature, markdownFeature, marksFeature, mentionFeature, scriptFeature, searchFeature, starterFeatures, tableFeature, taskListFeature, } from "./features/index.js";
32
32
  // ── 기능 제작 툴킷 — 커맨드·캐럿 해석·입력 규칙 팩토리 ─────────
33
33
  export { alignDOM, blockRule, blockText, blockTextOffset, blockTextPoint, caretBlockPath, isBlockActive, isInNode, isMarkActive, itemContext, markRule, rangeHasMark, samePath, setBlockType, toggleMark, wrapBlock, } from "./commands.js";
34
34
  export { collectMatches, searchStateOf, SEARCH_KEY, } from "./features/search.js";
35
35
  // ── 프리셋 ──────────────────────────────────────────────────
36
- export { addTableColumn, addTableRow, canRedo, canUndo, clearFormat, codeBracketAt, codeCaret, codeTextAt, dedentCode, deleteTable, duplicateCodeLines, exitBlock, exitCodeArrow, indentCode, clearSearch, findNext, findPrev, insertHardBreak, insertHorizontalRule, insertImage, insertMention, insertTable, liftListItem, liftOnItemBackspace, linkHrefAt, linkRangeAt, moveCodeLines, nextCell, prevCell, replaceAll, replaceNext, setAlign, formatCode, formatCodeAt, formatCodeText, setCodeLanguage, setCodeLanguageAt, setLink, setMarkAttr, setSearch, sinkListItem, splitBlock, starterExtensions, toggleCodeBlock, toggleCodeComment, toggleList, toggleQuote, toggleTaskItem, unsetLink, } from "./presets/starter.js";
36
+ export { addTableColumn, addTableRow, canRedo, canUndo, clearFormat, codeBracketAt, codeCaret, codeTextAt, dedentCode, deleteImage, deleteTable, deleteTableColumn, deleteTableRow, duplicateCodeLines, exitBlock, exitCodeArrow, fileToDataUrl, indentCode, clearSearch, findNext, findPrev, insertHardBreak, insertHorizontalRule, insertImage, insertMention, insertTable, liftListItem, liftOnItemBackspace, linkHrefAt, linkRangeAt, moveCodeLines, nextCell, prevCell, replaceAll, replaceNext, setAlign, formatCode, formatCodeAt, formatCodeText, setCodeLanguage, setCodeLanguageAt, setLink, setMarkAttr, setSearch, setTableColWidths, sinkListItem, splitBlock, starterExtensions, starterSchema, toggleCodeBlock, toggleCodeComment, toggleList, toggleQuote, toggleTaskItem, unsetLink, updateImage, } from "./presets/starter.js";
37
37
  export { highlightCode } from "./presets/highlight.js";
38
38
  export { CODE_LANG_OPTIONS, codeLangOptions } from "./presets/highlight.js";
39
39
  export { serializeToMarkdown } from "./presets/markdown.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -44,4 +44,18 @@ export declare function isLeaf(node: EditorNode): boolean;
44
44
  export declare function childCount(node: EditorNode): number;
45
45
  export declare function createDoc(content?: readonly EditorNode[]): DocNode;
46
46
  export declare function createText(text: string, marks?: readonly Mark[]): EditorNode;
47
+ /**
48
+ * 두 doc/노드가 의미상 같은가 — 키 순서·표현 차이를 무시한 깊은 비교.
49
+ * `JSON.stringify` 비교는 false 부정이 난다: Y 미러 측은 attrs/marks를
50
+ * 키 정렬로 읽고 atom의 content 표현도 달라질 수 있어, 같은 문서도
51
+ * "다르다"로 판정된다.
52
+ * - attrs: 키 순서 무시 + 값은 깊은 비교 (undefined 키는 없는 것과 동일)
53
+ * - marks: 마크는 순서 무관한 집합 — type+attrs 쌍으로 비교
54
+ * - content/marks/attrs: []와 부재를 동일시
55
+ */
56
+ export declare function docJsonEqual(a: DocNode | EditorNode, b: DocNode | EditorNode): boolean;
57
+ /** attrs 비교 — 키 순서 무관, undefined 값은 없는 키와 동일 */
58
+ export declare function attrsJsonEqual(a: Record<string, unknown> | undefined, b: Record<string, unknown> | undefined): boolean;
59
+ /** 마크 배열 비교 — 같은 type+attrs 쌍의 집합이면 순서는 무시한다 */
60
+ export declare function marksJsonEqual(a: readonly Mark[] | undefined, b: readonly Mark[] | undefined): boolean;
47
61
  //# sourceMappingURL=node.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/model/node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,2CAA2C;AAC3C,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE5C,8CAA8C;AAC9C,MAAM,WAAW,IAAI;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;CACxB;AAED;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IACzC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,IAAI,EAAE,CAAC;IACjC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;GAGG;AACH,MAAM,WAAW,OAAQ,SAAQ,UAAU;IACzC,QAAQ,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,CAAC;CACzC;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAEpD;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAEhD;AAED,mBAAmB;AACnB,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAEnD;AAED,wBAAgB,SAAS,CAAC,OAAO,GAAE,SAAS,UAAU,EAAO,GAAG,OAAO,CAEtE;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,SAAS,IAAI,EAAE,GAAG,UAAU,CAE5E"}
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/model/node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,2CAA2C;AAC3C,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE5C,8CAA8C;AAC9C,MAAM,WAAW,IAAI;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;CACxB;AAED;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IACzC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,IAAI,EAAE,CAAC;IACjC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;GAGG;AACH,MAAM,WAAW,OAAQ,SAAQ,UAAU;IACzC,QAAQ,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,CAAC;CACzC;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAEpD;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAEhD;AAED,mBAAmB;AACnB,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAEnD;AAED,wBAAgB,SAAS,CAAC,OAAO,GAAE,SAAS,UAAU,EAAO,GAAG,OAAO,CAEtE;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,SAAS,IAAI,EAAE,GAAG,UAAU,CAE5E;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,CAAC,EAAE,OAAO,GAAG,UAAU,EACvB,CAAC,EAAE,OAAO,GAAG,UAAU,GACtB,OAAO,CAWT;AAED,gDAAgD;AAChD,wBAAgB,cAAc,CAC5B,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EACtC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GACrC,OAAO,CAKT;AAwBD,gDAAgD;AAChD,wBAAgB,cAAc,CAC5B,CAAC,EAAE,SAAS,IAAI,EAAE,GAAG,SAAS,EAC9B,CAAC,EAAE,SAAS,IAAI,EAAE,GAAG,SAAS,GAC7B,OAAO,CAaT"}
@@ -27,4 +27,71 @@ export function createDoc(content = []) {
27
27
  export function createText(text, marks) {
28
28
  return marks?.length ? { type: "text", text, marks } : { type: "text", text };
29
29
  }
30
+ /**
31
+ * 두 doc/노드가 의미상 같은가 — 키 순서·표현 차이를 무시한 깊은 비교.
32
+ * `JSON.stringify` 비교는 false 부정이 난다: Y 미러 측은 attrs/marks를
33
+ * 키 정렬로 읽고 atom의 content 표현도 달라질 수 있어, 같은 문서도
34
+ * "다르다"로 판정된다.
35
+ * - attrs: 키 순서 무시 + 값은 깊은 비교 (undefined 키는 없는 것과 동일)
36
+ * - marks: 마크는 순서 무관한 집합 — type+attrs 쌍으로 비교
37
+ * - content/marks/attrs: []와 부재를 동일시
38
+ */
39
+ export function docJsonEqual(a, b) {
40
+ if (a.type !== b.type)
41
+ return false;
42
+ if ((a.text ?? "") !== (b.text ?? ""))
43
+ return false;
44
+ if (!attrsJsonEqual(a.attrs, b.attrs))
45
+ return false;
46
+ const ac = a.content ?? [];
47
+ const bc = b.content ?? [];
48
+ if (ac.length !== bc.length)
49
+ return false;
50
+ for (let i = 0; i < ac.length; i++) {
51
+ if (!docJsonEqual(ac[i], bc[i]))
52
+ return false;
53
+ }
54
+ return marksJsonEqual(a.marks, b.marks);
55
+ }
56
+ /** attrs 비교 — 키 순서 무관, undefined 값은 없는 키와 동일 */
57
+ export function attrsJsonEqual(a, b) {
58
+ const ak = Object.keys(a ?? {}).filter((k) => a[k] !== undefined);
59
+ const bk = Object.keys(b ?? {}).filter((k) => b[k] !== undefined);
60
+ if (ak.length !== bk.length)
61
+ return false;
62
+ return ak.every((k) => bk.includes(k) && jsonValueEqual(a[k], b[k]));
63
+ }
64
+ /** JSON 값 깊은 비교 — 객체 키 순서 무시 */
65
+ function jsonValueEqual(a, b) {
66
+ if (a === b)
67
+ return true;
68
+ if (!a || !b || typeof a !== "object" || typeof b !== "object") {
69
+ return false;
70
+ }
71
+ const aArr = Array.isArray(a);
72
+ if (aArr !== Array.isArray(b))
73
+ return false;
74
+ if (aArr) {
75
+ const aa = a;
76
+ const bb = b;
77
+ return (aa.length === bb.length &&
78
+ aa.every((v, i) => jsonValueEqual(v, bb[i])));
79
+ }
80
+ return attrsJsonEqual(a, b);
81
+ }
82
+ /** 마크 배열 비교 — 같은 type+attrs 쌍의 집합이면 순서는 무시한다 */
83
+ export function marksJsonEqual(a, b) {
84
+ const am = a ?? [];
85
+ const bm = b ?? [];
86
+ if (am.length !== bm.length)
87
+ return false;
88
+ const rest = [...bm];
89
+ return am.every((m) => {
90
+ const i = rest.findIndex((x) => x.type === m.type && attrsJsonEqual(x.attrs, m.attrs));
91
+ if (i < 0)
92
+ return false;
93
+ rest.splice(i, 1);
94
+ return true;
95
+ });
96
+ }
30
97
  //# sourceMappingURL=node.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/model/node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAiCH,MAAM,UAAU,UAAU,CAAC,IAAgB;IACzC,OAAO,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,IAAgB;IACrC,OAAO,IAAI,CAAC,OAAO,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC;AAC3D,CAAC;AAED,mBAAmB;AACnB,MAAM,UAAU,UAAU,CAAC,IAAgB;IACzC,OAAO,IAAI,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,UAAiC,EAAE;IAC3D,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,KAAuB;IAC9D,OAAO,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAChF,CAAC"}
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/model/node.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { Attrs, EditorNode, Mark } from "./node.js";
1
+ import type { Attrs, DocNode, EditorNode, Mark } from "./node.js";
2
2
  /**
3
3
  * 스키마 — 노드/마크 타입 레지스트리.
4
4
  *
@@ -102,4 +102,11 @@ export interface Schema {
102
102
  * 레지스트리 + 기본값 팩토리일 뿐, 유효성 검증은 상태 계층(state)이 한다.
103
103
  */
104
104
  export declare function createSchema(spec: SchemaSpec): Schema;
105
+ /**
106
+ * 스키마 기준 문서 보정 — 루트 type을 topNodeType으로 맞추고, 문서 끝이
107
+ * 기본 텍스트블록이 아니면 빈 블록 하나를 붙인다 (캐럿을 둘 자리 보장 —
108
+ * createEditor의 초기 문서와 setDoc의 교체 문서가 같은 보장을 공유한다).
109
+ * 기본 블록은 paragraph, 없으면 inline을 받는 첫 block 그룹 타입이다.
110
+ */
111
+ export declare function normalizeDoc(schema: Schema, doc: DocNode): DocNode;
105
112
  //# sourceMappingURL=schema.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/model/schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/model/schema.ts"],"names":[],"mappings":"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"}
@@ -44,4 +44,33 @@ export function createSchema(spec) {
44
44
  },
45
45
  };
46
46
  }
47
+ /**
48
+ * 스키마 기준 문서 보정 — 루트 type을 topNodeType으로 맞추고, 문서 끝이
49
+ * 기본 텍스트블록이 아니면 빈 블록 하나를 붙인다 (캐럿을 둘 자리 보장 —
50
+ * createEditor의 초기 문서와 setDoc의 교체 문서가 같은 보장을 공유한다).
51
+ * 기본 블록은 paragraph, 없으면 inline을 받는 첫 block 그룹 타입이다.
52
+ */
53
+ export function normalizeDoc(schema, doc) {
54
+ const d = {
55
+ ...doc,
56
+ type: schema.topNodeType,
57
+ content: doc.content ?? [],
58
+ };
59
+ const content = d.content;
60
+ const def = defaultBlockTypeOfSchema(schema);
61
+ if (!def || content[content.length - 1]?.type === def)
62
+ return d;
63
+ return {
64
+ ...d,
65
+ content: [...content, { ...schema.node(def), content: [] }],
66
+ };
67
+ }
68
+ /** 기본 텍스트블록 타입 — paragraph, 없으면 inline을 받는 첫 block */
69
+ function defaultBlockTypeOfSchema(schema) {
70
+ const spec = schema.spec.nodes;
71
+ if (spec["paragraph"])
72
+ return "paragraph";
73
+ return (Object.keys(spec).find((t) => spec[t].group?.split(" ").includes("block") &&
74
+ /inline/.test(spec[t].content ?? "")) ?? null);
75
+ }
47
76
  //# sourceMappingURL=schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/model/schema.ts"],"names":[],"mappings":"AA4GA;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAgB;IAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC;IAE1C,SAAS,YAAY,CACnB,SAA+C,EAC/C,KAAwB;QAExB,IAAI,CAAC,SAAS;YAAE,OAAO,KAAK,CAAC;QAC7B,MAAM,GAAG,GAAU,EAAE,CAAC;QACtB,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YACjD,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS;gBAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;QACpD,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,OAAO;QACL,IAAI;QACJ,WAAW;QACX,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;QAC/B,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;QAC/B,QAAQ,CAAC,IAAI;YACX,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;YACtB,OAAO,CACL,CAAC,CAAC,CAAC;gBACH,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CACrE,CAAC;QACJ,CAAC;QACD,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,KAAK,IAAI;QAC5C,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;QACvE,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE;YAClB,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;YACtB,IAAI,CAAC,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;YACjD,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YAChD,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QACpD,CAAC;QACD,IAAI,CAAC,IAAI,EAAE,KAAK;YACd,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;YACtB,IAAI,CAAC,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;YACjD,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC5C,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;QACrD,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/model/schema.ts"],"names":[],"mappings":"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"}
@@ -33,4 +33,8 @@ export declare function expandTextNodes(node: EditorNode, path: readonly number[
33
33
  export declare function lastTextPath(doc: EditorNode): readonly number[] | null;
34
34
  /** 문서의 첫 텍스트 노드 경로 — 없으면 null */
35
35
  export declare function firstTextPath(doc: EditorNode): readonly number[] | null;
36
+ /** 노드의 평문 — 텍스트 리프는 text, 컨테이너는 자식을 재귀 결합 */
37
+ export declare function textOfNode(node: EditorNode): string;
38
+ /** 문서 전체 평문 — 최상위 블록 사이는 \n */
39
+ export declare function docText(doc: EditorNode): string;
36
40
  //# sourceMappingURL=traverse.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"traverse.d.ts","sourceRoot":"","sources":["../../src/model/traverse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C;;;;;;GAMG;AAEH,wCAAwC;AACxC,wBAAgB,MAAM,CACpB,GAAG,EAAE,UAAU,EACf,IAAI,EAAE,SAAS,MAAM,EAAE,GACtB,UAAU,GAAG,SAAS,CAIxB;AAED,gCAAgC;AAChC,wBAAgB,QAAQ,CACtB,GAAG,EAAE,UAAU,EACf,IAAI,EAAE,SAAS,MAAM,EAAE,GACtB,UAAU,GAAG,SAAS,CAExB;AAED,wCAAwC;AACxC,wBAAgB,UAAU,CACxB,GAAG,EAAE,UAAU,EACf,IAAI,EAAE,SAAS,MAAM,EAAE,GACtB,UAAU,GAAG,SAAS,CAGxB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,EAAE,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,UAAU,GACnC,UAAU,CAUZ;AAED,kCAAkC;AAClC,wBAAgB,aAAa,CAC3B,GAAG,EAAE,UAAU,EACf,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,UAAU,GAChB,UAAU,CAMZ;AAED,8BAA8B;AAC9B,wBAAgB,aAAa,CAC3B,GAAG,EAAE,UAAU,EACf,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,KAAK,EAAE,MAAM,GACZ,UAAU,CAOZ;AAED,4CAA4C;AAC5C,wBAAgB,cAAc,CAC5B,GAAG,EAAE,UAAU,EACf,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,SAAS,UAAU,EAAE,GAC3B,UAAU,CAMZ;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,EAAE,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,KAAK,SAAS,UAAU,EAAE,GACvE,SAAS,UAAU,EAAE,CAYvB;AAED,mCAAmC;AACnC,wBAAgB,YAAY,CAAC,GAAG,EAAE,UAAU,GAAG,SAAS,MAAM,EAAE,GAAG,IAAI,CAYtE;AAED,iCAAiC;AACjC,wBAAgB,aAAa,CAAC,GAAG,EAAE,UAAU,GAAG,SAAS,MAAM,EAAE,GAAG,IAAI,CAYvE"}
1
+ {"version":3,"file":"traverse.d.ts","sourceRoot":"","sources":["../../src/model/traverse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C;;;;;;GAMG;AAEH,wCAAwC;AACxC,wBAAgB,MAAM,CACpB,GAAG,EAAE,UAAU,EACf,IAAI,EAAE,SAAS,MAAM,EAAE,GACtB,UAAU,GAAG,SAAS,CAIxB;AAED,gCAAgC;AAChC,wBAAgB,QAAQ,CACtB,GAAG,EAAE,UAAU,EACf,IAAI,EAAE,SAAS,MAAM,EAAE,GACtB,UAAU,GAAG,SAAS,CAExB;AAED,wCAAwC;AACxC,wBAAgB,UAAU,CACxB,GAAG,EAAE,UAAU,EACf,IAAI,EAAE,SAAS,MAAM,EAAE,GACtB,UAAU,GAAG,SAAS,CAGxB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,EAAE,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,UAAU,GACnC,UAAU,CAUZ;AAED,kCAAkC;AAClC,wBAAgB,aAAa,CAC3B,GAAG,EAAE,UAAU,EACf,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,UAAU,GAChB,UAAU,CAMZ;AAED,8BAA8B;AAC9B,wBAAgB,aAAa,CAC3B,GAAG,EAAE,UAAU,EACf,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,KAAK,EAAE,MAAM,GACZ,UAAU,CAOZ;AAED,4CAA4C;AAC5C,wBAAgB,cAAc,CAC5B,GAAG,EAAE,UAAU,EACf,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,SAAS,UAAU,EAAE,GAC3B,UAAU,CAMZ;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,EAAE,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,KAAK,SAAS,UAAU,EAAE,GACvE,SAAS,UAAU,EAAE,CAYvB;AAED,mCAAmC;AACnC,wBAAgB,YAAY,CAAC,GAAG,EAAE,UAAU,GAAG,SAAS,MAAM,EAAE,GAAG,IAAI,CAYtE;AAED,iCAAiC;AACjC,wBAAgB,aAAa,CAAC,GAAG,EAAE,UAAU,GAAG,SAAS,MAAM,EAAE,GAAG,IAAI,CAYvE;AAED,6CAA6C;AAC7C,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAGnD;AAED,+BAA+B;AAC/B,wBAAgB,OAAO,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,CAE/C"}
@@ -120,4 +120,14 @@ export function firstTextPath(doc) {
120
120
  };
121
121
  return walk(doc, []);
122
122
  }
123
+ /** 노드의 평문 — 텍스트 리프는 text, 컨테이너는 자식을 재귀 결합 */
124
+ export function textOfNode(node) {
125
+ if (node.text !== undefined)
126
+ return node.text;
127
+ return (node.content ?? []).map(textOfNode).join("");
128
+ }
129
+ /** 문서 전체 평문 — 최상위 블록 사이는 \n */
130
+ export function docText(doc) {
131
+ return (doc.content ?? []).map(textOfNode).join("\n");
132
+ }
123
133
  //# sourceMappingURL=traverse.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"traverse.js","sourceRoot":"","sources":["../../src/model/traverse.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"traverse.js","sourceRoot":"","sources":["../../src/model/traverse.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AAEH,wCAAwC;AACxC,MAAM,UAAU,MAAM,CACpB,GAAe,EACf,IAAuB;IAEvB,IAAI,IAAI,GAA2B,GAAG,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,IAAI;QAAE,IAAI,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IAChD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,gCAAgC;AAChC,MAAM,UAAU,QAAQ,CACtB,GAAe,EACf,IAAuB;IAEvB,OAAO,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACxC,CAAC;AAED,wCAAwC;AACxC,MAAM,UAAU,UAAU,CACxB,GAAe,EACf,IAAuB;IAEvB,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC5B,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAChD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,IAAgB,EAChB,IAAuB,EACvB,EAAoC;IAEpC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;IACnB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IAC/B,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACpD,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAQ,CAAC,KAAK,EAAE,CAAC;IACtC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAClB,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC;AAC9B,CAAC;AAED,kCAAkC;AAClC,MAAM,UAAU,aAAa,CAC3B,GAAe,EACf,IAAuB,EACvB,KAAa,EACb,KAAiB;IAEjB,OAAO,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE;QACxC,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QAC/C,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QAChC,OAAO,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,8BAA8B;AAC9B,MAAM,UAAU,aAAa,CAC3B,GAAe,EACf,IAAuB,EACvB,KAAa;IAEb,OAAO,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE;QACxC,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QAC/C,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,OAAO,CAAC,MAAM;YAAE,OAAO,MAAM,CAAC;QACxD,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACzB,OAAO,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,cAAc,CAC5B,GAAe,EACf,IAAuB,EACvB,IAAY,EACZ,EAAU,EACV,KAA4B;IAE5B,OAAO,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE;QACxC,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QAC/C,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC;QAC1C,OAAO,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAgB,EAChB,IAAuB,EACvB,EAAwE;IAExE,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IAC7B,IAAI,CAAC,OAAO,EAAE,MAAM;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,IAAI,GAAiB,EAAE,CAAC;IAC9B,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QAC3B,MAAM,CAAC,GAAG,eAAe,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACnD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK;YAAE,OAAO,GAAG,IAAI,CAAC;QACrD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IACH,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACzD,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,YAAY,CAAC,GAAe;IAC1C,MAAM,IAAI,GAAG,CAAC,IAAgB,EAAE,IAAc,EAAmB,EAAE;QACjE,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,IAAI,CAAC;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC1B,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAE,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC1C,IAAI,CAAC;gBAAE,OAAO,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IACF,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AACvB,CAAC;AAED,iCAAiC;AACjC,MAAM,UAAU,aAAa,CAAC,GAAe;IAC3C,MAAM,IAAI,GAAG,CAAC,IAAgB,EAAE,IAAc,EAAmB,EAAE;QACjE,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,IAAI,CAAC;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAE,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC1C,IAAI,CAAC;gBAAE,OAAO,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IACF,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AACvB,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,UAAU,CAAC,IAAgB;IACzC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC;IAC9C,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,+BAA+B;AAC/B,MAAM,UAAU,OAAO,CAAC,GAAe;IACrC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxD,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import type { Extension } from "../editor/extension.js";
2
+ import type { Schema } from "../model/schema.js";
2
3
  /**
3
4
  * 스타터 킷 — 데모/테스트/빠른 시작용 기본 스키마와 커맨드 번들.
4
5
  * 제품 코드도 이 구성에서 시작해 확장을 추가하는 것이 관례다.
@@ -10,5 +11,17 @@ import type { Extension } from "../editor/extension.js";
10
11
  export * from "../features/index.js";
11
12
  export { canUndo, canRedo } from "../history.js";
12
13
  /** 스타터 확장 집합 — 기능 모듈 + 히스토리 */
14
+ /**
15
+ * 스타터 커맨드 이름 — `editor.commands` 자동완성용 유니온.
16
+ * 커스텀 확장이 등록하는 이름은 열린 문자열 인덱스로 계속 접근된다.
17
+ * 커맨드를 추가/삭제하면 이 목록도 함께 갱신한다.
18
+ */
19
+ export type StarterCommandName = "addTableColumn" | "addTableRow" | "clearFormat" | "clearSearch" | "deleteImage" | "deleteTable" | "deleteTableColumn" | "deleteTableRow" | "duplicateCodeLines" | "exitBlock" | "findNext" | "findPrev" | "formatCode" | "formatCodeAt" | "importMarkdown" | "insertHardBreak" | "insertHorizontalRule" | "insertImage" | "insertTable" | "liftListItem" | "liftOnItemBackspace" | "moveBlock" | "moveCodeLines" | "nextCell" | "prevCell" | "redo" | "replaceAll" | "replaceNext" | "setAlign" | "setCodeLanguage" | "setCodeLanguageAt" | "setHeading" | "setLink" | "setMarkAttr" | "setParagraph" | "setSearch" | "setTableColWidths" | "sinkListItem" | "splitBlock" | "toggleBold" | "toggleBulletList" | "toggleCode" | "toggleCodeBlock" | "toggleCodeComment" | "toggleItalic" | "toggleOrderedList" | "toggleQuote" | "toggleStrike" | "toggleSubscript" | "toggleSuperscript" | "toggleTaskItem" | "toggleTaskList" | "toggleUnderline" | "undo" | "unsetLink" | "updateImage";
13
20
  export declare function starterExtensions(): Extension[];
21
+ /**
22
+ * 스타터 스키마 — 에디터를 만들지 않고 parseHTML 등에 쓸 스키마가
23
+ * 필요할 때 (기존 HTML → doc 변환). `createEditor({extensions:
24
+ * starterExtensions()}).schema`와 같은 조립 규칙의 결과다.
25
+ */
26
+ export declare function starterSchema(): Schema;
14
27
  //# sourceMappingURL=starter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"starter.d.ts","sourceRoot":"","sources":["../../src/presets/starter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAIxD;;;;;;;GAOG;AAGH,cAAc,sBAAsB,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAEjD,+BAA+B;AAC/B,wBAAgB,iBAAiB,IAAI,SAAS,EAAE,CAE/C"}
1
+ {"version":3,"file":"starter.d.ts","sourceRoot":"","sources":["../../src/presets/starter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAIxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEjD;;;;;;;GAOG;AAGH,cAAc,sBAAsB,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAEjD,+BAA+B;AAC/B;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAC1B,gBAAgB,GAAG,aAAa,GAAG,aAAa,GAAG,aAAa,GAChE,aAAa,GAAG,aAAa,GAAG,mBAAmB,GAAG,gBAAgB,GACtE,oBAAoB,GAAG,WAAW,GAAG,UAAU,GAAG,UAAU,GAC5D,YAAY,GAAG,cAAc,GAAG,gBAAgB,GAAG,iBAAiB,GACpE,sBAAsB,GAAG,aAAa,GAAG,aAAa,GAAG,cAAc,GACvE,qBAAqB,GAAG,WAAW,GAAG,eAAe,GAAG,UAAU,GAClE,UAAU,GAAG,MAAM,GAAG,YAAY,GAAG,aAAa,GAAG,UAAU,GAC/D,iBAAiB,GAAG,mBAAmB,GAAG,YAAY,GAAG,SAAS,GAClE,aAAa,GAAG,cAAc,GAAG,WAAW,GAAG,mBAAmB,GAClE,cAAc,GAAG,YAAY,GAAG,YAAY,GAAG,kBAAkB,GACjE,YAAY,GAAG,iBAAiB,GAAG,mBAAmB,GAAG,cAAc,GACvE,mBAAmB,GAAG,aAAa,GAAG,cAAc,GAAG,iBAAiB,GACxE,mBAAmB,GAAG,gBAAgB,GAAG,gBAAgB,GACzD,iBAAiB,GAAG,MAAM,GAAG,WAAW,GAAG,aAAa,CAAC;AAE7D,wBAAgB,iBAAiB,IAAI,SAAS,EAAE,CAE/C;AAED;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
@@ -1,3 +1,4 @@
1
+ import { schemaFromExtensions } from "../editor/editor.js";
1
2
  import { historyExtension } from "../history.js";
2
3
  import { starterFeatures } from "../features/index.js";
3
4
  /**
@@ -11,8 +12,15 @@ import { starterFeatures } from "../features/index.js";
11
12
  // 기능 모듈 전체 재수출 — 기존 presets/starter.js 임포트 경로 호환
12
13
  export * from "../features/index.js";
13
14
  export { canUndo, canRedo } from "../history.js";
14
- /** 스타터 확장 집합 — 기능 모듈 + 히스토리 */
15
15
  export function starterExtensions() {
16
16
  return [...starterFeatures(), historyExtension()];
17
17
  }
18
+ /**
19
+ * 스타터 스키마 — 에디터를 만들지 않고 parseHTML 등에 쓸 스키마가
20
+ * 필요할 때 (기존 HTML → doc 변환). `createEditor({extensions:
21
+ * starterExtensions()}).schema`와 같은 조립 규칙의 결과다.
22
+ */
23
+ export function starterSchema() {
24
+ return schemaFromExtensions(starterExtensions());
25
+ }
18
26
  //# sourceMappingURL=starter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"starter.js","sourceRoot":"","sources":["../../src/presets/starter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD;;;;;;;GAOG;AAEH,iDAAiD;AACjD,cAAc,sBAAsB,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAEjD,+BAA+B;AAC/B,MAAM,UAAU,iBAAiB;IAC/B,OAAO,CAAC,GAAG,eAAe,EAAE,EAAE,gBAAgB,EAAE,CAAC,CAAC;AACpD,CAAC"}
1
+ {"version":3,"file":"starter.js","sourceRoot":"","sources":["../../src/presets/starter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD;;;;;;;GAOG;AAEH,iDAAiD;AACjD,cAAc,sBAAsB,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAwBjD,MAAM,UAAU,iBAAiB;IAC/B,OAAO,CAAC,GAAG,eAAe,EAAE,EAAE,gBAAgB,EAAE,CAAC,CAAC;AACpD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,oBAAoB,CAAC,iBAAiB,EAAE,CAAC,CAAC;AACnD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../src/state/apply.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AASlE,OAAO,KAAK,EAOV,SAAS,EACT,IAAI,EACL,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAY,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEnD;;;;;;;GAOG;AAEH,wBAAgB,OAAO,CACrB,CAAC,EAAE,SAAS,IAAI,EAAE,GAAG,SAAS,EAC9B,CAAC,EAAE,SAAS,IAAI,EAAE,GAAG,SAAS,GAC7B,OAAO,CAYT;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAiB3D;AAgFD,gDAAgD;AAChD,wBAAgB,cAAc,CAC5B,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,KAAK,EAAE,KAAK,GACX;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAcjC;AAYD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,GAAG,KAAK,CAmB9D;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,GAAG,KAAK,CAwB1D;AAoCD;;;;;GAKG;AACH,MAAM,MAAM,OAAO,GACf;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACzD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7D,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,EAAE,CAoBxE;AAkDD;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,GAAG,KAAK,CAmBlE;AAED,iBAAS,MAAM,CAAC,CAAC,EAAE,SAAS,MAAM,EAAE,EAAE,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAEnE;AAmKD,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,GAAG,KAAK,CAgD9D;AAgDD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC"}
1
+ {"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../src/state/apply.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAWlE,OAAO,KAAK,EAOV,SAAS,EACT,IAAI,EACL,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAY,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEnD;;;;;;;GAOG;AAEH,wBAAgB,OAAO,CACrB,CAAC,EAAE,SAAS,IAAI,EAAE,GAAG,SAAS,EAC9B,CAAC,EAAE,SAAS,IAAI,EAAE,GAAG,SAAS,GAC7B,OAAO,CAsBT;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAqB3D;AAgFD,gDAAgD;AAChD,wBAAgB,cAAc,CAC5B,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,KAAK,EAAE,KAAK,GACX;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAcjC;AAYD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,GAAG,KAAK,CAmB9D;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,GAAG,KAAK,CAwB1D;AAoCD;;;;;GAKG;AACH,MAAM,MAAM,OAAO,GACf;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACzD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7D,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,EAAE,CAyBxE;AAkDD;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,GAAG,KAAK,CA0BlE;AAED,iBAAS,MAAM,CAAC,CAAC,EAAE,SAAS,MAAM,EAAE,EAAE,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAEnE;AAyKD,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,GAAG,KAAK,CAgD9D;AAgDD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC"}
@@ -1,4 +1,5 @@
1
- import { expandTextNodes, insertChildAt, nodeAt, removeChildAt, spliceChildren, updateNodeAt, } from "../model/traverse.js";
1
+ import { attrsJsonEqual, marksJsonEqual } from "../model/node.js";
2
+ import { expandTextNodes, firstTextPath, insertChildAt, nodeAt, removeChildAt, spliceChildren, updateNodeAt, } from "../model/traverse.js";
2
3
  import { pointCmp, pointEq } from "./selection.js";
3
4
  /**
4
5
  * Step 적용 엔진 — 순수 함수 (doc, step) → doc.
@@ -11,14 +12,22 @@ import { pointCmp, pointEq } from "./selection.js";
11
12
  export function marksEq(a, b) {
12
13
  if (a === b)
13
14
  return true;
14
- if (!a?.length || !b?.length || a.length !== b.length)
15
- return !a?.length && !b?.length;
16
- return a.every((m, i) => {
17
- const o = b[i];
18
- return (!!o &&
19
- m.type === o.type &&
20
- JSON.stringify(m.attrs ?? null) === JSON.stringify(o.attrs ?? null));
21
- });
15
+ // 빠른 경로 — 순서까지 같은 흔한 경우
16
+ if (a?.length &&
17
+ b?.length &&
18
+ a.length === b.length &&
19
+ a.every((m, i) => {
20
+ const o = b[i];
21
+ return (!!o &&
22
+ m.type === o.type &&
23
+ attrsJsonEqual(m.attrs, o.attrs));
24
+ })) {
25
+ return true;
26
+ }
27
+ // 마크는 순서 무관한 집합 — 배열 순서나 attrs 키 순서가 달라도 같은
28
+ // 마크다. Y 미러가 마크를 type 순으로 정규화해 읽으므로 로컬 비교도
29
+ // 순서 무관이어야 insert merge/join 판정이 피어별로 갈라지지 않는다
30
+ return marksJsonEqual(a, b);
22
31
  }
23
32
  export function applyStep(doc, step) {
24
33
  switch (step.op) {
@@ -36,6 +45,10 @@ export function applyStep(doc, step) {
36
45
  return applySplitOps(doc, computeSplitOps(doc, step));
37
46
  case "join":
38
47
  return applyJoin(doc, step);
48
+ case "replaceDoc":
49
+ // 스텝이 새 문서를 통째로 든다 — 정규화(루트 type·끝 블록)는
50
+ // 발행 측(tr.replaceDoc/원격 수신) 책임, apply는 verbatim 적용
51
+ return step.doc;
39
52
  }
40
53
  }
41
54
  // ── insert / remove ─────────────────────────────────────────
@@ -243,7 +256,12 @@ export function computeSplitOps(doc, step) {
243
256
  for (let d = 0; d < depth; d++) {
244
257
  if (at.path.length === 0)
245
258
  break; // doc 루트는 나눌 수 없다
246
- ops.push({ kind: "node", path: at.path, index: at.offset });
259
+ // 리프(atom) 노드는 자식이 없어 apply도 건너뛴다 — op를 만들면
260
+ // mapPoint는 포인트를 밀고 history는 join 역변환을 만들어
261
+ // "적용 없는 스텝"이 셀렉션과 undo를 오염시킨다
262
+ if (nodeAt(doc, at.path)?.content) {
263
+ ops.push({ kind: "node", path: at.path, index: at.offset });
264
+ }
247
265
  at = {
248
266
  path: at.path.slice(0, -1),
249
267
  offset: at.path[at.path.length - 1] + 1,
@@ -321,6 +339,13 @@ export function mapPoint(p, step, doc) {
321
339
  return computeSplitOps(doc, step).reduce((pt, op) => mapThroughSplitOp(pt, op), p);
322
340
  case "join":
323
341
  return mapThroughJoin(p, step, doc);
342
+ case "replaceDoc": {
343
+ // 기존 좌표는 전부 무효 — 새 문서의 첫 텍스트 앞(없으면 루트 경계)으로
344
+ // 수렴한다. tr.replaceDoc이 명시 셀렉션을 싣는 경로가 정상이고
345
+ // 이 매핑은 원격 스텝 재생 같은 폴백 경로용이다
346
+ const first = firstTextPath(step.doc);
347
+ return { path: first ?? [], offset: 0 };
348
+ }
324
349
  }
325
350
  }
326
351
  function pathEq(a, b) {
@@ -435,7 +460,13 @@ function collectMarkSplits(doc, step) {
435
460
  }
436
461
  function mapThroughMarkStep(p, step, doc) {
437
462
  let out = p;
438
- for (const sp of collectMarkSplits(doc, step)) {
463
+ // 분할은 문서 순서로 수집되지만 매핑은 역순으로 적용한다 —
464
+ // 앞 노드의 분할이 포인트 인덱스를 이미 밀어 뒤 분할의 원래 경로와
465
+ // pathEq가 어긋나면, 노드 내부 매핑 대신 generic 시프트가 한 번 더
466
+ // 먹어 포인트가 꼬리 세그먼트로 밀린다 (셀렉션·undo 역변환 붕괴)
467
+ const splits = collectMarkSplits(doc, step);
468
+ for (let i = splits.length - 1; i >= 0; i--) {
469
+ const sp = splits[i];
439
470
  out = mapThroughTextSplit3(out, sp.path, sp.s, sp.e, sp.tail);
440
471
  }
441
472
  return out;