@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.
- package/README.md +209 -2
- package/dist/chunks/types-I0yc5X7i.js +18 -0
- package/dist/chunks/types-I0yc5X7i.js.map +1 -0
- package/dist/formula.js +186 -0
- package/dist/formula.js.map +1 -0
- package/dist/index.js +5503 -0
- package/dist/index.js.map +1 -0
- package/dist/style.css +718 -0
- package/dist/types/commands/index.d.ts +4 -0
- package/dist/types/commands/index.d.ts.map +1 -0
- package/dist/types/commands/selfcheck.d.ts +2 -0
- package/dist/types/commands/selfcheck.d.ts.map +1 -0
- package/dist/types/commands/shortcuts.d.ts +48 -0
- package/dist/types/commands/shortcuts.d.ts.map +1 -0
- package/dist/types/commands/types.d.ts +69 -0
- package/dist/types/commands/types.d.ts.map +1 -0
- package/dist/types/convert/clipboard.d.ts +7 -0
- package/dist/types/convert/clipboard.d.ts.map +1 -0
- package/dist/types/convert/markdown.d.ts +30 -0
- package/dist/types/convert/markdown.d.ts.map +1 -0
- package/dist/types/convert/mdPaste.d.ts +8 -0
- package/dist/types/convert/mdPaste.d.ts.map +1 -0
- package/dist/types/editor.d.ts +469 -0
- package/dist/types/editor.d.ts.map +1 -0
- package/dist/types/edits/editResult.d.ts +62 -0
- package/dist/types/edits/editResult.d.ts.map +1 -0
- package/dist/types/edits/index.d.ts +12 -0
- package/dist/types/edits/index.d.ts.map +1 -0
- package/dist/types/edits/selfcheck.d.ts +2 -0
- package/dist/types/edits/selfcheck.d.ts.map +1 -0
- package/dist/types/edits/transaction.d.ts +35 -0
- package/dist/types/edits/transaction.d.ts.map +1 -0
- package/dist/types/edits/undoStack.d.ts +50 -0
- package/dist/types/edits/undoStack.d.ts.map +1 -0
- package/dist/types/embed/code.d.ts +9 -0
- package/dist/types/embed/code.d.ts.map +1 -0
- package/dist/types/embed/formula-katex.d.ts +4 -0
- package/dist/types/embed/formula-katex.d.ts.map +1 -0
- package/dist/types/embed/formula-mathlive.d.ts +6 -0
- package/dist/types/embed/formula-mathlive.d.ts.map +1 -0
- package/dist/types/embed/formula.d.ts +8 -0
- package/dist/types/embed/formula.d.ts.map +1 -0
- package/dist/types/embed/host.d.ts +70 -0
- package/dist/types/embed/host.d.ts.map +1 -0
- package/dist/types/embed/image.d.ts +3 -0
- package/dist/types/embed/image.d.ts.map +1 -0
- package/dist/types/embed/index.d.ts +20 -0
- package/dist/types/embed/index.d.ts.map +1 -0
- package/dist/types/embed/ref.d.ts +25 -0
- package/dist/types/embed/ref.d.ts.map +1 -0
- package/dist/types/embed/registry.d.ts +6 -0
- package/dist/types/embed/registry.d.ts.map +1 -0
- package/dist/types/embed/slot.d.ts +15 -0
- package/dist/types/embed/slot.d.ts.map +1 -0
- package/dist/types/embed/types.d.ts +53 -0
- package/dist/types/embed/types.d.ts.map +1 -0
- package/dist/types/embed/video.d.ts +3 -0
- package/dist/types/embed/video.d.ts.map +1 -0
- package/dist/types/formula.d.ts +15 -0
- package/dist/types/formula.d.ts.map +1 -0
- package/dist/types/index.d.ts +39 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/input/ime.d.ts +27 -0
- package/dist/types/input/ime.d.ts.map +1 -0
- package/dist/types/input/keyboard.d.ts +21 -0
- package/dist/types/input/keyboard.d.ts.map +1 -0
- package/dist/types/layout/engine.d.ts +55 -0
- package/dist/types/layout/engine.d.ts.map +1 -0
- package/dist/types/layout/harness.d.ts +3 -0
- package/dist/types/layout/harness.d.ts.map +1 -0
- package/dist/types/layout/measure.d.ts +37 -0
- package/dist/types/layout/measure.d.ts.map +1 -0
- package/dist/types/layout/refMetrics.d.ts +5 -0
- package/dist/types/layout/refMetrics.d.ts.map +1 -0
- package/dist/types/layout/selfcheck.d.ts +2 -0
- package/dist/types/layout/selfcheck.d.ts.map +1 -0
- package/dist/types/layout/style.d.ts +4 -0
- package/dist/types/layout/style.d.ts.map +1 -0
- package/dist/types/layout/types.d.ts +133 -0
- package/dist/types/layout/types.d.ts.map +1 -0
- package/dist/types/layout/wrap.d.ts +65 -0
- package/dist/types/layout/wrap.d.ts.map +1 -0
- package/dist/types/model/blocks.d.ts +66 -0
- package/dist/types/model/blocks.d.ts.map +1 -0
- package/dist/types/model/document.d.ts +102 -0
- package/dist/types/model/document.d.ts.map +1 -0
- package/dist/types/model/fragment.d.ts +7 -0
- package/dist/types/model/fragment.d.ts.map +1 -0
- package/dist/types/model/markers.d.ts +14 -0
- package/dist/types/model/markers.d.ts.map +1 -0
- package/dist/types/model/types.d.ts +155 -0
- package/dist/types/model/types.d.ts.map +1 -0
- package/dist/types/model/virtualBlock.d.ts +44 -0
- package/dist/types/model/virtualBlock.d.ts.map +1 -0
- package/dist/types/mutations/apply.d.ts +14 -0
- package/dist/types/mutations/apply.d.ts.map +1 -0
- package/dist/types/mutations/index.d.ts +15 -0
- package/dist/types/mutations/index.d.ts.map +1 -0
- package/dist/types/mutations/invert.d.ts +21 -0
- package/dist/types/mutations/invert.d.ts.map +1 -0
- package/dist/types/mutations/ranges.d.ts +39 -0
- package/dist/types/mutations/ranges.d.ts.map +1 -0
- package/dist/types/mutations/registry.d.ts +27 -0
- package/dist/types/mutations/registry.d.ts.map +1 -0
- package/dist/types/mutations/selection.d.ts +12 -0
- package/dist/types/mutations/selection.d.ts.map +1 -0
- package/dist/types/mutations/selfcheck.d.ts +2 -0
- package/dist/types/mutations/selfcheck.d.ts.map +1 -0
- package/dist/types/mutations/transform.d.ts +33 -0
- package/dist/types/mutations/transform.d.ts.map +1 -0
- package/dist/types/mutations/types.d.ts +128 -0
- package/dist/types/mutations/types.d.ts.map +1 -0
- package/dist/types/operations/context.d.ts +47 -0
- package/dist/types/operations/context.d.ts.map +1 -0
- package/dist/types/operations/entity.d.ts +18 -0
- package/dist/types/operations/entity.d.ts.map +1 -0
- package/dist/types/operations/harness.d.ts +54 -0
- package/dist/types/operations/harness.d.ts.map +1 -0
- package/dist/types/operations/index.d.ts +20 -0
- package/dist/types/operations/index.d.ts.map +1 -0
- package/dist/types/operations/primitives.d.ts +35 -0
- package/dist/types/operations/primitives.d.ts.map +1 -0
- package/dist/types/operations/resolve.d.ts +31 -0
- package/dist/types/operations/resolve.d.ts.map +1 -0
- package/dist/types/operations/selfcheck.d.ts +2 -0
- package/dist/types/operations/selfcheck.d.ts.map +1 -0
- package/dist/types/operations/slice.d.ts +28 -0
- package/dist/types/operations/slice.d.ts.map +1 -0
- package/dist/types/operations/style.d.ts +20 -0
- package/dist/types/operations/style.d.ts.map +1 -0
- package/dist/types/operations/table.d.ts +14 -0
- package/dist/types/operations/table.d.ts.map +1 -0
- package/dist/types/operations/text.d.ts +20 -0
- package/dist/types/operations/text.d.ts.map +1 -0
- package/dist/types/operations/virtualBlock.d.ts +44 -0
- package/dist/types/operations/virtualBlock.d.ts.map +1 -0
- package/dist/types/paint/canvasPainter.d.ts +37 -0
- package/dist/types/paint/canvasPainter.d.ts.map +1 -0
- package/dist/types/paint/decorations.d.ts +19 -0
- package/dist/types/paint/decorations.d.ts.map +1 -0
- package/dist/types/paint/htmlPainter.d.ts +19 -0
- package/dist/types/paint/htmlPainter.d.ts.map +1 -0
- package/dist/types/paint/types.d.ts +36 -0
- package/dist/types/paint/types.d.ts.map +1 -0
- package/package.json +64 -4
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 快捷键表。
|
|
3
|
+
*
|
|
4
|
+
* 一张纯数据表:按键组合 → 命令。它不认识 DOM 事件,也不认识编辑器 —— 匹配用的
|
|
5
|
+
* 是 {@link KeyStroke} 这个最小结构,由输入源从事件里摘出来。这样这张表可以被
|
|
6
|
+
* 直接断言,也可以将来换成宿主配置的。
|
|
7
|
+
*/
|
|
8
|
+
import { CommandTable } from './types';
|
|
9
|
+
/** 一次按键,从平台事件里摘出来的最小信息。 */
|
|
10
|
+
export interface KeyStroke {
|
|
11
|
+
/** `KeyboardEvent.key`,大小写原样 */
|
|
12
|
+
key: string;
|
|
13
|
+
/** Cmd(mac)或 Ctrl */
|
|
14
|
+
mod: boolean;
|
|
15
|
+
shift: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface Shortcut {
|
|
18
|
+
/** 匹配的键名,单字母键写小写 */
|
|
19
|
+
key: string;
|
|
20
|
+
/** 是否要求按下 Cmd/Ctrl。省略等同 false —— 必须**没**按 */
|
|
21
|
+
mod?: boolean;
|
|
22
|
+
/** true 要求按 Shift,false 要求没按,省略则不管 */
|
|
23
|
+
shift?: boolean;
|
|
24
|
+
/**
|
|
25
|
+
* 这个键本身会引发一次文本输入(beforeInput)。吞掉按键之后还得把那次输入一并
|
|
26
|
+
* 压掉,否则内容会被写两遍。只有真正产生输入的键要标。
|
|
27
|
+
*
|
|
28
|
+
* 注意:keydown 里会 preventDefault,部分浏览器因此不再派 beforeinput。
|
|
29
|
+
* IME 层只能按 inputType 吞删除/换段回声,不能无差别丢掉下一次 insertText。
|
|
30
|
+
*/
|
|
31
|
+
suppressesInput?: boolean;
|
|
32
|
+
/** 返回 false 表示这次没处理,事件不该被吞 */
|
|
33
|
+
run(c: CommandTable, stroke: KeyStroke): void | boolean;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* 顺序有意义:从上往下取第一条匹配的。带修饰键的排在前面,免得被无修饰键的
|
|
37
|
+
* 条目截住。
|
|
38
|
+
*/
|
|
39
|
+
export declare const SHORTCUTS: Shortcut[];
|
|
40
|
+
export declare const INPUT_SHORTCUTS: Shortcut[];
|
|
41
|
+
/**
|
|
42
|
+
* 输入框快捷键。
|
|
43
|
+
* - `newline`:Enter / Shift+Enter 都换行;Cmd/Ctrl+Enter 不登记,留给宿主提交。
|
|
44
|
+
* - `enter` / `shift-enter`:旧口径(引擎仍提供,嵌入式输入框不要用)。
|
|
45
|
+
*/
|
|
46
|
+
export declare function inputShortcuts(submit?: 'newline' | 'enter' | 'shift-enter'): Shortcut[];
|
|
47
|
+
export declare function findShortcut(stroke: KeyStroke, table?: Shortcut[]): Shortcut | null;
|
|
48
|
+
//# sourceMappingURL=shortcuts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shortcuts.d.ts","sourceRoot":"","sources":["../../../src/commands/shortcuts.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAY,YAAY,EAAE,MAAM,SAAS,CAAC;AAEjD,2BAA2B;AAC3B,MAAM,WAAW,SAAS;IACxB,gCAAgC;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,qBAAqB;IACrB,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,QAAQ;IACvB,oBAAoB;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,6CAA6C;IAC7C,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,sCAAsC;IACtC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,8BAA8B;IAC9B,GAAG,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,GAAG,OAAO,CAAC;CACzD;AAOD;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,QAAQ,EAoB/B,CAAC;AASF,eAAO,MAAM,eAAe,EAAE,QAAQ,EAerC,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,MAAM,GAAE,SAAS,GAAG,OAAO,GAAG,aAAyB,GACtD,QAAQ,EAAE,CAkBZ;AAWD,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,GAAE,QAAQ,EAAc,GAAG,QAAQ,GAAG,IAAI,CAE9F"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 命令层的契约。
|
|
3
|
+
*
|
|
4
|
+
* 命令是「用户意图」的名字,不含任何文档语义 —— 它只负责被触发,具体怎么改文档
|
|
5
|
+
* 是 Edit 层和 Operation 层的事。所以这一层没有实现,只有一张表:输入源(键盘、
|
|
6
|
+
* 指针、宿主的工具栏)往里打,编辑器把表填上。
|
|
7
|
+
*/
|
|
8
|
+
import { SlotKind } from '../model/types';
|
|
9
|
+
/** 编辑命令集合。宿主搭建自己的工具栏时调这些。 */
|
|
10
|
+
export interface EditorCommands {
|
|
11
|
+
toggleBold(): void;
|
|
12
|
+
toggleItalic(): void;
|
|
13
|
+
toggleUnderline(): void;
|
|
14
|
+
toggleStrike(): void;
|
|
15
|
+
setFontSize(size: number): void;
|
|
16
|
+
setColor(color: string): void;
|
|
17
|
+
setHeading(level: 0 | 1 | 2 | 3): void;
|
|
18
|
+
setAlign(align: 'left' | 'center' | 'right'): void;
|
|
19
|
+
toggleList(kind: 'ul' | 'ol'): void;
|
|
20
|
+
indent(delta: number): void;
|
|
21
|
+
insertImage(file: File): void;
|
|
22
|
+
insertVideo(file: File): void;
|
|
23
|
+
insertCode(): void;
|
|
24
|
+
insertFormula(): void;
|
|
25
|
+
insertSlot(kind: SlotKind): void;
|
|
26
|
+
/**
|
|
27
|
+
* 在光标处插入一个由宿主渲染的内嵌块。`hostType` 标识业务类型,`data` 是随实体
|
|
28
|
+
* 引用携带的业务数据(编辑器不解释)。可选 `size` 给初始占位尺寸;省略时按渲染器
|
|
29
|
+
* 首次挂载后回报的尺寸重排。
|
|
30
|
+
*/
|
|
31
|
+
insertHostEmbed(hostType: string, data?: unknown, size?: {
|
|
32
|
+
width: number;
|
|
33
|
+
height: number;
|
|
34
|
+
}): void;
|
|
35
|
+
insertTable(): void;
|
|
36
|
+
addRow(): void;
|
|
37
|
+
addCol(): void;
|
|
38
|
+
removeRow(): void;
|
|
39
|
+
removeCol(): void;
|
|
40
|
+
toggleLink(): void;
|
|
41
|
+
promoteRef(): void;
|
|
42
|
+
insertRef(): void;
|
|
43
|
+
unlinkRef(): void;
|
|
44
|
+
undo(): void;
|
|
45
|
+
redo(): void;
|
|
46
|
+
}
|
|
47
|
+
/** 方向键的四个取值,和 `KeyboardEvent.key` 一致。 */
|
|
48
|
+
export type ArrowKey = 'ArrowLeft' | 'ArrowRight' | 'ArrowUp' | 'ArrowDown';
|
|
49
|
+
/**
|
|
50
|
+
* 键盘能触发的全部命令。{@link EditorCommands} 是它的公开子集 —— 多出来的这些
|
|
51
|
+
* 是「只有按键才会触发」的动作,放进公开 API 没有意义。
|
|
52
|
+
*
|
|
53
|
+
* 返回 `false` 表示这次没处理,输入源不要吞掉该事件(比如不在同步块里时按
|
|
54
|
+
* Escape,应该让它继续冒泡)。
|
|
55
|
+
*/
|
|
56
|
+
export interface CommandTable extends EditorCommands {
|
|
57
|
+
insertParagraph(opts?: {
|
|
58
|
+
shift?: boolean;
|
|
59
|
+
}): void;
|
|
60
|
+
backspace(): void;
|
|
61
|
+
deleteForward(): void;
|
|
62
|
+
selectAll(): void;
|
|
63
|
+
/** Tab:列表里改嵌套层级,表格里跳格 */
|
|
64
|
+
indentOrNextCell(dir: 1 | -1): void;
|
|
65
|
+
moveCaret(key: ArrowKey, extend: boolean): void;
|
|
66
|
+
/** 退出同步块内部编辑。不在同步块里时返回 false */
|
|
67
|
+
exitFragment(): boolean;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/commands/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,6BAA6B;AAC7B,MAAM,WAAW,cAAc;IAC7B,UAAU,IAAI,IAAI,CAAC;IACnB,YAAY,IAAI,IAAI,CAAC;IACrB,eAAe,IAAI,IAAI,CAAC;IACxB,YAAY,IAAI,IAAI,CAAC;IACrB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,IAAI,CAAC;IACnD,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IACpC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAC9B,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAC9B,UAAU,IAAI,IAAI,CAAC;IACnB,aAAa,IAAI,IAAI,CAAC;IACtB,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IACjC;;;;OAIG;IACH,eAAe,CACb,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,OAAO,EACd,IAAI,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GACvC,IAAI,CAAC;IACR,WAAW,IAAI,IAAI,CAAC;IACpB,MAAM,IAAI,IAAI,CAAC;IACf,MAAM,IAAI,IAAI,CAAC;IACf,SAAS,IAAI,IAAI,CAAC;IAClB,SAAS,IAAI,IAAI,CAAC;IAClB,UAAU,IAAI,IAAI,CAAC;IACnB,UAAU,IAAI,IAAI,CAAC;IACnB,SAAS,IAAI,IAAI,CAAC;IAClB,SAAS,IAAI,IAAI,CAAC;IAClB,IAAI,IAAI,IAAI,CAAC;IACb,IAAI,IAAI,IAAI,CAAC;CACd;AAED,yCAAyC;AACzC,MAAM,MAAM,QAAQ,GAAG,WAAW,GAAG,YAAY,GAAG,SAAS,GAAG,WAAW,CAAC;AAE5E;;;;;;GAMG;AACH,MAAM,WAAW,YAAa,SAAQ,cAAc;IAClD,eAAe,CAAC,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IAClD,SAAS,IAAI,IAAI,CAAC;IAClB,aAAa,IAAI,IAAI,CAAC;IACtB,SAAS,IAAI,IAAI,CAAC;IAClB,yBAAyB;IACzB,gBAAgB,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;IACpC,SAAS,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IAChD,gCAAgC;IAChC,YAAY,IAAI,OAAO,CAAC;CACzB"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Slice } from '../model/types';
|
|
2
|
+
/** 自定义剪贴板 MIME:跨编辑器粘贴时保全样式与嵌入实体。 */
|
|
3
|
+
export declare const SLICE_MIME = "text/x-mini-editor-slice";
|
|
4
|
+
export declare function serializeSlice(slice: Slice): string;
|
|
5
|
+
export declare function parseSlice(raw: string): Slice | null;
|
|
6
|
+
export declare function sliceFromClipboard(data: DataTransfer | null): Slice | null;
|
|
7
|
+
//# sourceMappingURL=clipboard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clipboard.d.ts","sourceRoot":"","sources":["../../../src/convert/clipboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,EAAa,MAAM,gBAAgB,CAAC;AAE/D,oCAAoC;AACpC,eAAO,MAAM,UAAU,6BAA6B,CAAC;AAErD,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAEnD;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,CAcpD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,CAG1E"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { HeadingLevel, ListKind, TextProps } from '../model/types';
|
|
2
|
+
/** 常用 Markdown 输入的即时识别规则。 */
|
|
3
|
+
export type MarkdownHit = {
|
|
4
|
+
kind: 'heading';
|
|
5
|
+
level: HeadingLevel;
|
|
6
|
+
consume: number;
|
|
7
|
+
} | {
|
|
8
|
+
kind: 'list';
|
|
9
|
+
list: ListKind;
|
|
10
|
+
consume: number;
|
|
11
|
+
} | {
|
|
12
|
+
kind: 'code-block';
|
|
13
|
+
consume: number;
|
|
14
|
+
language: string;
|
|
15
|
+
} | {
|
|
16
|
+
kind: 'formula';
|
|
17
|
+
matchStart: number;
|
|
18
|
+
matchEnd: number;
|
|
19
|
+
latex: string;
|
|
20
|
+
displayMode: boolean;
|
|
21
|
+
} | {
|
|
22
|
+
kind: 'text';
|
|
23
|
+
style: TextProps;
|
|
24
|
+
matchStart: number;
|
|
25
|
+
matchEnd: number;
|
|
26
|
+
inner: string;
|
|
27
|
+
};
|
|
28
|
+
export declare function matchMarkdown(paraText: string): MarkdownHit | null;
|
|
29
|
+
export declare function shouldTryMarkdown(inserted: string): boolean;
|
|
30
|
+
//# sourceMappingURL=markdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../../src/convert/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEnE,6BAA6B;AAC7B,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACzD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACzD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,GAC9F;IACE,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,SAAS,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAsBN,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CA2ClE;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAI3D"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Slice } from '../model/types';
|
|
2
|
+
/**
|
|
3
|
+
* 粘贴前的 Markdown 探测:先看标题/列表/链接,再看行内粗斜删除线。
|
|
4
|
+
*/
|
|
5
|
+
export declare function looksLikeMarkdown(text: string): boolean;
|
|
6
|
+
/** 支持的 Markdown 子集:标题/列表/粗斜下划删除线/链接/代码块/公式。 */
|
|
7
|
+
export declare function markdownToSlice(raw: string): Slice;
|
|
8
|
+
//# sourceMappingURL=mdPaste.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mdPaste.d.ts","sourceRoot":"","sources":["../../../src/convert/mdPaste.ts"],"names":[],"mappings":"AACA,OAAO,EAA4E,KAAK,EAAwB,MAAM,gBAAgB,CAAC;AAEvI;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAcvD;AA4CD,+CAA+C;AAC/C,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CA4FlD"}
|
|
@@ -0,0 +1,469 @@
|
|
|
1
|
+
import { HostEmbedRenderer } from './embed';
|
|
2
|
+
import { EmbedPlugin } from './embed/types';
|
|
3
|
+
import type { Shortcut } from './commands';
|
|
4
|
+
import { CommandTable } from './commands';
|
|
5
|
+
import { DocLayout } from './layout/types';
|
|
6
|
+
import { DocumentModel } from './model/document';
|
|
7
|
+
import type { ImagePatch, VirtualBlockSpec } from './operations';
|
|
8
|
+
import { EmbedEntity, Selection, Slice, TextProps, VirtualBlockChrome } from './model/types';
|
|
9
|
+
export interface EditorOptions {
|
|
10
|
+
/** 初始文档。不传则新建一个空文档。 */
|
|
11
|
+
doc?: DocumentModel;
|
|
12
|
+
/** 初始绘制后端,默认 `html`。 */
|
|
13
|
+
paint?: 'html' | 'canvas';
|
|
14
|
+
/**
|
|
15
|
+
* 嵌入对象插件集,默认 {@link builtinEmbedPlugins}(图片/视频/代码块/插槽/同步块)。
|
|
16
|
+
* 公式需从 `medeo-rte/formula` 单独引入后追加。
|
|
17
|
+
*/
|
|
18
|
+
plugins?: EmbedPlugin[];
|
|
19
|
+
/**
|
|
20
|
+
* 内容宽度策略,默认 `'fill'`。
|
|
21
|
+
* - `'fill'`:撑满宿主容器,并随容器尺寸变化自动重排(编辑器适应容器)。
|
|
22
|
+
* - `number`:固定像素内容宽,行为与容器尺寸无关(适合需要确定版心的场景)。
|
|
23
|
+
*/
|
|
24
|
+
width?: 'fill' | number;
|
|
25
|
+
/**
|
|
26
|
+
* 内容版心内边距(像素),默认 `{ x: 72, y: 56 }`(纸张/文档形态的版心留白)。
|
|
27
|
+
* 决定内容行相对绘制表面的起始偏移与四周留白。嵌入式输入框等紧凑形态可传
|
|
28
|
+
* `{ x: 0, y: 0 }`,把留白完全交给宿主 CSS 控制。
|
|
29
|
+
*/
|
|
30
|
+
padding?: {
|
|
31
|
+
x: number;
|
|
32
|
+
y: number;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* 宿主渲染器。提供后即启用 host 型嵌入对象:节点内部 DOM 由宿主用自己的框架
|
|
36
|
+
* 组件渲染,SDK 只管占位、定位与生命周期。用于把业务卡片(如引用对象、插槽)
|
|
37
|
+
* 挂进编辑器而不由 SDK 自绘。见 {@link HostEmbedRenderer}。
|
|
38
|
+
*/
|
|
39
|
+
hostEmbed?: HostEmbedRenderer;
|
|
40
|
+
/**
|
|
41
|
+
* 空文档占位文案。由 SDK 画在首行位置,组合输入一开始就关掉(中间态已镜像进模型,
|
|
42
|
+
* 宿主若只看 `change` 会误判仍为空)。之后可用 {@link Editor.setPlaceholder} 改。
|
|
43
|
+
*/
|
|
44
|
+
placeholder?: string;
|
|
45
|
+
/**
|
|
46
|
+
* 未写 text span 时的默认文字属性。嵌入式输入框可传 14px 对齐业务输入。
|
|
47
|
+
* `fontFamily` 须具名栈(不要 `system-ui`),会同时用于 pretext 测宽与绘制。
|
|
48
|
+
* 不传则仍是文档编辑器默认 16px / `#1f2329` / 中文无衬线栈。
|
|
49
|
+
*/
|
|
50
|
+
textDefaults?: TextProps;
|
|
51
|
+
/**
|
|
52
|
+
* 快捷键表。默认 {@link SHORTCUTS}(文档编辑:Enter 插段、Cmd+B 加粗等)。
|
|
53
|
+
* 嵌入式输入框请传 {@link inputShortcuts}(默认 newline:Enter 换行)。
|
|
54
|
+
*/
|
|
55
|
+
shortcuts?: Shortcut[];
|
|
56
|
+
/**
|
|
57
|
+
* 创建完成后是否把焦点放到 IME。默认 `true`(独立编辑器 / demo)。
|
|
58
|
+
* 嵌入式输入框(如页面上的 Command Box)应传 `false`,避免抢走页面焦点。
|
|
59
|
+
*/
|
|
60
|
+
autofocus?: boolean;
|
|
61
|
+
/**
|
|
62
|
+
* 光标 / 选区 / 空态占位的外观。不传则与常规编辑器一致:实心光标、扁平选区、无残影。
|
|
63
|
+
* 彩虹光标 / 残影需显式 `caret: 'rainbow'`。
|
|
64
|
+
*/
|
|
65
|
+
chrome?: EditorChrome;
|
|
66
|
+
}
|
|
67
|
+
/** 编辑器装饰外观(光标、选区、空态占位)。与正文字号/字体测量分开,避免宿主 CSS 盖绘制层。 */
|
|
68
|
+
export interface EditorChrome {
|
|
69
|
+
/** 默认 `solid`。演示能力用 `rainbow`。 */
|
|
70
|
+
caret?: 'rainbow' | 'solid';
|
|
71
|
+
/** `solid` 时光标颜色,默认 `#09090b`。 */
|
|
72
|
+
caretColor?: string;
|
|
73
|
+
/** `solid` 时光标宽度,默认 2。 */
|
|
74
|
+
caretWidth?: number;
|
|
75
|
+
/** 是否画光标残影。默认关闭;`rainbow` 时可打开。 */
|
|
76
|
+
caretTrail?: boolean;
|
|
77
|
+
/**
|
|
78
|
+
* 选区高亮色。默认接近浏览器原生选区:`rgba(43, 108, 255, 0.22)`。
|
|
79
|
+
* 扁平填充,不再用彩虹渐变。`caret: 'rainbow'` 且未指定本项时,demo 仍用渐变选区。
|
|
80
|
+
*/
|
|
81
|
+
selectionColor?: string;
|
|
82
|
+
/** 选区圆角,像素。默认 0(和 `::selection` 一样是矩形)。 */
|
|
83
|
+
selectionRadius?: number;
|
|
84
|
+
/** 中文输入中间态下划线颜色。默认 `#1f2329`。 */
|
|
85
|
+
composeUnderlineColor?: string;
|
|
86
|
+
/** 中文输入中间态下划线粗细,默认 2。 */
|
|
87
|
+
composeUnderlineWidth?: number;
|
|
88
|
+
/** 空态占位颜色。 */
|
|
89
|
+
placeholderColor?: string;
|
|
90
|
+
/** 空态占位透明度 0–1。现网 Chat 为 0.2。 */
|
|
91
|
+
placeholderOpacity?: number;
|
|
92
|
+
/**
|
|
93
|
+
* 绘制表面底色。默认纸张白(`var(--page)`)。
|
|
94
|
+
* 嵌入式输入框应传 `transparent`,露出宿主输入框底,不要再铺一层白/灰。
|
|
95
|
+
*/
|
|
96
|
+
surfaceBackground?: 'paper' | 'transparent';
|
|
97
|
+
}
|
|
98
|
+
/** 插入嵌入对象的落点:文档下标,或起/止/当前光标。 */
|
|
99
|
+
export type EmbedInsertAt = number | 'start' | 'end' | 'cursor';
|
|
100
|
+
/** 编辑器当前状态,供宿主同步工具栏、状态栏等 UI。 */
|
|
101
|
+
export interface EditorState {
|
|
102
|
+
bold: boolean;
|
|
103
|
+
italic: boolean;
|
|
104
|
+
underline: boolean;
|
|
105
|
+
strikethrough: boolean;
|
|
106
|
+
fontSize: number;
|
|
107
|
+
color: string;
|
|
108
|
+
heading: 0 | 1 | 2 | 3;
|
|
109
|
+
align: 'left' | 'center' | 'right';
|
|
110
|
+
list: 'none' | 'ul' | 'ol';
|
|
111
|
+
inTable: boolean;
|
|
112
|
+
canUndo: boolean;
|
|
113
|
+
canRedo: boolean;
|
|
114
|
+
paintMode: 'html' | 'canvas';
|
|
115
|
+
hasLink: boolean;
|
|
116
|
+
canPromote: boolean;
|
|
117
|
+
canInsertRef: boolean;
|
|
118
|
+
canUnlink: boolean;
|
|
119
|
+
/** 主文档选区 */
|
|
120
|
+
selection: Selection;
|
|
121
|
+
/** 主文档长度(spacer 数) */
|
|
122
|
+
docLength: number;
|
|
123
|
+
/** 是否正在同步块内部编辑 */
|
|
124
|
+
inRefEdit: boolean;
|
|
125
|
+
/** 同步块内部选区,仅 inRefEdit 为真时有意义 */
|
|
126
|
+
refSelection: Selection;
|
|
127
|
+
/** 虚拟块作用域栈,栈顶是当前选中/编辑的那一层 */
|
|
128
|
+
vblockStack: {
|
|
129
|
+
id: string;
|
|
130
|
+
mode: 'selected' | 'editing';
|
|
131
|
+
}[];
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* - `change`:文档内容变化
|
|
135
|
+
* - `selectionchange`:选区或光标移动
|
|
136
|
+
* - `statechange`:{@link EditorState} 任一字段可能已变,用于同步工具栏
|
|
137
|
+
* - `layoutchange`:重新排版完成,可从 {@link Editor.getLayout} 取新几何
|
|
138
|
+
*/
|
|
139
|
+
export type EditorEvent = 'change' | 'selectionchange' | 'statechange' | 'layoutchange';
|
|
140
|
+
export declare class Editor {
|
|
141
|
+
/** 编辑器根节点,已挂载到构造时传入的容器下。 */
|
|
142
|
+
readonly root: HTMLElement;
|
|
143
|
+
/** 编辑命令集合,宿主自建工具栏时用。 */
|
|
144
|
+
readonly commands: CommandTable;
|
|
145
|
+
/** 构造时传入的宿主容器。'fill' 模式下从它测量可用宽度。 */
|
|
146
|
+
private parent;
|
|
147
|
+
/** 内容宽度策略,见 {@link EditorOptions.width}。 */
|
|
148
|
+
private widthMode;
|
|
149
|
+
/** 内容版心内边距,见 {@link EditorOptions.padding}。所有主文档排版据此定位。 */
|
|
150
|
+
private padding;
|
|
151
|
+
/** 当前内容宽度(单一真相来源),所有主文档排版都读它。 */
|
|
152
|
+
private contentWidth;
|
|
153
|
+
/** 'fill' 模式下监听宿主尺寸变化以重排;其它模式为 null。 */
|
|
154
|
+
private resizeObserver;
|
|
155
|
+
private page;
|
|
156
|
+
private pageInner;
|
|
157
|
+
private handle;
|
|
158
|
+
private embedFrame;
|
|
159
|
+
private imeBar;
|
|
160
|
+
private placeholderEl;
|
|
161
|
+
private placeholderText;
|
|
162
|
+
private shortcutTable;
|
|
163
|
+
private textDefaults;
|
|
164
|
+
/** 挂载后由 getComputedStyle 解析出的字体栈,专供测宽(canvas 读不懂 var())。 */
|
|
165
|
+
private resolvedMeasureFamily;
|
|
166
|
+
private chrome;
|
|
167
|
+
private disabled;
|
|
168
|
+
private paintMode;
|
|
169
|
+
private listeners;
|
|
170
|
+
private doc;
|
|
171
|
+
private sel;
|
|
172
|
+
private undoStack;
|
|
173
|
+
private layout;
|
|
174
|
+
private painter;
|
|
175
|
+
private ime;
|
|
176
|
+
private typingStyle;
|
|
177
|
+
private keepTypingOnNextClick;
|
|
178
|
+
private caretRaf;
|
|
179
|
+
private caretTrails;
|
|
180
|
+
private lastCaretKey;
|
|
181
|
+
private composeText;
|
|
182
|
+
/** 组合串镜像插入模型的起点;null 表示当前没有进行中的组合。 */
|
|
183
|
+
private composeAnchor;
|
|
184
|
+
/** 当前已镜像插入模型的组合串长度,用于下次幂等替换时删旧。 */
|
|
185
|
+
private composeLen;
|
|
186
|
+
private refEdit;
|
|
187
|
+
private fragSel;
|
|
188
|
+
private refDragging;
|
|
189
|
+
private refDragAnchor;
|
|
190
|
+
private unbindKeyboard;
|
|
191
|
+
private keysArmed;
|
|
192
|
+
private dragging;
|
|
193
|
+
private resizing;
|
|
194
|
+
private colResizing;
|
|
195
|
+
private embedEdit;
|
|
196
|
+
private dragAnchor;
|
|
197
|
+
private vblockStack;
|
|
198
|
+
constructor(parent: HTMLElement, options?: EditorOptions);
|
|
199
|
+
setPaintMode(mode: 'html' | 'canvas'): void;
|
|
200
|
+
/** 滚动容器。宿主要做小地图、滚动联动时用。 */
|
|
201
|
+
get scroller(): HTMLElement;
|
|
202
|
+
/**
|
|
203
|
+
* 页面元素(内容画布所在的定位上下文)。
|
|
204
|
+
* 宿主要往内容上叠东西(标尺、网格、水印、角标)时挂到这里。
|
|
205
|
+
*/
|
|
206
|
+
get pageElement(): HTMLElement;
|
|
207
|
+
/** 当前绘制后端。 */
|
|
208
|
+
get paint(): 'html' | 'canvas';
|
|
209
|
+
/** 更新空态占位文案。传空字符串则不再显示。 */
|
|
210
|
+
setPlaceholder(text: string): void;
|
|
211
|
+
/** 更新光标 / 选区等装饰外观,立即重绘 chrome。 */
|
|
212
|
+
setChrome(patch: Partial<EditorChrome>): void;
|
|
213
|
+
/**
|
|
214
|
+
* 更新默认正文字号/颜色/字体。已写进 span 的同色文字会跟着改(给主题切换用),不进撤销。
|
|
215
|
+
*/
|
|
216
|
+
setTextDefaults(patch: TextProps): void;
|
|
217
|
+
/** 把文档里等于 from 的文字色改成 to,不发 change、不进历史。 */
|
|
218
|
+
private recolorMatchingText;
|
|
219
|
+
private applyTextDefaults;
|
|
220
|
+
private syncComputedFontForMeasure;
|
|
221
|
+
private createPainter;
|
|
222
|
+
private caretIsSolid;
|
|
223
|
+
private caretTrailEnabled;
|
|
224
|
+
private applyChrome;
|
|
225
|
+
/** 当前排版结果(纯几何,只读)。宿主可据此画标尺、小地图、叠层。 */
|
|
226
|
+
getLayout(): DocLayout;
|
|
227
|
+
/** 导出整篇内容,结果可 JSON 序列化。 */
|
|
228
|
+
getContent(): Slice;
|
|
229
|
+
/** 整篇替换内容,会清空撤销栈。 */
|
|
230
|
+
setContent(slice: Slice): void;
|
|
231
|
+
/** 直接拿文档模型。需要做批量操作或自定义命令时用。 */
|
|
232
|
+
getDocument(): DocumentModel;
|
|
233
|
+
/**
|
|
234
|
+
* 在当前选区(或 `at`)插入一份 Slice。模板混排(文案 + 槽 + 胶囊 + 虚拟块)走这条。
|
|
235
|
+
*/
|
|
236
|
+
insertSlice(slice: Slice, at?: number): void;
|
|
237
|
+
/** 把指定范围(默认当前选区)包成一层虚拟块。 */
|
|
238
|
+
insertVirtualBlock(spec: Omit<VirtualBlockSpec, 'start' | 'end'> & {
|
|
239
|
+
start?: number;
|
|
240
|
+
end?: number;
|
|
241
|
+
}): string | null;
|
|
242
|
+
updateVirtualBlock(id: string, chrome: VirtualBlockChrome): void;
|
|
243
|
+
removeVirtualBlock(id: string): void;
|
|
244
|
+
/**
|
|
245
|
+
* 在指定位置插入宿主渲染块。`at` 省略为当前光标(会先删掉非折叠选区)。
|
|
246
|
+
* 插入后选中该占位符,便于缩放框/选中态;宿主若要把光标放到块后,自行折叠到 `focus`。
|
|
247
|
+
*/
|
|
248
|
+
insertHostEmbed(hostType: string, data?: unknown, size?: {
|
|
249
|
+
width: number;
|
|
250
|
+
height: number;
|
|
251
|
+
}, at?: EmbedInsertAt): void;
|
|
252
|
+
/** 文档里所有嵌入对象(图片占位),按文档下标升序。 */
|
|
253
|
+
listEmbeds(): {
|
|
254
|
+
index: number;
|
|
255
|
+
entity: EmbedEntity;
|
|
256
|
+
}[];
|
|
257
|
+
/** 每个段落的分组 id,与块序一致;空串表示无分组。 */
|
|
258
|
+
listParagraphGroupIds(): string[];
|
|
259
|
+
/** 给前 `count` 个段落打上分组(省略则全部)。不进撤销栈。 */
|
|
260
|
+
tagParagraphsWithGroup(groupId: string, count?: number): void;
|
|
261
|
+
/** 去掉段落分组。传入 id 则只清该组,否则清全部。 */
|
|
262
|
+
clearParagraphGroupIds(groupId?: string): void;
|
|
263
|
+
/** 删除指定分组的段落,其余内容保留。会清空撤销栈。 */
|
|
264
|
+
deleteParagraphsWithGroup(groupId: string): void;
|
|
265
|
+
/** 当前是否正好选中一颗嵌入对象(含 host)。 */
|
|
266
|
+
selectedEmbed(): EmbedEntity | null;
|
|
267
|
+
/** 按谓词删除嵌入对象,从后往前以免下标错位。返回删除数量。 */
|
|
268
|
+
deleteEmbeds(pred: (entity: EmbedEntity, index: number) => boolean): number;
|
|
269
|
+
/** 按谓词更新嵌入对象属性。`patchFor` 可按实体合并 data。返回更新数量。
|
|
270
|
+
* `history: false` 不进撤销栈(生成中态这类 UI 过程)。 */
|
|
271
|
+
updateEmbeds(pred: (entity: EmbedEntity, index: number) => boolean, patchFor: ImagePatch | ((entity: EmbedEntity, index: number) => ImagePatch), options?: {
|
|
272
|
+
history?: boolean;
|
|
273
|
+
}): number;
|
|
274
|
+
getSelection(): Selection;
|
|
275
|
+
/** 屏幕坐标落到文档下标,供拖放落点。 */
|
|
276
|
+
indexAtClientPoint(clientX: number, clientY: number): number;
|
|
277
|
+
setSelection(next: Selection): void;
|
|
278
|
+
/** 当前状态快照,用于同步宿主 UI。 */
|
|
279
|
+
getState(): EditorState;
|
|
280
|
+
/** 订阅事件,返回取消订阅函数。 */
|
|
281
|
+
on(event: EditorEvent, handler: () => void): () => void;
|
|
282
|
+
focus(): void;
|
|
283
|
+
/** 输入法组合是否进行中(含候选串已镜像进模型、尚未落定)。 */
|
|
284
|
+
composing(): boolean;
|
|
285
|
+
/** 禁用输入与快捷键。宿主 disabled 不能只靠 CSS pointer-events。 */
|
|
286
|
+
setDisabled(disabled: boolean): void;
|
|
287
|
+
private emit;
|
|
288
|
+
private bindSurface;
|
|
289
|
+
private unbindSurface;
|
|
290
|
+
private bind;
|
|
291
|
+
destroy(): void;
|
|
292
|
+
private onWindowResize;
|
|
293
|
+
/**
|
|
294
|
+
* 按当前 width 策略算出内容宽度。
|
|
295
|
+
* - 固定像素:直接返回。
|
|
296
|
+
* - 'fill':宿主容器可用宽减去左右版心内边距;容器尚未布局(宽度为 0)时回退默认值,
|
|
297
|
+
* 避免首帧算出负数或零宽。
|
|
298
|
+
*/
|
|
299
|
+
private resolveContentWidth;
|
|
300
|
+
private commit;
|
|
301
|
+
private targetDoc;
|
|
302
|
+
private targetSel;
|
|
303
|
+
private setTargetSel;
|
|
304
|
+
private syncActiveFragment;
|
|
305
|
+
private activeRefBox;
|
|
306
|
+
private refreshRefMetrics;
|
|
307
|
+
/**
|
|
308
|
+
* 一次用户操作的事务边界。事务本体在 Edit 层,这里只负责给它当前的选区和
|
|
309
|
+
* 作用域,再把产出的记录送进撤销栈。
|
|
310
|
+
*
|
|
311
|
+
* 同步块内部编辑走的是同一条路,只是作用域换成片段 id —— 发出去的 mutation
|
|
312
|
+
* 自动包上 `scoped`,进的还是同一个撤销栈。
|
|
313
|
+
*/
|
|
314
|
+
private runEdit;
|
|
315
|
+
/** 立即落一次变更,不进撤销栈。拖拽预览这类「过程中」的改动用它。 */
|
|
316
|
+
private applyNow;
|
|
317
|
+
/**
|
|
318
|
+
* 把已经预览生效的改动登记成一步可撤销的编辑。
|
|
319
|
+
*
|
|
320
|
+
* 拖拽缩放这类交互会先用 `applyNow` 实时改文档,松手时才落定。这里的做法是
|
|
321
|
+
* 悄悄退回到起点、再用一次真正的编辑走到终点 —— 两步在同一帧内完成,用户看不
|
|
322
|
+
* 出来,换来的是一条正常的、能重放能变换的操作记录,而不是一对手写的闭包。
|
|
323
|
+
*/
|
|
324
|
+
private commitPreview;
|
|
325
|
+
private deleteSelectionIfNeeded;
|
|
326
|
+
private clearCellGrid;
|
|
327
|
+
/**
|
|
328
|
+
* 处理输入法组合态(拼音/候选的中间态)。
|
|
329
|
+
*
|
|
330
|
+
* 组合串镜像插入文档模型、参与真实排版 —— 每次变化都幂等地「删旧串 → 插新串」,
|
|
331
|
+
* 光标后的内容因此靠正常重排让开,而不是被浮层盖住。整个组合过程用 applyNow
|
|
332
|
+
* 落地、不进撤销栈;最终文字在 compositionend 后由 onInsertText 走一次正常插入
|
|
333
|
+
* 落定成一步可撤销的编辑。组合区外观由白块 overlay 擦白,只留系统输入法的候选串。
|
|
334
|
+
*/
|
|
335
|
+
private handleComposition;
|
|
336
|
+
insertText(text: string): void;
|
|
337
|
+
pasteText(text: string): void;
|
|
338
|
+
pasteClipboard(data: DataTransfer | null): void;
|
|
339
|
+
insertParagraph(opts?: {
|
|
340
|
+
shift?: boolean;
|
|
341
|
+
}): void;
|
|
342
|
+
private inheritedTypingStyle;
|
|
343
|
+
private beginFormulaEdit;
|
|
344
|
+
private beginSlotActivate;
|
|
345
|
+
backspace(): void;
|
|
346
|
+
deleteForward(): void;
|
|
347
|
+
private applyText;
|
|
348
|
+
private toggleText;
|
|
349
|
+
private applyPara;
|
|
350
|
+
private toggleLink;
|
|
351
|
+
private toggleList;
|
|
352
|
+
private changeIndent;
|
|
353
|
+
private insertEmbed;
|
|
354
|
+
private resolveInsertIndex;
|
|
355
|
+
private innerContentWidth;
|
|
356
|
+
private insertCodeBlock;
|
|
357
|
+
private insertFormula;
|
|
358
|
+
private insertSlot;
|
|
359
|
+
private promoteRef;
|
|
360
|
+
private insertExistingRef;
|
|
361
|
+
private insertRefAtCaret;
|
|
362
|
+
private unlinkSelectedRef;
|
|
363
|
+
private selectedEmbedIndex;
|
|
364
|
+
private deleteSelectedEmbed;
|
|
365
|
+
private exitRefEditAtStart;
|
|
366
|
+
private refInnerLayout;
|
|
367
|
+
private hitRefIndex;
|
|
368
|
+
private beginRefEdit;
|
|
369
|
+
private exitRefEdit;
|
|
370
|
+
private onRefJump;
|
|
371
|
+
private onDoubleClick;
|
|
372
|
+
private applyEmbedPatch;
|
|
373
|
+
private onEmbedMeasure;
|
|
374
|
+
private onEmbedChange;
|
|
375
|
+
private onEmbedCommit;
|
|
376
|
+
private onEmbedExitEdit;
|
|
377
|
+
private insertMediaFile;
|
|
378
|
+
private insertTable;
|
|
379
|
+
private tableOp;
|
|
380
|
+
undo(): void;
|
|
381
|
+
redo(): void;
|
|
382
|
+
/**
|
|
383
|
+
* 执行撤销栈交回来的一步。
|
|
384
|
+
*
|
|
385
|
+
* 栈给的是一条常规 EditResult:`mutations` 直接应用,选区取 `selectionAfter`。
|
|
386
|
+
* 选区属于哪个坐标空间由 `meta.scope` 说了算 —— 片段里的编辑,撤销时该动的是
|
|
387
|
+
* 片段选区。
|
|
388
|
+
*/
|
|
389
|
+
private applyHistoryStep;
|
|
390
|
+
private relayout;
|
|
391
|
+
private paintChrome;
|
|
392
|
+
/**
|
|
393
|
+
* 占位只在「看不见任何正文」时出现。组合一开始(哪怕候选串还是空的)就必须关掉:
|
|
394
|
+
* 中间态走 applyNow,不发 change,宿主叠层会一直以为是空的。
|
|
395
|
+
*/
|
|
396
|
+
private syncPlaceholder;
|
|
397
|
+
private decorateHostNodes;
|
|
398
|
+
private decorateRefNodes;
|
|
399
|
+
private paintCaretLayer;
|
|
400
|
+
/** 组合串起点(锚点)的屏幕坐标;主文档与片段内编辑都算对。 */
|
|
401
|
+
private composeCaret;
|
|
402
|
+
private refCaretPos;
|
|
403
|
+
private currentTextStyle;
|
|
404
|
+
private currentParaTextDefaults;
|
|
405
|
+
private syncToolbar;
|
|
406
|
+
private syncStatus;
|
|
407
|
+
private resetBlink;
|
|
408
|
+
private scrollCaret;
|
|
409
|
+
private localPoint;
|
|
410
|
+
private onDocMouseDown;
|
|
411
|
+
private onRootMouseDown;
|
|
412
|
+
private onFocusChange;
|
|
413
|
+
private onMouseDown;
|
|
414
|
+
private onMouseMove;
|
|
415
|
+
private onMouseUp;
|
|
416
|
+
private onResizeStart;
|
|
417
|
+
private hitImage;
|
|
418
|
+
private selectedImage;
|
|
419
|
+
private updateEmbedChrome;
|
|
420
|
+
private writeClipboard;
|
|
421
|
+
private onCopy;
|
|
422
|
+
private onCut;
|
|
423
|
+
private isFocused;
|
|
424
|
+
/** 焦点在公式/槽等嵌入控件内时不画外层光标。 */
|
|
425
|
+
private isEmbedChromeFocused;
|
|
426
|
+
/**
|
|
427
|
+
* 这次按键归不归本编辑器管。
|
|
428
|
+
*
|
|
429
|
+
* 「哪个键干什么」在 commands/shortcuts.ts 里,门面只回答这一个问题 —— 焦点在
|
|
430
|
+
* 别的输入框、编辑器没装备快捷键、焦点在嵌入对象的字段里,都不接。
|
|
431
|
+
*/
|
|
432
|
+
private acceptsKey;
|
|
433
|
+
private selectAll;
|
|
434
|
+
/** Escape:先弹出虚拟块一层,再退出同步块内部编辑。 */
|
|
435
|
+
private exitFragmentEdit;
|
|
436
|
+
/** Tab:在列表里改嵌套层级,否则在表格里跳到下一格。 */
|
|
437
|
+
private indentOrNextCell;
|
|
438
|
+
private moveTableCell;
|
|
439
|
+
private expandSel;
|
|
440
|
+
private applyColResize;
|
|
441
|
+
private moveCaret;
|
|
442
|
+
private moveFragmentCaret;
|
|
443
|
+
private stackTop;
|
|
444
|
+
private selectedVblock;
|
|
445
|
+
private selectedRegion;
|
|
446
|
+
private editingSlot;
|
|
447
|
+
private editingSlotIn;
|
|
448
|
+
private selectionCoversSlot;
|
|
449
|
+
/** 选中槽、整槽选区、或空槽编辑:下一次写入应 fillSlot,不要先 clear 再插。 */
|
|
450
|
+
private slotToFill;
|
|
451
|
+
private selectVblock;
|
|
452
|
+
private popVblock;
|
|
453
|
+
private enterSelectedVblock;
|
|
454
|
+
private handleVblockBackspace;
|
|
455
|
+
private moveAcrossVblock;
|
|
456
|
+
private outermostStartingAt;
|
|
457
|
+
private outermostEndingAt;
|
|
458
|
+
private hitVblockClick;
|
|
459
|
+
private snapIndexForDrag;
|
|
460
|
+
private selectionPaintRects;
|
|
461
|
+
private snapSelIfNeeded;
|
|
462
|
+
/** 对照常见 Docs 行为:先选中嵌入块,再按同一方向才跳过。 */
|
|
463
|
+
private moveAcrossEmbed;
|
|
464
|
+
private setSel;
|
|
465
|
+
private afterCaretMove;
|
|
466
|
+
private stepIndex;
|
|
467
|
+
private verticalMove;
|
|
468
|
+
}
|
|
469
|
+
//# sourceMappingURL=editor.d.ts.map
|