@one2x/medeo-rte 0.0.0-stage → 0.1.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.
Files changed (145) hide show
  1. package/README.md +209 -2
  2. package/dist/chunks/types-I0yc5X7i.js +18 -0
  3. package/dist/chunks/types-I0yc5X7i.js.map +1 -0
  4. package/dist/formula.js +186 -0
  5. package/dist/formula.js.map +1 -0
  6. package/dist/index.js +5503 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/style.css +718 -0
  9. package/dist/types/commands/index.d.ts +4 -0
  10. package/dist/types/commands/index.d.ts.map +1 -0
  11. package/dist/types/commands/selfcheck.d.ts +2 -0
  12. package/dist/types/commands/selfcheck.d.ts.map +1 -0
  13. package/dist/types/commands/shortcuts.d.ts +48 -0
  14. package/dist/types/commands/shortcuts.d.ts.map +1 -0
  15. package/dist/types/commands/types.d.ts +69 -0
  16. package/dist/types/commands/types.d.ts.map +1 -0
  17. package/dist/types/convert/clipboard.d.ts +7 -0
  18. package/dist/types/convert/clipboard.d.ts.map +1 -0
  19. package/dist/types/convert/markdown.d.ts +30 -0
  20. package/dist/types/convert/markdown.d.ts.map +1 -0
  21. package/dist/types/convert/mdPaste.d.ts +8 -0
  22. package/dist/types/convert/mdPaste.d.ts.map +1 -0
  23. package/dist/types/editor.d.ts +469 -0
  24. package/dist/types/editor.d.ts.map +1 -0
  25. package/dist/types/edits/editResult.d.ts +62 -0
  26. package/dist/types/edits/editResult.d.ts.map +1 -0
  27. package/dist/types/edits/index.d.ts +12 -0
  28. package/dist/types/edits/index.d.ts.map +1 -0
  29. package/dist/types/edits/selfcheck.d.ts +2 -0
  30. package/dist/types/edits/selfcheck.d.ts.map +1 -0
  31. package/dist/types/edits/transaction.d.ts +35 -0
  32. package/dist/types/edits/transaction.d.ts.map +1 -0
  33. package/dist/types/edits/undoStack.d.ts +50 -0
  34. package/dist/types/edits/undoStack.d.ts.map +1 -0
  35. package/dist/types/embed/code.d.ts +9 -0
  36. package/dist/types/embed/code.d.ts.map +1 -0
  37. package/dist/types/embed/formula-katex.d.ts +4 -0
  38. package/dist/types/embed/formula-katex.d.ts.map +1 -0
  39. package/dist/types/embed/formula-mathlive.d.ts +6 -0
  40. package/dist/types/embed/formula-mathlive.d.ts.map +1 -0
  41. package/dist/types/embed/formula.d.ts +8 -0
  42. package/dist/types/embed/formula.d.ts.map +1 -0
  43. package/dist/types/embed/host.d.ts +70 -0
  44. package/dist/types/embed/host.d.ts.map +1 -0
  45. package/dist/types/embed/image.d.ts +3 -0
  46. package/dist/types/embed/image.d.ts.map +1 -0
  47. package/dist/types/embed/index.d.ts +20 -0
  48. package/dist/types/embed/index.d.ts.map +1 -0
  49. package/dist/types/embed/ref.d.ts +25 -0
  50. package/dist/types/embed/ref.d.ts.map +1 -0
  51. package/dist/types/embed/registry.d.ts +6 -0
  52. package/dist/types/embed/registry.d.ts.map +1 -0
  53. package/dist/types/embed/slot.d.ts +15 -0
  54. package/dist/types/embed/slot.d.ts.map +1 -0
  55. package/dist/types/embed/types.d.ts +53 -0
  56. package/dist/types/embed/types.d.ts.map +1 -0
  57. package/dist/types/embed/video.d.ts +3 -0
  58. package/dist/types/embed/video.d.ts.map +1 -0
  59. package/dist/types/formula.d.ts +15 -0
  60. package/dist/types/formula.d.ts.map +1 -0
  61. package/dist/types/index.d.ts +39 -0
  62. package/dist/types/index.d.ts.map +1 -0
  63. package/dist/types/input/ime.d.ts +27 -0
  64. package/dist/types/input/ime.d.ts.map +1 -0
  65. package/dist/types/input/keyboard.d.ts +21 -0
  66. package/dist/types/input/keyboard.d.ts.map +1 -0
  67. package/dist/types/layout/engine.d.ts +55 -0
  68. package/dist/types/layout/engine.d.ts.map +1 -0
  69. package/dist/types/layout/harness.d.ts +3 -0
  70. package/dist/types/layout/harness.d.ts.map +1 -0
  71. package/dist/types/layout/measure.d.ts +37 -0
  72. package/dist/types/layout/measure.d.ts.map +1 -0
  73. package/dist/types/layout/refMetrics.d.ts +5 -0
  74. package/dist/types/layout/refMetrics.d.ts.map +1 -0
  75. package/dist/types/layout/selfcheck.d.ts +2 -0
  76. package/dist/types/layout/selfcheck.d.ts.map +1 -0
  77. package/dist/types/layout/style.d.ts +4 -0
  78. package/dist/types/layout/style.d.ts.map +1 -0
  79. package/dist/types/layout/types.d.ts +133 -0
  80. package/dist/types/layout/types.d.ts.map +1 -0
  81. package/dist/types/layout/wrap.d.ts +65 -0
  82. package/dist/types/layout/wrap.d.ts.map +1 -0
  83. package/dist/types/model/blocks.d.ts +66 -0
  84. package/dist/types/model/blocks.d.ts.map +1 -0
  85. package/dist/types/model/document.d.ts +102 -0
  86. package/dist/types/model/document.d.ts.map +1 -0
  87. package/dist/types/model/fragment.d.ts +7 -0
  88. package/dist/types/model/fragment.d.ts.map +1 -0
  89. package/dist/types/model/markers.d.ts +14 -0
  90. package/dist/types/model/markers.d.ts.map +1 -0
  91. package/dist/types/model/types.d.ts +155 -0
  92. package/dist/types/model/types.d.ts.map +1 -0
  93. package/dist/types/model/virtualBlock.d.ts +44 -0
  94. package/dist/types/model/virtualBlock.d.ts.map +1 -0
  95. package/dist/types/mutations/apply.d.ts +14 -0
  96. package/dist/types/mutations/apply.d.ts.map +1 -0
  97. package/dist/types/mutations/index.d.ts +15 -0
  98. package/dist/types/mutations/index.d.ts.map +1 -0
  99. package/dist/types/mutations/invert.d.ts +21 -0
  100. package/dist/types/mutations/invert.d.ts.map +1 -0
  101. package/dist/types/mutations/ranges.d.ts +39 -0
  102. package/dist/types/mutations/ranges.d.ts.map +1 -0
  103. package/dist/types/mutations/registry.d.ts +27 -0
  104. package/dist/types/mutations/registry.d.ts.map +1 -0
  105. package/dist/types/mutations/selection.d.ts +12 -0
  106. package/dist/types/mutations/selection.d.ts.map +1 -0
  107. package/dist/types/mutations/selfcheck.d.ts +2 -0
  108. package/dist/types/mutations/selfcheck.d.ts.map +1 -0
  109. package/dist/types/mutations/transform.d.ts +33 -0
  110. package/dist/types/mutations/transform.d.ts.map +1 -0
  111. package/dist/types/mutations/types.d.ts +128 -0
  112. package/dist/types/mutations/types.d.ts.map +1 -0
  113. package/dist/types/operations/context.d.ts +47 -0
  114. package/dist/types/operations/context.d.ts.map +1 -0
  115. package/dist/types/operations/entity.d.ts +18 -0
  116. package/dist/types/operations/entity.d.ts.map +1 -0
  117. package/dist/types/operations/harness.d.ts +54 -0
  118. package/dist/types/operations/harness.d.ts.map +1 -0
  119. package/dist/types/operations/index.d.ts +20 -0
  120. package/dist/types/operations/index.d.ts.map +1 -0
  121. package/dist/types/operations/primitives.d.ts +35 -0
  122. package/dist/types/operations/primitives.d.ts.map +1 -0
  123. package/dist/types/operations/resolve.d.ts +31 -0
  124. package/dist/types/operations/resolve.d.ts.map +1 -0
  125. package/dist/types/operations/selfcheck.d.ts +2 -0
  126. package/dist/types/operations/selfcheck.d.ts.map +1 -0
  127. package/dist/types/operations/slice.d.ts +28 -0
  128. package/dist/types/operations/slice.d.ts.map +1 -0
  129. package/dist/types/operations/style.d.ts +20 -0
  130. package/dist/types/operations/style.d.ts.map +1 -0
  131. package/dist/types/operations/table.d.ts +14 -0
  132. package/dist/types/operations/table.d.ts.map +1 -0
  133. package/dist/types/operations/text.d.ts +20 -0
  134. package/dist/types/operations/text.d.ts.map +1 -0
  135. package/dist/types/operations/virtualBlock.d.ts +44 -0
  136. package/dist/types/operations/virtualBlock.d.ts.map +1 -0
  137. package/dist/types/paint/canvasPainter.d.ts +37 -0
  138. package/dist/types/paint/canvasPainter.d.ts.map +1 -0
  139. package/dist/types/paint/decorations.d.ts +19 -0
  140. package/dist/types/paint/decorations.d.ts.map +1 -0
  141. package/dist/types/paint/htmlPainter.d.ts +19 -0
  142. package/dist/types/paint/htmlPainter.d.ts.map +1 -0
  143. package/dist/types/paint/types.d.ts +36 -0
  144. package/dist/types/paint/types.d.ts.map +1 -0
  145. package/package.json +64 -4
