@one2x/medeo-rte 2.0.2 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +5657 -5058
- package/dist/index.js.map +1 -1
- package/dist/style.css +56 -5
- package/dist/types/editor/caretBlink.d.ts +43 -0
- package/dist/types/editor/caretBlink.d.ts.map +1 -0
- package/dist/types/editor/caretBlink.selfcheck.d.ts +2 -0
- package/dist/types/editor/caretBlink.selfcheck.d.ts.map +1 -0
- package/dist/types/editor/composition.d.ts +36 -0
- package/dist/types/editor/composition.d.ts.map +1 -0
- package/dist/types/editor/events.d.ts +61 -0
- package/dist/types/editor/events.d.ts.map +1 -0
- package/dist/types/editor/markNav.d.ts +121 -0
- package/dist/types/editor/markNav.d.ts.map +1 -0
- package/dist/types/editor/markNav.selfcheck.d.ts +2 -0
- package/dist/types/editor/markNav.selfcheck.d.ts.map +1 -0
- package/dist/types/editor/overlay.d.ts +91 -0
- package/dist/types/editor/overlay.d.ts.map +1 -0
- package/dist/types/editor/overlay.selfcheck.d.ts +2 -0
- package/dist/types/editor/overlay.selfcheck.d.ts.map +1 -0
- package/dist/types/editor/overlayDom.d.ts +59 -0
- package/dist/types/editor/overlayDom.d.ts.map +1 -0
- package/dist/types/editor/pointer.d.ts +114 -0
- package/dist/types/editor/pointer.d.ts.map +1 -0
- package/dist/types/editor/pointer.selfcheck.d.ts +2 -0
- package/dist/types/editor/pointer.selfcheck.d.ts.map +1 -0
- package/dist/types/editor/refEditing.d.ts +50 -0
- package/dist/types/editor/refEditing.d.ts.map +1 -0
- package/dist/types/editor/refEditing.selfcheck.d.ts +2 -0
- package/dist/types/editor/refEditing.selfcheck.d.ts.map +1 -0
- package/dist/types/editor/session.d.ts +69 -0
- package/dist/types/editor/session.d.ts.map +1 -0
- package/dist/types/editor/skinState.d.ts +57 -0
- package/dist/types/editor/skinState.d.ts.map +1 -0
- package/dist/types/editor/skinState.selfcheck.d.ts +2 -0
- package/dist/types/editor/skinState.selfcheck.d.ts.map +1 -0
- package/dist/types/editor.d.ts +70 -156
- package/dist/types/editor.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/layout/engine.d.ts.map +1 -1
- package/dist/types/layout/types.d.ts +2 -0
- package/dist/types/layout/types.d.ts.map +1 -1
- package/dist/types/layout/wrap.d.ts +1 -0
- package/dist/types/layout/wrap.d.ts.map +1 -1
- package/dist/types/model/document.d.ts +16 -0
- package/dist/types/model/document.d.ts.map +1 -1
- package/dist/types/model/types.d.ts +6 -0
- package/dist/types/model/types.d.ts.map +1 -1
- package/dist/types/model/virtualBlock.d.ts +4 -0
- package/dist/types/model/virtualBlock.d.ts.map +1 -1
- package/dist/types/mutations/apply.d.ts.map +1 -1
- package/dist/types/paint/canvasPainter.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import type { ImageBox } from '../layout/types';
|
|
2
|
+
import type { RefEditTarget } from './session';
|
|
3
|
+
/** 拖拽会话。null 表示没在拖。 */
|
|
4
|
+
export type DragSession =
|
|
5
|
+
/** 在正文里拖选。anchor 是按下时的选区锚点 */
|
|
6
|
+
{
|
|
7
|
+
kind: 'select';
|
|
8
|
+
anchor: number;
|
|
9
|
+
}
|
|
10
|
+
/** 在同步块内部拖选。anchor 是片段坐标 */
|
|
11
|
+
| {
|
|
12
|
+
kind: 'refSelect';
|
|
13
|
+
anchor: number;
|
|
14
|
+
}
|
|
15
|
+
/** 拖右下角手柄缩放嵌入对象 */
|
|
16
|
+
| {
|
|
17
|
+
kind: 'embedResize';
|
|
18
|
+
id: string;
|
|
19
|
+
startX: number;
|
|
20
|
+
startW: number;
|
|
21
|
+
startH: number;
|
|
22
|
+
}
|
|
23
|
+
/** 拖表格列边界 */
|
|
24
|
+
| {
|
|
25
|
+
kind: 'colResize';
|
|
26
|
+
tableStart: number;
|
|
27
|
+
col: number;
|
|
28
|
+
startX: number;
|
|
29
|
+
widths: number[];
|
|
30
|
+
};
|
|
31
|
+
/** 列边界命中结果,同 `hitColBorder` */
|
|
32
|
+
export interface ColBorderHit {
|
|
33
|
+
tableStart: number;
|
|
34
|
+
col: number;
|
|
35
|
+
widths: number[];
|
|
36
|
+
}
|
|
37
|
+
/** 按下时门面算好的事实 */
|
|
38
|
+
export interface PointerDownFacts {
|
|
39
|
+
/** 点中的引用芯片(只在点中的是 ref 时给) */
|
|
40
|
+
refBox: ImageBox | null;
|
|
41
|
+
/** 正在编辑的同步块 */
|
|
42
|
+
refEdit: RefEditTarget | null;
|
|
43
|
+
/**
|
|
44
|
+
* 点在交互型嵌入对象(代码块、公式、宿主芯片……)的节点上。`onControl` 表示点在里面
|
|
45
|
+
* 真正的输入控件上;`index` 是它在文档里的下标,取不到时为 null。没点在上面给 null。
|
|
46
|
+
*/
|
|
47
|
+
embed: {
|
|
48
|
+
index: number | null;
|
|
49
|
+
onControl: boolean;
|
|
50
|
+
} | null;
|
|
51
|
+
/** 上一次点击后还在继续输入,这次点击只恢复光标 */
|
|
52
|
+
keepTyping: boolean;
|
|
53
|
+
shift: boolean;
|
|
54
|
+
/** Cmd 或 Ctrl */
|
|
55
|
+
mod: boolean;
|
|
56
|
+
/** 点中的表格列边界 */
|
|
57
|
+
colBorder: ColBorderHit | null;
|
|
58
|
+
}
|
|
59
|
+
/** 按下时点中的是什么 */
|
|
60
|
+
export type PointerDownTarget =
|
|
61
|
+
/** 不在同步块里时点中引用芯片:整颗选中 */
|
|
62
|
+
{
|
|
63
|
+
kind: 'refChip';
|
|
64
|
+
box: ImageBox;
|
|
65
|
+
}
|
|
66
|
+
/** 同步块编辑中点回同一片段的引用:在片段里放光标、开始片段拖选 */
|
|
67
|
+
| {
|
|
68
|
+
kind: 'refInner';
|
|
69
|
+
box: ImageBox;
|
|
70
|
+
}
|
|
71
|
+
/** 点在嵌入对象里的输入控件上:交给控件,编辑器不介入 */
|
|
72
|
+
| {
|
|
73
|
+
kind: 'embedControl';
|
|
74
|
+
}
|
|
75
|
+
/** 点在嵌入对象的外框上:整颗选中 */
|
|
76
|
+
| {
|
|
77
|
+
kind: 'embedFrame';
|
|
78
|
+
index: number | null;
|
|
79
|
+
}
|
|
80
|
+
/** 还在继续输入:只恢复光标,不挪 */
|
|
81
|
+
| {
|
|
82
|
+
kind: 'resumeTyping';
|
|
83
|
+
}
|
|
84
|
+
/** 点在表格列边界上:开始拖列宽 */
|
|
85
|
+
| {
|
|
86
|
+
kind: 'colBorder';
|
|
87
|
+
border: ColBorderHit;
|
|
88
|
+
}
|
|
89
|
+
/** 其余:落光标、开始拖选 */
|
|
90
|
+
| {
|
|
91
|
+
kind: 'text';
|
|
92
|
+
};
|
|
93
|
+
/**
|
|
94
|
+
* 分类一次按下。`exitRef` 为真表示先退出同步块编辑再处理(点到了片段外面)。
|
|
95
|
+
*/
|
|
96
|
+
export declare function classifyPointerDown(f: PointerDownFacts): {
|
|
97
|
+
target: PointerDownTarget;
|
|
98
|
+
exitRef: boolean;
|
|
99
|
+
};
|
|
100
|
+
/**
|
|
101
|
+
* 拖缩放手柄时的新尺寸。保持宽高比的按起始比例算高;不保持的只给宽,高由插件按新宽度量。
|
|
102
|
+
* 最小宽度 40。
|
|
103
|
+
*/
|
|
104
|
+
export declare function embedResizeSize(s: Extract<DragSession, {
|
|
105
|
+
kind: 'embedResize';
|
|
106
|
+
}>, clientX: number, keepAspectRatio: boolean): {
|
|
107
|
+
width: number;
|
|
108
|
+
height?: number;
|
|
109
|
+
};
|
|
110
|
+
/** 拖列边界时的新列宽:只在相邻两列之间挪,两列都不小于最小列宽,总宽不变。 */
|
|
111
|
+
export declare function colResizeWidths(s: Extract<DragSession, {
|
|
112
|
+
kind: 'colResize';
|
|
113
|
+
}>, clientX: number): number[];
|
|
114
|
+
//# sourceMappingURL=pointer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pointer.d.ts","sourceRoot":"","sources":["../../../src/editor/pointer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pointer.selfcheck.d.ts","sourceRoot":"","sources":["../../../src/editor/pointer.selfcheck.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 同步块(ref)内部编辑:进出规则、片段里的光标移动、内外坐标换算。
|
|
3
|
+
*
|
|
4
|
+
* 同步块的内容是一条独立的字符流(fragment),编辑时文档和选区都切到它的坐标空间,
|
|
5
|
+
* 画面上它又嵌在主文档某颗引用芯片的框里。这里把「切过去 / 切回来时光标落在哪」
|
|
6
|
+
* 「片段里左右键走到头就出去」「片段坐标怎么换算到外层」写成函数,不碰 DOM,
|
|
7
|
+
* 重排、聚焦、刷新由门面做。
|
|
8
|
+
*/
|
|
9
|
+
import { DocumentModel } from '../model/document';
|
|
10
|
+
import type { Selection } from '../model/types';
|
|
11
|
+
import type { CaretPos, DocLayout, ImageBox } from '../layout/types';
|
|
12
|
+
import type { CaretSession } from './session';
|
|
13
|
+
type ArrowKey = 'ArrowLeft' | 'ArrowRight' | 'ArrowUp' | 'ArrowDown';
|
|
14
|
+
/** 当前编辑落在哪份文档:同步块里是片段模型,否则是主文档 */
|
|
15
|
+
export declare function activeDoc(doc: DocumentModel, caret: CaretSession): DocumentModel;
|
|
16
|
+
/** 当前编辑用哪份选区:同步块里是片段选区 */
|
|
17
|
+
export declare function activeSel(caret: CaretSession): Selection;
|
|
18
|
+
/** 片段里光标能到的最后位置:末尾的段落标记前面 */
|
|
19
|
+
export declare function fragmentEnd(model: DocumentModel): number;
|
|
20
|
+
/**
|
|
21
|
+
* 进入这颗引用的内部编辑。`at` 是片段里的落点,不给就放到末尾。
|
|
22
|
+
* 不是引用或没有片段时返回 false,会话不动。
|
|
23
|
+
*/
|
|
24
|
+
export declare function enterRefEdit(doc: DocumentModel, caret: CaretSession, entityId: string, at?: number): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* 退出内部编辑,回到主文档。`refIndex` 是引用芯片在主文档的下标(排版里找不到时传 null,
|
|
27
|
+
* 按主选区起点算)。`before` / `after` 落在芯片前后,不给就整颗选中。
|
|
28
|
+
*/
|
|
29
|
+
export declare function exitRefEdit(caret: CaretSession, refIndex: number | null, side?: 'before' | 'after'): void;
|
|
30
|
+
/** 片段里的方向键:要么挪片段选区,要么走到头退出到芯片前后 */
|
|
31
|
+
export type FragmentMove = {
|
|
32
|
+
fragSel: Selection;
|
|
33
|
+
} | {
|
|
34
|
+
exit: 'before' | 'after';
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* 片段里按一次方向键。左右键在两端(折叠光标)走出片段;上下键按片段自己的排版找行,
|
|
38
|
+
* 没有排版(`inner` 为 null)时原地不动。
|
|
39
|
+
*/
|
|
40
|
+
export declare function moveInFragment(model: DocumentModel, inner: DocLayout | null, sel: Selection, key: ArrowKey, extend: boolean): FragmentMove;
|
|
41
|
+
/** 主文档排版里这颗引用芯片的框 */
|
|
42
|
+
export declare function refBox(layout: DocLayout, entityId: string): ImageBox | null;
|
|
43
|
+
/** 芯片里片段的排版。主排版已经排过就用它,否则按芯片宽度现排一份 */
|
|
44
|
+
export declare function refInnerLayout(doc: DocumentModel, box: ImageBox): DocLayout | null;
|
|
45
|
+
/** 外层坐标(主文档内容区)点到片段里的哪个下标 */
|
|
46
|
+
export declare function hitRefIndex(doc: DocumentModel, box: ImageBox, x: number, y: number): number;
|
|
47
|
+
/** 片段排版里的光标位置换算到外层坐标 */
|
|
48
|
+
export declare function caretInRef(box: ImageBox, inner: DocLayout, index: number): CaretPos;
|
|
49
|
+
export {};
|
|
50
|
+
//# sourceMappingURL=refEditing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refEditing.d.ts","sourceRoot":"","sources":["../../../src/editor/refEditing.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAgB,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEhE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAErE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE9C,KAAK,QAAQ,GAAG,WAAW,GAAG,YAAY,GAAG,SAAS,GAAG,WAAW,CAAC;AAErE,kCAAkC;AAClC,wBAAgB,SAAS,CAAC,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,YAAY,GAAG,aAAa,CAEhF;AAED,0BAA0B;AAC1B,wBAAgB,SAAS,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,CAExD;AAED,6BAA6B;AAC7B,wBAAgB,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAExD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAO5G;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,QAOlG;AAED,mCAAmC;AACnC,MAAM,MAAM,YAAY,GAAG;IAAE,OAAO,EAAE,SAAS,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAA;CAAE,CAAC;AAEjF;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,aAAa,EACpB,KAAK,EAAE,SAAS,GAAG,IAAI,EACvB,GAAG,EAAE,SAAS,EACd,GAAG,EAAE,QAAQ,EACb,MAAM,EAAE,OAAO,GACd,YAAY,CAcd;AAED,qBAAqB;AACrB,wBAAgB,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAE3E;AAED,sCAAsC;AACtC,wBAAgB,cAAc,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,QAAQ,GAAG,SAAS,GAAG,IAAI,CAIlF;AAED,6BAA6B;AAC7B,wBAAgB,WAAW,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAI3F;AAED,wBAAwB;AACxB,wBAAgB,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,CAGnF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refEditing.selfcheck.d.ts","sourceRoot":"","sources":["../../../src/editor/refEditing.selfcheck.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 光标会话:「光标在哪、处在什么状态」的全部字段,集中在一处。
|
|
3
|
+
*
|
|
4
|
+
* 光标位置不只是一个选区。mark 边界上同一个下标分内外侧(亲和),方向键撞上
|
|
5
|
+
* mark 会进入整段选中态(armed),上下键要记目标列,同步块内部编辑还有自己的
|
|
6
|
+
* 一份选区。这些字段以前散在门面里各自读写,「清掉选中态」这类规则在好几处
|
|
7
|
+
* 手写一遍,漏一处就是撤销后选中态残留之类的问题。
|
|
8
|
+
*
|
|
9
|
+
* 这里只存状态和最基本的转换,不读文档、不碰 DOM,所以可以原样交给纯函数
|
|
10
|
+
* (比如 mark 导航)当输入。
|
|
11
|
+
*/
|
|
12
|
+
import type { CaretAffinity } from '../operations';
|
|
13
|
+
import type { Selection } from '../model/types';
|
|
14
|
+
/** 零宽 mark 选中时焦点在哪一侧。有字的 mark 用选区两端表示,不记这个。 */
|
|
15
|
+
export type ArmedSide = 'left' | 'right';
|
|
16
|
+
/** 正在编辑的同步块:哪颗引用、对应哪份片段。 */
|
|
17
|
+
export interface RefEditTarget {
|
|
18
|
+
entityId: string;
|
|
19
|
+
fragmentId: string;
|
|
20
|
+
}
|
|
21
|
+
/** 会话的纯数据快照,供纯函数读取。 */
|
|
22
|
+
export interface CaretState {
|
|
23
|
+
readonly sel: Selection;
|
|
24
|
+
readonly affinity: {
|
|
25
|
+
index: number;
|
|
26
|
+
dir: CaretAffinity;
|
|
27
|
+
} | null;
|
|
28
|
+
readonly armedId: string | null;
|
|
29
|
+
readonly armedSide: ArmedSide | null;
|
|
30
|
+
readonly verticalGoal: {
|
|
31
|
+
x: number;
|
|
32
|
+
focus: number;
|
|
33
|
+
} | null;
|
|
34
|
+
readonly refEdit: RefEditTarget | null;
|
|
35
|
+
readonly fragSel: Selection;
|
|
36
|
+
}
|
|
37
|
+
export declare class CaretSession implements CaretState {
|
|
38
|
+
/** 主文档选区 */
|
|
39
|
+
sel: Selection;
|
|
40
|
+
/**
|
|
41
|
+
* mark 边界上的光标亲和。块内最后一个字后面和块外第一个位置是同一个下标(左边界同理),
|
|
42
|
+
* 只能靠它区分:backward 贴前一个字(右边界在块内、左边界在块外),forward 贴后一个字。
|
|
43
|
+
* index 对不上或不再是边界就作废,按 backward 算。
|
|
44
|
+
*/
|
|
45
|
+
affinity: {
|
|
46
|
+
index: number;
|
|
47
|
+
dir: CaretAffinity;
|
|
48
|
+
} | null;
|
|
49
|
+
/** 这次整段高亮是方向键撞上 mark 产生的选中态。拖选和 Shift 拉出的选区不记。 */
|
|
50
|
+
armedId: string | null;
|
|
51
|
+
/** 零宽 mark 选中时,焦点算在左边还是右边。有字的 mark 用选区两端表示,不记这个。 */
|
|
52
|
+
armedSide: ArmedSide | null;
|
|
53
|
+
/** 上下键的目标列:x 是出发时的光标横坐标,focus 是上一次落点,用来判断 goal 是否仍有效 */
|
|
54
|
+
verticalGoal: {
|
|
55
|
+
x: number;
|
|
56
|
+
focus: number;
|
|
57
|
+
} | null;
|
|
58
|
+
/** 正在编辑的同步块。null 表示在主文档里 */
|
|
59
|
+
refEdit: RefEditTarget | null;
|
|
60
|
+
/** 同步块内部选区,只在 refEdit 非空时有意义 */
|
|
61
|
+
fragSel: Selection;
|
|
62
|
+
/** 进入整段选中态。`side` 只给零宽 mark 用。 */
|
|
63
|
+
arm(id: string, side?: ArmedSide | null): void;
|
|
64
|
+
/** 退出整段选中态。 */
|
|
65
|
+
disarm(): void;
|
|
66
|
+
/** 冻结一份当前状态,交给纯函数用。 */
|
|
67
|
+
snapshot(): CaretState;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/editor/session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,+CAA+C;AAC/C,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;AAEzC,4BAA4B;AAC5B,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,uBAAuB;AACvB,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,aAAa,CAAA;KAAE,GAAG,IAAI,CAAC;IAChE,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,YAAY,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC3D,QAAQ,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC;CAC7B;AAED,qBAAa,YAAa,YAAW,UAAU;IAC7C,YAAY;IACZ,GAAG,EAAE,SAAS,CAAmB;IACjC;;;;OAIG;IACH,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,aAAa,CAAA;KAAE,GAAG,IAAI,CAAQ;IAC9D,kDAAkD;IAClD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC9B,oDAAoD;IACpD,SAAS,EAAE,SAAS,GAAG,IAAI,CAAQ;IACnC,wDAAwD;IACxD,YAAY,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAQ;IACzD,4BAA4B;IAC5B,OAAO,EAAE,aAAa,GAAG,IAAI,CAAQ;IACrC,gCAAgC;IAChC,OAAO,EAAE,SAAS,CAAmB;IAErC,kCAAkC;IAClC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,GAAE,SAAS,GAAG,IAAW;IAK7C,eAAe;IACf,MAAM;IAKN,uBAAuB;IACvB,QAAQ,IAAI,UAAU;CAWvB"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 选中皮和悬停皮的状态,以及由光标状态推出的对外事件。
|
|
3
|
+
*
|
|
4
|
+
* 以前「哪块 mark / 芯片被选中、光标在哪些 mark 里」是在重画装饰的路上顺手算、
|
|
5
|
+
* 顺手发事件的:事件依附在「刚好重画了一次」上。这里把它分开:
|
|
6
|
+
* {@link skinTargets} 只看光标状态算出目标,{@link SkinState.sync} 和上一次比、
|
|
7
|
+
* 给出要发的事件和哪些皮要重画。门面按结果发事件、调 painter,两件事各自清楚。
|
|
8
|
+
*/
|
|
9
|
+
import type { DocLayout } from '../layout/types';
|
|
10
|
+
import type { EmbedEntity } from '../model/types';
|
|
11
|
+
import type { NavEnv } from './markNav';
|
|
12
|
+
import type { CaretState } from './session';
|
|
13
|
+
/** 光标状态决定的皮 */
|
|
14
|
+
export interface SkinTargets {
|
|
15
|
+
/** 整段选中的 mark(含零宽灰字、button),芯片选中时为 null */
|
|
16
|
+
mark: string | null;
|
|
17
|
+
/** 正好选中的芯片 */
|
|
18
|
+
slot: EmbedEntity | null;
|
|
19
|
+
/** 折叠光标所在的 mark,按 listVirtualBlocks 的顺序 */
|
|
20
|
+
caretMarks: string[];
|
|
21
|
+
}
|
|
22
|
+
export type SkinEvent = {
|
|
23
|
+
type: 'markleave' | 'markenter';
|
|
24
|
+
id: string;
|
|
25
|
+
} | {
|
|
26
|
+
type: 'markselect' | 'slotselect';
|
|
27
|
+
id: string | null;
|
|
28
|
+
};
|
|
29
|
+
export interface SkinSync {
|
|
30
|
+
/** 按顺序要发的事件:先离开、再进入,然后芯片选中、mark 选中 */
|
|
31
|
+
events: SkinEvent[];
|
|
32
|
+
/** 选中的 mark 变了,painter 要换选中皮 */
|
|
33
|
+
markChanged: boolean;
|
|
34
|
+
}
|
|
35
|
+
/** 由光标状态算出选中皮和光标所在的 mark */
|
|
36
|
+
export declare function skinTargets(layout: DocLayout, env: NavEnv, s: CaretState): SkinTargets;
|
|
37
|
+
export declare class SkinState {
|
|
38
|
+
/** 方向键整段选中的 mark */
|
|
39
|
+
selectedMark: string | null;
|
|
40
|
+
/** 正好选中的芯片 */
|
|
41
|
+
selectedSlot: string | null;
|
|
42
|
+
/** 指针底下的 mark,每一层都算 */
|
|
43
|
+
hoverMarks: string[];
|
|
44
|
+
/** 指针底下的芯片 */
|
|
45
|
+
hoveredSlot: string | null;
|
|
46
|
+
/** 折叠光标所在的 mark */
|
|
47
|
+
caretMarks: string[];
|
|
48
|
+
/** 和上一次比,给出要发的事件 */
|
|
49
|
+
sync(next: SkinTargets): SkinSync;
|
|
50
|
+
/** 指针底下的 mark 变了没有 */
|
|
51
|
+
hoverMarksTo(ids: readonly string[]): boolean;
|
|
52
|
+
/** 指针底下的芯片变了没有 */
|
|
53
|
+
hoverSlotTo(id: string | null): boolean;
|
|
54
|
+
/** 换文档:光标所在的 mark 清空,不发离开事件 */
|
|
55
|
+
resetCaretMarks(): void;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=skinState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skinState.d.ts","sourceRoot":"","sources":["../../../src/editor/skinState.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAGlD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,eAAe;AACf,MAAM,WAAW,WAAW;IAC1B,2CAA2C;IAC3C,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,cAAc;IACd,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;IACzB,2CAA2C;IAC3C,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,WAAW,GAAG,WAAW,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,YAAY,GAAG,YAAY,CAAC;IAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAE7D,MAAM,WAAW,QAAQ;IACvB,sCAAsC;IACtC,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,gCAAgC;IAChC,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,4BAA4B;AAC5B,wBAAgB,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,GAAG,WAAW,CAatF;AAED,qBAAa,SAAS;IACpB,oBAAoB;IACpB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAQ;IACnC,cAAc;IACd,YAAY,EAAE,MAAM,GAAG,IAAI,CAAQ;IACnC,uBAAuB;IACvB,UAAU,EAAE,MAAM,EAAE,CAAM;IAC1B,cAAc;IACd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAQ;IAClC,mBAAmB;IACnB,UAAU,EAAE,MAAM,EAAE,CAAM;IAE1B,oBAAoB;IACpB,IAAI,CAAC,IAAI,EAAE,WAAW,GAAG,QAAQ;IAcjC,sBAAsB;IACtB,YAAY,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO;IAM7C,kBAAkB;IAClB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO;IAMvC,+BAA+B;IAC/B,eAAe;CAGhB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skinState.selfcheck.d.ts","sourceRoot":"","sources":["../../../src/editor/skinState.selfcheck.ts"],"names":[],"mappings":""}
|