@@ -0,0 +1,155 @@
1
+ export type HeadingLevel = 0 | 1 | 2 | 3;
2
+ export type Align = 'left' | 'center' | 'right';
3
+ export type ListKind = 'none' | 'ul' | 'ol';
4
+ export type StyleType = 'text' | 'paragraph' | 'table' | 'cell' | 'image' | 'link';
5
+ export type UnderlineStyle = 'single' | 'double' | 'wavy' | 'dotted' | 'marker';
6
+ export type TextFill = 'solid' | 'rainbow' | 'sunset';
7
+ export interface TextProps {
8
+ bold?: boolean;
9
+ italic?: boolean;
10
+ underline?: boolean;
11
+ underlineStyle?: UnderlineStyle;
12
+ strikethrough?: boolean;
13
+ fontSize?: number;
14
+ /**
15
+ * CSS font-family 栈。须具名或宿主 CSS 变量(如 `var(--Body-Medium-Font, Manrope)`)。
16
+ * 测宽会在挂载后改用 getComputedStyle 解析后的值。不要用 `system-ui`。
17
+ */
18
+ fontFamily?: string;
19
+ /** 字重,默认 400。`bold: true` 时仍为 700。 */
20
+ fontWeight?: number;
21
+ color?: string;
22
+ fill?: TextFill;
23
+ }
24
+ export interface ParagraphProps {
25
+ heading?: HeadingLevel;
26
+ align?: Align;
27
+ list?: ListKind;
28
+ indent?: number;
29
+ /** 非空时此段属于同一分组;末段末尾回车新段不再继承。空串表示无分组。 */
30
+ groupId?: string;
31
+ }
32
+ export interface TableProps {
33
+ colWidths?: number[];
34
+ }
35
+ export interface CellProps {
36
+ background?: string;
37
+ }
38
+ export interface ImageProps {
39
+ entityId: string;
40
+ }
41
+ export interface LinkProps {
42
+ url: string;
43
+ }
44
+ export type StyleProps = TextProps | ParagraphProps | TableProps | CellProps | ImageProps | LinkProps;
45
+ /** 外链默认色 */
46
+ export declare const LINK_COLOR = "#2374d1";
47
+ export interface StyleSpan {
48
+ start: number;
49
+ end: number;
50
+ type: StyleType;
51
+ props: StyleProps;
52
+ }
53
+ /** 行内嵌入对象:挂在 `*` 占位符上的实体类型 */
54
+ export type EmbedKind = 'image' | 'video' | 'code' | 'formula' | 'slot' | 'ref' | 'host';
55
+ export type SlotKind = 'text' | 'image' | 'select';
56
+ export type MediaKind = EmbedKind;
57
+ export interface EmbedEntity {
58
+ id: string;
59
+ kind?: EmbedKind;
60
+ width: number;
61
+ height: number;
62
+ src?: string;
63
+ language?: string;
64
+ code?: string;
65
+ latex?: string;
66
+ displayMode?: boolean;
67
+ slotKind?: SlotKind;
68
+ label?: string;
69
+ slotValue?: string;
70
+ slotOptions?: string[];
71
+ float?: 'left' | 'right';
72
+ fragmentId?: string;
73
+ /**
74
+ * 宿主渲染型嵌入对象(kind:'host')承载的业务数据。SDK 不解释其内容,只负责
75
+ * 存取、随实体序列化、在数据变化时通知宿主渲染器重渲。宿主通常在此存业务对象
76
+ * 的引用 id(引用式承载),完整数据由宿主自己的 store 解析。
77
+ */
78
+ data?: unknown;
79
+ /** host 型嵌入对象的类型标识(如 'objectRef'),由宿主定义,SDK 原样透传给渲染器。 */
80
+ hostType?: string;
81
+ }
82
+ export interface Fragment {
83
+ id: string;
84
+ title?: string;
85
+ slice: Slice;
86
+ }
87
+ /** @deprecated 使用 EmbedEntity;保留别名以免切片/布局大面积改名 */
88
+ export type ImageEntity = EmbedEntity;
89
+ /** 视频默认宽高比 */
90
+ export declare const VIDEO_ASPECT: number;
91
+ /** 虚拟块种类:region 是一层皮,slot 是最内层文本槽。 */
92
+ export type VirtualBlockKind = 'region' | 'slot';
93
+ /**
94
+ * 虚拟块的皮和文字缺省。块皮(底、边、圆角、内边距)只能放这里;
95
+ * 文字字段与 {@link TextProps} 对齐,作排版期 fallback,不是 applyStyle 轨道。
96
+ */
97
+ export interface VirtualBlockChrome {
98
+ background?: string;
99
+ borderColor?: string;
100
+ borderWidth?: number;
101
+ radius?: number;
102
+ paddingX?: number;
103
+ paddingY?: number;
104
+ color?: string;
105
+ fontSize?: number;
106
+ fontFamily?: string;
107
+ fontWeight?: number;
108
+ bold?: boolean;
109
+ italic?: boolean;
110
+ /** 仅 slot:empty 时用这个色画 placeholder */
111
+ placeholderColor?: string;
112
+ }
113
+ /**
114
+ * 盖在同一条 spacers 上的可嵌套区间。不占额外字符,不是实体、不是 fragment。
115
+ * 坐标是模型半开区间 [start, end)。
116
+ */
117
+ export interface VirtualBlock {
118
+ id: string;
119
+ parentId: string | null;
120
+ kind: VirtualBlockKind;
121
+ start: number;
122
+ end: number;
123
+ chrome: VirtualBlockChrome;
124
+ placeholder?: string;
125
+ empty?: boolean;
126
+ }
127
+ export interface Slice {
128
+ text: string;
129
+ styles: StyleSpan[];
130
+ entities: ImageEntity[];
131
+ fragments?: Fragment[];
132
+ virtualBlocks?: VirtualBlock[];
133
+ }
134
+ export interface Selection {
135
+ anchor: number;
136
+ focus: number;
137
+ }
138
+ export declare function selStart(sel: Selection): number;
139
+ export declare function selEnd(sel: Selection): number;
140
+ export declare function isCollapsed(sel: Selection): boolean;
141
+ export declare const DEFAULT_TEXT: Required<Pick<TextProps, 'fontSize' | 'color'>> & TextProps;
142
+ export declare const DEFAULT_PARAGRAPH: Required<ParagraphProps>;
143
+ /** 列表最大嵌套层级 */
144
+ export declare const MAX_LIST_INDENT = 8;
145
+ export declare const HEADING_TEXT: Record<HeadingLevel, TextProps>;
146
+ export declare function hasTextProps(props: TextProps): boolean;
147
+ export declare function textPropsEqual(a: TextProps, b: TextProps): boolean;
148
+ export declare function underlineKind(style: TextProps): UnderlineStyle | 'none';
149
+ export declare function paraPropsEqual(a: ParagraphProps, b: ParagraphProps): boolean;
150
+ export declare function cloneStyle(span: StyleSpan): StyleSpan;
151
+ export declare function cloneEntity(entity: ImageEntity): ImageEntity;
152
+ export declare function cloneVirtualBlock(block: VirtualBlock): VirtualBlock;
153
+ /** 虚拟块 chrome 上与 TextProps 对齐的文字缺省。 */
154
+ export declare function chromeTextProps(chrome: VirtualBlockChrome): TextProps;
155
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/model/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * 虚拟块区间表的机械运算:挪坐标、裁切、包含判定。
3
+ *
4
+ * 合法性(不交叉、slot 是叶子)由 Operation 保证。这里只做和 style 同类的
5
+ * 闭开区间算术,以及 Slice 裁切时的平移。
6
+ */
7
+ import { VirtualBlock } from './types';
8
+ export declare function shiftVirtualBlocksOnInsert(blocks: Iterable<VirtualBlock>, index: number, len: number): VirtualBlock[];
9
+ export declare function shiftVirtualBlocksOnDelete(blocks: Iterable<VirtualBlock>, start: number, end: number): VirtualBlock[];
10
+ /** 半开区间是否相交(相邻不算)。 */
11
+ export declare function rangesOverlap(a: {
12
+ start: number;
13
+ end: number;
14
+ }, b: {
15
+ start: number;
16
+ end: number;
17
+ }): boolean;
18
+ /** 是否交叉:相交但谁也不包含谁。 */
19
+ export declare function rangesCross(a: {
20
+ start: number;
21
+ end: number;
22
+ }, b: {
23
+ start: number;
24
+ end: number;
25
+ }): boolean;
26
+ /** a 是否包含 b(相等也算包含)。 */
27
+ export declare function rangeContains(a: {
28
+ start: number;
29
+ end: number;
30
+ }, b: {
31
+ start: number;
32
+ end: number;
33
+ }): boolean;
34
+ export declare function depthOf(block: VirtualBlock, byId: Map<string, VirtualBlock>): number;
35
+ /** 外层在前:覆盖更长的、同长则更浅的排前面。 */
36
+ export declare function sortOuterToInner(blocks: VirtualBlock[], byId?: Map<string, VirtualBlock>): VirtualBlock[];
37
+ export declare function ancestorChain(block: VirtualBlock, byId: Map<string, VirtualBlock>): VirtualBlock[];
38
+ /**
39
+ * 裁到半开区间 [from, to) 并平移到以 0 为原点。
40
+ * 父块若没被裁进来,parentId 置 null。
41
+ */
42
+ export declare function clipVirtualBlocks(blocks: Iterable<VirtualBlock>, from: number, to: number): VirtualBlock[];
43
+ export declare function offsetVirtualBlocks(blocks: Iterable<VirtualBlock>, offset: number): VirtualBlock[];
44
+ //# sourceMappingURL=virtualBlock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtualBlock.d.ts","sourceRoot":"","sources":["../../../src/model/virtualBlock.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAqB,YAAY,EAAE,MAAM,SAAS,CAAC;AAE1D,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC9B,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,GACV,YAAY,EAAE,CAOhB;AAED,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC9B,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,GACV,YAAY,EAAE,CAkBhB;AAED,sBAAsB;AACtB,wBAAgB,aAAa,CAAC,CAAC,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAE3G;AAED,sBAAsB;AACtB,wBAAgB,WAAW,CAAC,CAAC,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAEzG;AAED,wBAAwB;AACxB,wBAAgB,aAAa,CAAC,CAAC,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAE3G;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,MAAM,CAYpF;AAED,4BAA4B;AAC5B,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,YAAY,EAAE,CAQzG;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,YAAY,EAAE,CAUlG;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC9B,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,GACT,YAAY,EAAE,CAmBhB;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,EAAE,CAGlG"}
@@ -0,0 +1,14 @@
1
+ import { DocumentModel } from '../model/document';
2
+ import { Mutation, MutationType } from './types';
3
+ export type ApplierFor<T extends MutationType> = (doc: DocumentModel, mutation: Extract<Mutation, {
4
+ type: T;
5
+ }>) => void;
6
+ /** 每种 mutation 一个 applier。少一种编译不过。 */
7
+ export type Appliers = {
8
+ [T in MutationType]: ApplierFor<T>;
9
+ };
10
+ export declare const appliers: Appliers;
11
+ export declare function applyMutation(doc: DocumentModel, mutation: Mutation): void;
12
+ /** 依次应用一串 mutation。 */
13
+ export declare function applyMutations(doc: DocumentModel, mutations: Mutation[]): void;
14
+ //# sourceMappingURL=apply.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../../src/mutations/apply.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAU,MAAM,SAAS,CAAC;AAEzD,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,YAAY,IAAI,CAC/C,GAAG,EAAE,aAAa,EAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE;IAAE,IAAI,EAAE,CAAC,CAAA;CAAE,CAAC,KACrC,IAAI,CAAC;AAEV,sCAAsC;AACtC,MAAM,MAAM,QAAQ,GAAG;KAAG,CAAC,IAAI,YAAY,GAAG,UAAU,CAAC,CAAC,CAAC;CAAE,CAAC;AAE9D,eAAO,MAAM,QAAQ,EAAE,QA8DtB,CAAC;AAEF,wBAAgB,aAAa,CAAC,GAAG,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAG1E;AAED,uBAAuB;AACvB,wBAAgB,cAAc,CAAC,GAAG,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,CAE9E"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Mutation 层出口。
3
+ *
4
+ * 上层(operations / edits)只从这里引,不要深入到具体文件 —— 层内的文件划分
5
+ * 是实现细节,会变。
6
+ */
7
+ export type { AddEntityMutation, AddFragmentMutation, AddVirtualBlockMutation, ApplyStyleMutation, DeleteEntityMutation, DeleteFragmentMutation, DeleteSpacersMutation, DeleteVirtualBlockMutation, InsertSpacersMutation, MultiMutation, Mutation, MutationType, NullMutation, ScopedMutation, UpdateEntityMutation, UpdateVirtualBlockMutation } from './types';
8
+ export { NULL_MUTATION, addEntity, addFragment, addVirtualBlock, applyStyle, deleteEntity, deleteFragment, deleteSpacers, deleteSpacersHalfOpen, deleteVirtualBlock, insertSpacers, multi, reverse, scoped, unwrap, updateEntity, updateVirtualBlock } from './types';
9
+ export { applyMutation, applyMutations } from './apply';
10
+ export { applyAndInvert, invertMutation } from './invert';
11
+ export { transform, transformBoth, transformCommands } from './transform';
12
+ export { transformIndex, transformSelection } from './selection';
13
+ export type { MaybeRange, Range } from './ranges';
14
+ export { leadingLength, newRange, rangeContains, rangeEquals, rangeLength, shiftIndex, shiftIndexExclusive, shiftRange, shiftRangeExclusive, transformCoordinateAgainstDeletedRange, transformRangeAgainstDeletedRange } from './ranges';
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/mutations/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EACV,iBAAiB,EACjB,mBAAmB,EACnB,uBAAuB,EACvB,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EACrB,0BAA0B,EAC1B,qBAAqB,EACrB,aAAa,EACb,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,oBAAoB,EACpB,0BAA0B,EAC3B,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,aAAa,EACb,SAAS,EACT,WAAW,EACX,eAAe,EACf,UAAU,EACV,YAAY,EACZ,cAAc,EACd,aAAa,EACb,qBAAqB,EACrB,kBAAkB,EAClB,aAAa,EACb,KAAK,EACL,OAAO,EACP,MAAM,EACN,MAAM,EACN,YAAY,EACZ,kBAAkB,EACnB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAG1E,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGjE,YAAY,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,EACL,aAAa,EACb,QAAQ,EACR,aAAa,EACb,WAAW,EACX,WAAW,EACX,UAAU,EACV,mBAAmB,EACnB,UAAU,EACV,mBAAmB,EACnB,sCAAsC,EACtC,iCAAiC,EAClC,MAAM,UAAU,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { DocumentModel } from '../model/document';
2
+ import { Mutation, MutationType } from './types';
3
+ export type InverterFor<T extends MutationType> = (doc: DocumentModel, mutation: Extract<Mutation, {
4
+ type: T;
5
+ }>) => Mutation;
6
+ /** 每种 mutation 一个 inverter。少一种编译不过。 */
7
+ export type Inverters = {
8
+ [T in MutationType]: InverterFor<T>;
9
+ };
10
+ export declare const inverters: Inverters;
11
+ /**
12
+ * 算出 mutation 的逆。必须在 mutation 被应用**之前**调用。
13
+ * 组合操作请改用 {@link applyAndInvert}。
14
+ */
15
+ export declare function invertMutation(doc: DocumentModel, mutation: Mutation): Mutation;
16
+ /**
17
+ * 应用 mutation,同时返回它的逆。
18
+ * 组合操作会逐条交错处理,逆按相反顺序排列。
19
+ */
20
+ export declare function applyAndInvert(doc: DocumentModel, mutation: Mutation): Mutation;
21
+ //# sourceMappingURL=invert.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invert.d.ts","sourceRoot":"","sources":["../../../src/mutations/invert.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,OAAO,EAUL,QAAQ,EACR,YAAY,EAOb,MAAM,SAAS,CAAC;AAgBjB,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,YAAY,IAAI,CAChD,GAAG,EAAE,aAAa,EAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE;IAAE,IAAI,EAAE,CAAC,CAAA;CAAE,CAAC,KACrC,QAAQ,CAAC;AAEd,uCAAuC;AACvC,MAAM,MAAM,SAAS,GAAG;KAAG,CAAC,IAAI,YAAY,GAAG,WAAW,CAAC,CAAC,CAAC;CAAE,CAAC;AAEhE,eAAO,MAAM,SAAS,EAAE,SAqFvB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,GAAG,QAAQ,CAE/E;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,GAAG,QAAQ,CAQ/E"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * 闭区间与索引变换。
3
+ *
4
+ * 注意区间语义:这一层全部用**闭区间** `[min, max]`,`min > max` 即为空。
5
+ * 文档模型对外的 `deleteRange(start, end)` 用的是半开区间 `[start, end)`,
6
+ * 两者在 mutation 的边界上转换(见 mutations.ts 的 deleteSpacers)。
7
+ * 不要把两种语义混着用,差一位的 bug 都出在这里。
8
+ */
9
+ export interface Range {
10
+ min: number;
11
+ max: number;
12
+ }
13
+ /** 空区间用 null 表示。 */
14
+ export type MaybeRange = Range | null;
15
+ export declare function newRange(min: number, max: number): MaybeRange;
16
+ export declare function rangeContains(range: Range, value: number): boolean;
17
+ export declare function rangeEquals(a: MaybeRange, b: MaybeRange): boolean;
18
+ /** 区间长度(闭区间,含两端)。 */
19
+ export declare function rangeLength(range: Range): number;
20
+ /** 把「位于 shiftPosition 及其之后」的坐标平移 offset。 */
21
+ export declare function shiftIndex(index: number, shiftPosition: number, offset: number): number;
22
+ /**
23
+ * 同上,但落在 shiftPosition 上的坐标**不动**。
24
+ * 选区的起点要用这个:在光标处插入字符,光标不该被推走。
25
+ */
26
+ export declare function shiftIndexExclusive(index: number, shiftPosition: number, offset: number): number;
27
+ export declare function shiftRange(range: MaybeRange, shiftPosition: number, offset: number): MaybeRange;
28
+ export declare function shiftRangeExclusive(range: MaybeRange, shiftPosition: number, offset: number): MaybeRange;
29
+ /** position 之前被删掉的长度。 */
30
+ export declare function leadingLength(position: number, range: Range): number;
31
+ export declare function transformCoordinateAgainstDeletedRange(position: number, deleted: Range): number;
32
+ /**
33
+ * 把一个区间放到「deleted 已被删除」的坐标系里。整段被删则返回空。
34
+ *
35
+ * 一般情况只需把坐标减去它前面被删掉的长度;但如果端点本身落在被删范围内,
36
+ * 这种平移不足以把它收回来,还要再多缩一位。
37
+ */
38
+ export declare function transformRangeAgainstDeletedRange(range: MaybeRange, deleted: Range): MaybeRange;
39
+ //# sourceMappingURL=ranges.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ranges.d.ts","sourceRoot":"","sources":["../../../src/mutations/ranges.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,KAAK;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED,oBAAoB;AACpB,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,IAAI,CAAC;AAEtC,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU,CAE7D;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAElE;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,GAAG,OAAO,CAGjE;AAED,qBAAqB;AACrB,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAEhD;AAED,4CAA4C;AAC5C,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEvF;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEhG;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,CAM/F;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,CAMxG;AAED,yBAAyB;AACzB,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,CAGpE;AAED,wBAAgB,sCAAsC,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,GAAG,MAAM,CAE/F;AAED;;;;;GAKG;AACH,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,GAAG,UAAU,CAM/F"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * 三套 handler 的汇总表。
3
+ *
4
+ * 加一种 mutation 时,编译器会在 appliers / inverters / transformers 三张表上
5
+ * 分别报缺失 ——「注册了没有」是编译期就能确认的事,不用去三个文件里 grep。
6
+ * 这张汇总表的作用是让同一种 mutation 的三个行为能在一处对照着看,
7
+ * 并给自检提供一份可遍历的类型清单。
8
+ *
9
+ * 分派入口仍在各自的文件里(applyMutation / invertMutation / transform),
10
+ * 因为 multi 的 handler 需要递归调用入口,放在同文件才不产生循环依赖。
11
+ */
12
+ import { MutationType } from './types';
13
+ import { Appliers } from './apply';
14
+ import { Inverters } from './invert';
15
+ import { Transformers } from './transform';
16
+ export interface MutationHandlers<T extends MutationType> {
17
+ apply: Appliers[T];
18
+ invert: Inverters[T];
19
+ transform: Transformers[T];
20
+ }
21
+ export type MutationRegistry = {
22
+ [T in MutationType]: MutationHandlers<T>;
23
+ };
24
+ export declare const mutationRegistry: MutationRegistry;
25
+ /** 全部 mutation 类型。由汇总表推出,不会和实现脱节。 */
26
+ export declare const MUTATION_TYPES: MutationType[];
27
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/mutations/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAY,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAa,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,YAAY,EAAgB,MAAM,aAAa,CAAC;AAEzD,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,YAAY;IACtD,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IACnB,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IACrB,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;CAC5B;AAED,MAAM,MAAM,gBAAgB,GAAG;KAAG,CAAC,IAAI,YAAY,GAAG,gBAAgB,CAAC,CAAC,CAAC;CAAE,CAAC;AAQ5E,eAAO,MAAM,gBAAgB,EAAE,gBAe9B,CAAC;AAEF,qCAAqC;AACrC,eAAO,MAAM,cAAc,EAAoC,YAAY,EAAE,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * 选区 rebase:别人的操作落地后,把本地光标/选区挪到正确的新位置。
3
+ *
4
+ * 插入点正好等于光标位置时,光标推不推走由 `shiftedByInserts` 决定:
5
+ * 本地刚敲下的字要跟着走(光标落在新字之后),而协作者在你光标处插入时
6
+ * 你的光标应该原地不动。默认按后者。
7
+ */
8
+ import { Selection } from '../model/types';
9
+ import { Mutation } from './types';
10
+ export declare function transformIndex(index: number, mutations: Mutation[], shiftedByInserts?: boolean): number;
11
+ export declare function transformSelection(sel: Selection, mutations: Mutation[], shiftedByInserts?: boolean): Selection;
12
+ //# sourceMappingURL=selection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection.d.ts","sourceRoot":"","sources":["../../../src/mutations/selection.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAU,MAAM,SAAS,CAAC;AAG3C,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,QAAQ,EAAE,EACrB,gBAAgB,UAAQ,GACvB,MAAM,CAcR;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,SAAS,EACd,SAAS,EAAE,QAAQ,EAAE,EACrB,gBAAgB,UAAQ,GACvB,SAAS,CAMX"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=selfcheck.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selfcheck.d.ts","sourceRoot":"","sources":["../../../src/mutations/selfcheck.ts"],"names":[],"mappings":""}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * OT 变换。
3
+ *
4
+ * `transform(a, b, aWins)` 的含义:b 已经被应用了,把 a 改写成能在「b 之后」
5
+ * 正确执行的形式。`aWins` 是并列时的优先级 —— 两个插入落在同一个下标时,
6
+ * 赢的一方留在原地,输的一方被推到后面。两端必须对同一对操作给出相反的
7
+ * `aWins`,否则会各自算出不同的结果,文档就分叉了。
8
+ */
9
+ import { Mutation, MutationType } from './types';
10
+ export type TransformerFor<T extends MutationType> = (cmd: Extract<Mutation, {
11
+ type: T;
12
+ }>, other: Mutation, aWins: boolean) => Mutation;
13
+ /** 每种 mutation 一个 transformer。少一种编译不过。 */
14
+ export type Transformers = {
15
+ [T in MutationType]: TransformerFor<T>;
16
+ };
17
+ export declare const transformers: Transformers;
18
+ /** 把 cmd 变换到「other 已应用」之后的坐标系里。 */
19
+ export declare function transform(cmd: Mutation, other: Mutation, aWins: boolean): Mutation;
20
+ /**
21
+ * 把一串操作变换到另一串之后。
22
+ *
23
+ * 关键在内层那次反向变换:a 列表里的第 i 条被 b[j] 变换的同时,b[j] 自己也要
24
+ * 被变换后的 a[i] 推一把,否则 a 的第 i+1 条再对上 b[j] 时,b[j] 还停在旧坐标系里,
25
+ * 结果就错了。
26
+ */
27
+ export declare function transformCommands(a: Mutation[], b: Mutation[], aWins: boolean): Mutation[];
28
+ /** 双向变换:同时得到 a'(在 b 之后执行)和 b'(在 a 之后执行)。 */
29
+ export declare function transformBoth(a: Mutation[], b: Mutation[], aWins?: boolean): {
30
+ a: Mutation[];
31
+ b: Mutation[];
32
+ };
33
+ //# sourceMappingURL=transform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../../src/mutations/transform.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAIL,QAAQ,EACR,YAAY,EAKb,MAAM,SAAS,CAAC;AA2FjB,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,YAAY,IAAI,CACnD,GAAG,EAAE,OAAO,CAAC,QAAQ,EAAE;IAAE,IAAI,EAAE,CAAC,CAAA;CAAE,CAAC,EACnC,KAAK,EAAE,QAAQ,EACf,KAAK,EAAE,OAAO,KACX,QAAQ,CAAC;AAEd,0CAA0C;AAC1C,MAAM,MAAM,YAAY,GAAG;KAAG,CAAC,IAAI,YAAY,GAAG,cAAc,CAAC,CAAC,CAAC;CAAE,CAAC;AAEtE,eAAO,MAAM,YAAY,EAAE,YA6F1B,CAAC;AAEF,mCAAmC;AACnC,wBAAgB,SAAS,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,GAAG,QAAQ,CAYlF;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,GAAG,QAAQ,EAAE,CAa1F;AAED,4CAA4C;AAC5C,wBAAgB,aAAa,CAC3B,CAAC,EAAE,QAAQ,EAAE,EACb,CAAC,EAAE,QAAQ,EAAE,EACb,KAAK,UAAO,GACX;IAAE,CAAC,EAAE,QAAQ,EAAE,CAAC;IAAC,CAAC,EAAE,QAAQ,EAAE,CAAA;CAAE,CAalC"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Mutation —— 文档变更的原子单元,也是 OT 变换的对象。
3
+ *
4
+ * 设计要点:
5
+ * - Mutation 是**纯数据**,可直接 JSON 序列化后走网络。行为(应用、变换、求逆、
6
+ * 合并)不挂在它身上,而是按 `type` 到注册表里查,见 registry.ts。
7
+ * - 索引一律是**闭区间**语义,`deleteSpacers` 的 `[startIndex, endIndex]` 含两端。
8
+ * 与文档模型半开区间的转换在 apply/invert 边界上做。
9
+ * - 上层的一次用户操作(比如「按退格」)通常展开成多条 mutation,
10
+ * 用 `multi` 打包成一步。
11
+ */
12
+ import { EmbedEntity, Fragment, StyleProps, StyleType, VirtualBlock } from '../model/types';
13
+ /** 在 insertBeforeIndex 之前插入这串 spacer。 */
14
+ export interface InsertSpacersMutation {
15
+ type: 'insertSpacers';
16
+ insertBeforeIndex: number;
17
+ spacers: string;
18
+ }
19
+ /** 删除闭区间 [startIndex, endIndex]。 */
20
+ export interface DeleteSpacersMutation {
21
+ type: 'deleteSpacers';
22
+ startIndex: number;
23
+ endIndex: number;
24
+ }
25
+ /** 给闭区间 [startIndex, endIndex] 覆盖一段样式。props 为 null 表示清除该类型。 */
26
+ export interface ApplyStyleMutation {
27
+ type: 'applyStyle';
28
+ styleType: StyleType;
29
+ startIndex: number;
30
+ endIndex: number;
31
+ props: StyleProps | null;
32
+ }
33
+ export interface AddEntityMutation {
34
+ type: 'addEntity';
35
+ entity: EmbedEntity;
36
+ }
37
+ export interface UpdateEntityMutation {
38
+ type: 'updateEntity';
39
+ entityId: string;
40
+ props: Partial<EmbedEntity>;
41
+ }
42
+ export interface DeleteEntityMutation {
43
+ type: 'deleteEntity';
44
+ entityId: string;
45
+ }
46
+ /**
47
+ * 新建一个同步块(fragment)。
48
+ *
49
+ * fragment 和 entity 一样按 id 寻址,不占主文档坐标空间,因此不参与下标变换。
50
+ * 提取同步块(promoteRange)时发这条,撤销即删除它。
51
+ */
52
+ export interface AddFragmentMutation {
53
+ type: 'addFragment';
54
+ fragment: Fragment;
55
+ }
56
+ /** 删除一个同步块。逆操作把整份 Fragment 原样加回来。 */
57
+ export interface DeleteFragmentMutation {
58
+ type: 'deleteFragment';
59
+ fragmentId: string;
60
+ }
61
+ /** 写入一个虚拟块。同 id 存在则整体替换。区间随字符插删由 applier 机械挪动。 */
62
+ export interface AddVirtualBlockMutation {
63
+ type: 'addVirtualBlock';
64
+ block: VirtualBlock;
65
+ }
66
+ /** 删除一个虚拟块。 */
67
+ export interface DeleteVirtualBlockMutation {
68
+ type: 'deleteVirtualBlock';
69
+ blockId: string;
70
+ }
71
+ /** 用完整值覆盖一个虚拟块(含区间与 chrome)。 */
72
+ export interface UpdateVirtualBlockMutation {
73
+ type: 'updateVirtualBlock';
74
+ blockId: string;
75
+ block: VirtualBlock;
76
+ }
77
+ /** 变换后被完全抵消的操作。应用时什么都不做。 */
78
+ export interface NullMutation {
79
+ type: 'null';
80
+ }
81
+ /** 一组按序执行的 mutation,构成一个不可分割的步骤。 */
82
+ export interface MultiMutation {
83
+ type: 'multi';
84
+ commands: Mutation[];
85
+ }
86
+ /**
87
+ * 把一条 mutation 定向到某个片段(同步块)的坐标空间里去执行。
88
+ *
89
+ * 片段的内容是独立的一条字符流,下标和主文档不共享。用这层包装之后,
90
+ * 片段内部的编辑和主文档编辑就是同一种东西了:进同一个撤销栈、走同一套变换。
91
+ * 不同片段的操作天然不冲突,变换时直接原样放行。
92
+ */
93
+ export interface ScopedMutation {
94
+ type: 'scoped';
95
+ fragmentId: string;
96
+ inner: Mutation;
97
+ }
98
+ export type Mutation = InsertSpacersMutation | DeleteSpacersMutation | ApplyStyleMutation | AddEntityMutation | UpdateEntityMutation | DeleteEntityMutation | AddFragmentMutation | DeleteFragmentMutation | AddVirtualBlockMutation | DeleteVirtualBlockMutation | UpdateVirtualBlockMutation | NullMutation | MultiMutation | ScopedMutation;
99
+ export type MutationType = Mutation['type'];
100
+ export declare function insertSpacers(insertBeforeIndex: number, spacers: string): Mutation;
101
+ /** 入参是闭区间。 */
102
+ export declare function deleteSpacers(startIndex: number, endIndex: number): Mutation;
103
+ /** 从半开区间 [start, end) 构造,便于和文档模型对接。 */
104
+ export declare function deleteSpacersHalfOpen(start: number, end: number): Mutation;
105
+ export declare function applyStyle(styleType: StyleType, startIndex: number, endIndex: number, props: StyleProps | null): Mutation;
106
+ export declare function addEntity(entity: EmbedEntity): Mutation;
107
+ export declare function updateEntity(entityId: string, props: Partial<EmbedEntity>): Mutation;
108
+ export declare function deleteEntity(entityId: string): Mutation;
109
+ export declare function addFragment(fragment: Fragment): Mutation;
110
+ export declare function deleteFragment(fragmentId: string): Mutation;
111
+ export declare function addVirtualBlock(block: VirtualBlock): Mutation;
112
+ export declare function deleteVirtualBlock(blockId: string): Mutation;
113
+ export declare function updateVirtualBlock(blockId: string, block: VirtualBlock): Mutation;
114
+ export declare const NULL_MUTATION: NullMutation;
115
+ /**
116
+ * 把 inner 定向到某个片段。
117
+ *
118
+ * inner 是组合时会摊成「一串各自定向的单条」,这样 scoped 始终只包一条实操,
119
+ * 逐条求逆和逐条变换才对得上。
120
+ */
121
+ export declare function scoped(fragmentId: string, inner: Mutation): Mutation;
122
+ /** 打包成一步。会摊平嵌套的 multi、滤掉 null;空则返回 null mutation。 */
123
+ export declare function multi(commands: Mutation[]): Mutation;
124
+ /** 摊平成一维列表,null 被滤掉。 */
125
+ export declare function unwrap(mutation: Mutation): Mutation[];
126
+ /** multi 的逆序摊平。求逆时用:撤销一组操作要从最后一条倒着来。 */
127
+ export declare function reverse(mutations: Mutation[]): Mutation[];
128
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/mutations/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Operation 的执行上下文。
3
+ *
4
+ * Operation 通过 `emit` 改文档,通过 `doc` 读文档。`emit` 是**立即生效**的 ——
5
+ * 发一条就写一条,所以同一个 Operation 里后续的读能看到前面的效果。复杂操作
6
+ * 因此可以「读—写—再读」,比如先插入换行、再读出新的段落边界、再给新段落发样式。
7
+ *
8
+ * 逆操作在写入**之前**算出来(很多逆必须读到变更前的文档),正逆两串一起收集。
9
+ */
10
+ import { DocumentModel } from '../model/document';
11
+ import { Selection } from '../model/types';
12
+ import { Mutation } from '../mutations';
13
+ export interface OperationContext {
14
+ /** 读文档。写只能走 emit */
15
+ readonly doc: DocumentModel;
16
+ /** 当前选区 */
17
+ selection(): Selection;
18
+ /** 移动选区。不产生 mutation */
19
+ select(next: Selection): void;
20
+ /** 发一条 mutation:先求逆、立即写入、正逆两串都收集 */
21
+ emit(mutation: Mutation): void;
22
+ }
23
+ /** Operation 就是一个拿 context 的函数。组合就是传同一个 ctx 下去。 */
24
+ export type Operation<R = void> = (ctx: OperationContext) => R;
25
+ export interface OperationRun {
26
+ /** 正向操作,按执行顺序 */
27
+ forward: Mutation[];
28
+ /** 逆向操作,已按相反顺序排好 */
29
+ inverse: Mutation[];
30
+ selectionBefore: Selection;
31
+ selectionAfter: Selection;
32
+ }
33
+ /**
34
+ * 把上下文切到某个片段(同步块)的坐标空间。
35
+ *
36
+ * 片段有自己的一条字符流,下标从 0 起,和主文档不共享。切过去之后,所有
37
+ * Operation 都能原样复用 —— 它们读到的是片段模型,发出的 mutation 自动包上
38
+ * `scoped`,落进的还是外层那一份操作串。选区共用外层的格子,因为调用方一开始
39
+ * 就是拿片段选区起的事务。
40
+ */
41
+ export declare function scopeContext(outer: OperationContext, fragmentId: string): OperationContext;
42
+ /** 跑一个 Operation,拿到它产生的操作串与选区变化。 */
43
+ export declare function runOperation<R>(doc: DocumentModel, selection: Selection, op: Operation<R>): {
44
+ run: OperationRun;
45
+ result: R;
46
+ };
47
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/operations/context.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAiD,MAAM,cAAc,CAAC;AAEvF,MAAM,WAAW,gBAAgB;IAC/B,oBAAoB;IACpB,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC;IAC5B,WAAW;IACX,SAAS,IAAI,SAAS,CAAC;IACvB,wBAAwB;IACxB,MAAM,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAAC;IAC9B,oCAAoC;IACpC,IAAI,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;CAChC;AAED,mDAAmD;AACnD,MAAM,MAAM,SAAS,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,gBAAgB,KAAK,CAAC,CAAC;AAE/D,MAAM,WAAW,YAAY;IAC3B,iBAAiB;IACjB,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,oBAAoB;IACpB,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,eAAe,EAAE,SAAS,CAAC;IAC3B,cAAc,EAAE,SAAS,CAAC;CAC3B;AA6BD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,GAAG,gBAAgB,CAO1F;AAED,oCAAoC;AACpC,wBAAgB,YAAY,CAAC,CAAC,EAC5B,GAAG,EAAE,aAAa,EAClB,SAAS,EAAE,SAAS,EACpB,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,GACf;IAAE,GAAG,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,CAAC,CAAA;CAAE,CAYlC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * 实体类 Operation:图片、公式、代码块、槽位、同步块引用。
3
+ *
4
+ * 实体本身存在 id → 实体的表里,字符流上只留一个 IMAGE 占位符,
5
+ * 由一条 image 样式区间把占位符和实体 id 绑起来。插一个实体因此是三条 mutation。
6
+ */
7
+ import { ImageEntity } from '../model/types';
8
+ import { Operation } from './context';
9
+ export type NewEntity = Omit<ImageEntity, 'id' | 'kind'> & {
10
+ id?: string;
11
+ kind?: ImageEntity['kind'];
12
+ };
13
+ /** 在 index 处插入一个实体,返回占位符之后的位置。 */
14
+ export declare function insertImage(index: number, entity: NewEntity): Operation<number>;
15
+ export type ImagePatch = Partial<Pick<ImageEntity, 'width' | 'height' | 'code' | 'language' | 'latex' | 'src' | 'displayMode' | 'slotKind' | 'label' | 'slotValue' | 'slotOptions' | 'data' | 'hostType'>>;
16
+ /** 改实体属性。undefined 的字段代表「不动」,在这里就剔掉,别让它盖掉原值。 */
17
+ export declare function updateImage(id: string, patch: ImagePatch): Operation;
18
+ //# sourceMappingURL=entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity.d.ts","sourceRoot":"","sources":["../../../src/operations/entity.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAe,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAI1D,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC,MAAM,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,MAAM,CAAC,GAAG;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CAAE,CAAC;AAEvG,kCAAkC;AAClC,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAa/E;AAED,MAAM,MAAM,UAAU,GAAG,OAAO,CAC9B,IAAI,CACF,WAAW,EACT,OAAO,GACP,QAAQ,GACR,MAAM,GACN,UAAU,GACV,OAAO,GACP,KAAK,GACL,aAAa,GACb,UAAU,GACV,OAAO,GACP,WAAW,GACX,aAAa,GACb,MAAM,GACN,UAAU,CACb,CACF,CAAC;AAEF,gDAAgD;AAChD,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,SAAS,CAUpE"}