@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,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 自检专用的便捷外壳。**不要在产品代码里用。**
|
|
3
|
+
*
|
|
4
|
+
* 自检里有大量「连着做十几步编辑,然后断言文档长什么样」的用例,每一步都写成
|
|
5
|
+
* runOperation(...) 会把断言淹掉。这里给文档套一层壳:读属性照旧透传,
|
|
6
|
+
* 写方法则各自起一次 Operation。
|
|
7
|
+
*
|
|
8
|
+
* 它只是省掉样板,并没有绕过 mutation —— 每个方法都老老实实走 Operation 层,
|
|
9
|
+
* 所以自检验证的仍然是真实路径。产品代码请直接调 Operation,因为你几乎总是
|
|
10
|
+
* 需要拿到操作串去进撤销栈。
|
|
11
|
+
*/
|
|
12
|
+
import { DocumentModel } from '../model/document';
|
|
13
|
+
import { ImageEntity, ParagraphProps, Slice, TextProps, VirtualBlockChrome } from '../model/types';
|
|
14
|
+
import * as ops from './index';
|
|
15
|
+
type Writes = {
|
|
16
|
+
insertText(index: number, text: string, inherit?: TextProps): number;
|
|
17
|
+
insertParagraph(index: number): number;
|
|
18
|
+
deleteRange(start: number, end: number): Slice;
|
|
19
|
+
backspace(index: number): ops.DeleteHit;
|
|
20
|
+
deleteForward(index: number): ops.DeleteHit;
|
|
21
|
+
applyMarkdownShortcut(caret: number): number;
|
|
22
|
+
applyTextStyle(start: number, end: number, patch: TextProps): void;
|
|
23
|
+
applyParagraphStyle(start: number, end: number, patch: ParagraphProps): void;
|
|
24
|
+
applyLink(start: number, end: number, url: string): void;
|
|
25
|
+
removeLink(index: number): void;
|
|
26
|
+
insertImage(index: number, entity: ops.NewEntity): number;
|
|
27
|
+
updateImage(id: string, patch: ops.ImagePatch): void;
|
|
28
|
+
insertTable(index: number, rows?: number, cols?: number): number;
|
|
29
|
+
insertTableRow(index: number): boolean;
|
|
30
|
+
insertTableCol(index: number): boolean;
|
|
31
|
+
deleteTableRow(index: number): boolean;
|
|
32
|
+
deleteTableCol(index: number): boolean;
|
|
33
|
+
setTableColWidths(index: number, widths: number[]): void;
|
|
34
|
+
insertSlice(index: number, slice: Slice, asCopy?: boolean): number;
|
|
35
|
+
insertMarkdown(index: number, raw: string): number;
|
|
36
|
+
pasteText(index: number, raw: string, inherit?: TextProps): number;
|
|
37
|
+
promoteRange(start: number, end: number): {
|
|
38
|
+
fragmentId: string;
|
|
39
|
+
index: number;
|
|
40
|
+
} | null;
|
|
41
|
+
insertRef(index: number, fragmentId: string): number;
|
|
42
|
+
unlinkRef(index: number): number | null;
|
|
43
|
+
insertVirtualBlock(spec: ops.VirtualBlockSpec): string | null;
|
|
44
|
+
removeVirtualBlock(id: string): boolean;
|
|
45
|
+
clearSlot(id: string): boolean;
|
|
46
|
+
fillSlot(id: string, text: string, inherit?: TextProps): number | null;
|
|
47
|
+
updateVirtualBlockChrome(id: string, chrome: VirtualBlockChrome): boolean;
|
|
48
|
+
};
|
|
49
|
+
export type EditableDoc = DocumentModel & Writes;
|
|
50
|
+
export declare function editable(doc: DocumentModel): EditableDoc;
|
|
51
|
+
/** 直接建一个套好壳的空文档。 */
|
|
52
|
+
export declare function editableDoc(...args: ConstructorParameters<typeof DocumentModel>): EditableDoc;
|
|
53
|
+
export type { ImageEntity };
|
|
54
|
+
//# sourceMappingURL=harness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harness.d.ts","sourceRoot":"","sources":["../../../src/operations/harness.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Operation 层出口。
|
|
3
|
+
*
|
|
4
|
+
* Operation 是「一件事」的可组合单元:读模型、判断、发出解析完整的 mutation。
|
|
5
|
+
* 它不管撤销栈、不管选区落点之外的 UI 状态,那些是 Edit 层的事。
|
|
6
|
+
*/
|
|
7
|
+
export type { Operation, OperationContext, OperationRun } from './context';
|
|
8
|
+
export { runOperation, scopeContext } from './context';
|
|
9
|
+
export { contentRuns, expectedParagraphSpans, rangeIsOnlyMarkers, resolveParagraphProps, resolveTextProps, spanCovering, textSegments } from './resolve';
|
|
10
|
+
export { emitDelete, emitInsert, emitStyle, emitTextStyle, ensureParagraphAfter, normalizeParagraphs } from './primitives';
|
|
11
|
+
export { applyLink, applyParagraphStyle, applyTextStyle, removeLink } from './style';
|
|
12
|
+
export type { DeleteHit } from './text';
|
|
13
|
+
export { applyMarkdownShortcut, backspace, deleteForward, deleteRange, insertParagraph, insertText } from './text';
|
|
14
|
+
export type { ImagePatch, NewEntity } from './entity';
|
|
15
|
+
export { insertImage, updateImage } from './entity';
|
|
16
|
+
export { deleteTableCol, deleteTableRow, insertTable, insertTableCol, insertTableRow, setTableColWidths } from './table';
|
|
17
|
+
export { insertMarkdown, insertRef, insertSlice, pasteText, promoteRange, unlinkRef } from './slice';
|
|
18
|
+
export type { VirtualBlockSpec } from './virtualBlock';
|
|
19
|
+
export { clearSlot, coverAncestorsOf, coverVirtualBlocks, fillSlot, slotInlineText, insertVirtualBlock, removeVirtualBlock, updateVirtualBlockChrome, validateInsert } from './virtualBlock';
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/operations/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,YAAY,EAAE,SAAS,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEvD,OAAO,EACL,WAAW,EACX,sBAAsB,EACtB,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACb,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,UAAU,EACV,UAAU,EACV,SAAS,EACT,aAAa,EACb,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErF,YAAY,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EACL,qBAAqB,EACrB,SAAS,EACT,aAAa,EACb,WAAW,EACX,eAAe,EACf,UAAU,EACX,MAAM,QAAQ,CAAC;AAEhB,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEpD,OAAO,EACL,cAAc,EACd,cAAc,EACd,WAAW,EACX,cAAc,EACd,cAAc,EACd,iBAAiB,EAClB,MAAM,SAAS,CAAC;AAEjB,OAAO,EACL,cAAc,EACd,SAAS,EACT,WAAW,EACX,SAAS,EACT,YAAY,EACZ,SAAS,EACV,MAAM,SAAS,CAAC;AAEjB,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,kBAAkB,EAClB,QAAQ,EACR,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,wBAAwB,EACxB,cAAc,EACf,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Operation 层的低级发射助手。
|
|
3
|
+
*
|
|
4
|
+
* 这些不是 mutation,也不是完整的 Operation,而是介于两者之间的常用动作:
|
|
5
|
+
* 「删一段字符流并顺手清掉附着的实体」「把段落区间重新对齐到块结构」之类。
|
|
6
|
+
* 它们只通过 ctx.emit 改文档,所以每一步都进日志、都能被撤销和变换。
|
|
7
|
+
*/
|
|
8
|
+
import { Slice, StyleSpan, StyleType, TextProps } from '../model/types';
|
|
9
|
+
import { OperationContext } from './context';
|
|
10
|
+
/** 在 index 处插入原始 spacer 串。不做任何段落推导。 */
|
|
11
|
+
export declare function emitInsert(ctx: OperationContext, index: number, text: string): number;
|
|
12
|
+
/**
|
|
13
|
+
* 删掉半开区间 [start, end),返回被删内容。
|
|
14
|
+
*
|
|
15
|
+
* 落在区间里的实体会显式发一条 deleteEntity —— 让实体的消失也是一条 mutation,
|
|
16
|
+
* 而不是删字符的隐式副作用,否则撤销和协同都对不上账。
|
|
17
|
+
*/
|
|
18
|
+
export declare function emitDelete(ctx: OperationContext, start: number, end: number): Slice;
|
|
19
|
+
/** 给半开区间 [start, end) 覆盖一条样式区间。props 必须已解析完整。 */
|
|
20
|
+
export declare function emitStyle(ctx: OperationContext, type: StyleType, start: number, end: number, props: StyleSpan['props'] | null): void;
|
|
21
|
+
/**
|
|
22
|
+
* 文字上色。把区间按已有区间边界切段,每段各自算出**合并后的完整属性**再发。
|
|
23
|
+
* 纯结构标记的空档不上色,免得给段分隔符染上颜色。
|
|
24
|
+
*/
|
|
25
|
+
export declare function emitTextStyle(ctx: OperationContext, start: number, end: number, patch: TextProps): void;
|
|
26
|
+
/**
|
|
27
|
+
* 把 paragraph 区间重新对齐到当前块结构,只发实际有出入的那一段。
|
|
28
|
+
*
|
|
29
|
+
* 从前这是模型在删字符时偷偷做的,逆操作里没有记录,所以撤销要靠整篇比对样式。
|
|
30
|
+
* 现在它是显式的 applyStyle,逆自然就跟着有了。
|
|
31
|
+
*/
|
|
32
|
+
export declare function normalizeParagraphs(ctx: OperationContext): void;
|
|
33
|
+
/** 文档尾部必须有一个段分隔符收口,插表格之后要补。 */
|
|
34
|
+
export declare function ensureParagraphAfter(ctx: OperationContext, index: number): void;
|
|
35
|
+
//# sourceMappingURL=primitives.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"primitives.d.ts","sourceRoot":"","sources":["../../../src/operations/primitives.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAUxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAK7C,uCAAuC;AACvC,wBAAgB,UAAU,CAAC,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAKrF;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,KAAK,CAQnF;AAED,iDAAiD;AACjD,wBAAgB,SAAS,CACvB,GAAG,EAAE,gBAAgB,EACrB,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,QAIjC;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,QAahG;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,gBAAgB,QA+CxD;AAED,+BAA+B;AAC/B,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,QAGxE"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { DocumentModel } from '../model/document';
|
|
2
|
+
import { ParagraphProps, StyleSpan, StyleType, TextProps } from '../model/types';
|
|
3
|
+
/** 落在 index 处的完整文字属性。没有区间时是空对象,代表「未着色」。 */
|
|
4
|
+
export declare function resolveTextProps(doc: DocumentModel, index: number): TextProps;
|
|
5
|
+
/** 落在 index 所属段落上的完整段落属性,缺省项补齐。 */
|
|
6
|
+
export declare function resolveParagraphProps(doc: DocumentModel, index: number): ParagraphProps;
|
|
7
|
+
/** 半开区间 [start, end) 内是否只有结构标记(段分隔、表格骨架、图片占位)。 */
|
|
8
|
+
export declare function rangeIsOnlyMarkers(doc: DocumentModel, start: number, end: number): boolean;
|
|
9
|
+
/** 一段文本里「真正是内容」的片段,用来给新插入的字上色时跳过结构标记。 */
|
|
10
|
+
export declare function contentRuns(text: string, base: number): [number, number][];
|
|
11
|
+
/**
|
|
12
|
+
* 把半开区间 [from, to) 按「已有 text 区间的边界」切成若干小段。
|
|
13
|
+
* 每段要么整段落在某个已有区间里(带上它,属性要在它基础上合并),
|
|
14
|
+
* 要么是空档(属性从零起)。这是文字上色能算出完整值的前提。
|
|
15
|
+
*/
|
|
16
|
+
export declare function textSegments(doc: DocumentModel, from: number, to: number): {
|
|
17
|
+
start: number;
|
|
18
|
+
end: number;
|
|
19
|
+
existing: StyleSpan | null;
|
|
20
|
+
}[];
|
|
21
|
+
/** 某一类样式里,完整覆盖 [start, end) 的那条区间。 */
|
|
22
|
+
export declare function spanCovering(doc: DocumentModel, type: StyleType, start: number, end: number): StyleSpan | null;
|
|
23
|
+
/**
|
|
24
|
+
* 按当前字符流算出「段落区间应该长什么样」。
|
|
25
|
+
*
|
|
26
|
+
* 段分隔符一插一删,段落的边界就变了。这里从块结构重新推导出该有的一组
|
|
27
|
+
* paragraph 区间,属性尽量沿用原来落在同一位置的那条 —— 这就是回车后新段
|
|
28
|
+
* 能继承缩进和列表状态的原因。
|
|
29
|
+
*/
|
|
30
|
+
export declare function expectedParagraphSpans(doc: DocumentModel): StyleSpan[];
|
|
31
|
+
//# sourceMappingURL=resolve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../../src/operations/resolve.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,OAAO,EAAqB,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEpG,2CAA2C;AAC3C,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,CAE7E;AAED,mCAAmC;AACnC,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,cAAc,CAEvF;AAED,kDAAkD;AAClD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAO1F;AAED,yCAAyC;AACzC,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAc1E;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,GAAG,EAAE,aAAa,EAClB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,GACT;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,SAAS,GAAG,IAAI,CAAA;CAAE,EAAE,CAkB9D;AAED,sCAAsC;AACtC,wBAAgB,YAAY,CAC1B,GAAG,EAAE,aAAa,EAClB,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,GACV,SAAS,GAAG,IAAI,CAElB;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,aAAa,GAAG,SAAS,EAAE,CA6BtE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selfcheck.d.ts","sourceRoot":"","sources":["../../../src/operations/selfcheck.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Slice, TextProps } from '../model/types';
|
|
2
|
+
import { Operation } from './context';
|
|
3
|
+
/**
|
|
4
|
+
* 把一个切片插到 index 处。
|
|
5
|
+
*
|
|
6
|
+
* asCopy 为真时先把切片里的同步块引用摊平成实际内容 —— 跨文档粘贴不该带走
|
|
7
|
+
* 一个指向源文档的悬空引用。
|
|
8
|
+
*/
|
|
9
|
+
export declare function insertSlice(index: number, slice: Slice, asCopy?: boolean): Operation<number>;
|
|
10
|
+
/** 把一段 Markdown 原文导入到 index 处。段落中间导入时先把段切开。 */
|
|
11
|
+
export declare function insertMarkdown(index: number, raw: string): Operation<number>;
|
|
12
|
+
/** 粘贴纯文本。看起来像 Markdown 就走导入,否则当普通文字插入。 */
|
|
13
|
+
export declare function pasteText(index: number, raw: string, inherit?: TextProps): Operation<number>;
|
|
14
|
+
/**
|
|
15
|
+
* 把一段内容提取成同步块,原地换成一个引用。
|
|
16
|
+
*
|
|
17
|
+
* fragment 的新建走 addFragment mutation,和后续的删除、插入引用一起进操作串,
|
|
18
|
+
* 因此整步可撤销、可协同。
|
|
19
|
+
*/
|
|
20
|
+
export declare function promoteRange(start: number, end: number): Operation<{
|
|
21
|
+
fragmentId: string;
|
|
22
|
+
index: number;
|
|
23
|
+
} | null>;
|
|
24
|
+
/** 在 index 处插一个指向同步块的引用,返回引用占位符自身的位置。 */
|
|
25
|
+
export declare function insertRef(index: number, fragmentId: string): Operation<number>;
|
|
26
|
+
/** 把引用就地展开成实际内容,引用本身消失。返回展开后的末尾位置。 */
|
|
27
|
+
export declare function unlinkRef(index: number): Operation<number | null>;
|
|
28
|
+
//# sourceMappingURL=slice.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slice.d.ts","sourceRoot":"","sources":["../../../src/operations/slice.ts"],"names":[],"mappings":"AAOA,OAAO,EAAsC,KAAK,EAAa,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAWjG,OAAO,EAAE,SAAS,EAAgB,MAAM,WAAW,CAAC;AAkCpD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,UAAO,GAAG,SAAS,CAAC,MAAM,CAAC,CA4DzF;AAED,+CAA+C;AAC/C,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAuB5E;AAED,0CAA0C;AAC1C,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAG5F;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAgBhH;AAED,yCAAyC;AACzC,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAW9E;AAED,sCAAsC;AACtC,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,CAYjE"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ParagraphProps, TextProps } from '../model/types';
|
|
2
|
+
import { Operation } from './context';
|
|
3
|
+
/** 给半开区间 [start, end) 打文字样式补丁。 */
|
|
4
|
+
export declare function applyTextStyle(start: number, end: number, patch: TextProps): Operation;
|
|
5
|
+
/**
|
|
6
|
+
* 给区间套链接。
|
|
7
|
+
*
|
|
8
|
+
* 与之相交的旧链接要整条清掉(而不是只清重叠部分),否则会留下半截尾巴 ——
|
|
9
|
+
* 所以清除范围先向外扩到覆盖所有相交的链接区间。
|
|
10
|
+
*/
|
|
11
|
+
export declare function applyLink(start: number, end: number, url: string): Operation;
|
|
12
|
+
/** 摘掉落在 index 处的链接,顺带把链接色和下划线还原成默认。 */
|
|
13
|
+
export declare function removeLink(index: number): Operation;
|
|
14
|
+
/**
|
|
15
|
+
* 给区间覆盖到的每个段落打段落样式补丁。
|
|
16
|
+
*
|
|
17
|
+
* 段落属性是整段一个值,所以逐段读出现值、合并补丁、整段覆盖回去。
|
|
18
|
+
*/
|
|
19
|
+
export declare function applyParagraphStyle(start: number, end: number, patch: ParagraphProps): Operation;
|
|
20
|
+
//# sourceMappingURL=style.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"style.d.ts","sourceRoot":"","sources":["../../../src/operations/style.ts"],"names":[],"mappings":"AAOA,OAAO,EAA4B,cAAc,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACrF,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAItC,kCAAkC;AAClC,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,SAAS,CAItF;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,CAiB5E;AAED,uCAAuC;AACvC,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAQnD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,SAAS,CAQhG"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Operation } from './context';
|
|
2
|
+
/** 插入空表。表格不能嵌在段落中间,所以必要时先把当前段切开。返回首格光标位置。 */
|
|
3
|
+
export declare function insertTable(index: number, rows?: number, cols?: number): Operation<number>;
|
|
4
|
+
/** 在当前行下面插一行。 */
|
|
5
|
+
export declare function insertTableRow(index: number): Operation<boolean>;
|
|
6
|
+
/** 在当前列右边插一列。从下往上插,免得前面的插入把后面的坐标顶跑。 */
|
|
7
|
+
export declare function insertTableCol(index: number): Operation<boolean>;
|
|
8
|
+
/** 删当前行。最后一行不给删。 */
|
|
9
|
+
export declare function deleteTableRow(index: number): Operation<boolean>;
|
|
10
|
+
/** 删当前列。最后一列不给删。 */
|
|
11
|
+
export declare function deleteTableCol(index: number): Operation<boolean>;
|
|
12
|
+
/** 拖动列边界后落定列宽。 */
|
|
13
|
+
export declare function setTableColWidths(index: number, widths: number[]): Operation;
|
|
14
|
+
//# sourceMappingURL=table.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../../src/operations/table.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,SAAS,EAAoB,MAAM,WAAW,CAAC;AAiBxD,6CAA6C;AAC7C,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,SAAI,EAAE,IAAI,SAAI,GAAG,SAAS,CAAC,MAAM,CAAC,CAmBhF;AAED,iBAAiB;AACjB,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAWhE;AAED,uCAAuC;AACvC,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAoBhE;AAED,oBAAoB;AACpB,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAShE;AAED,oBAAoB;AACpB,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAsBhE;AAED,kBAAkB;AAClB,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAM5E"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Slice, TextProps } from '../model/types';
|
|
2
|
+
import { Operation } from './context';
|
|
3
|
+
/** 在 index 处插入文本,继承左侧文字样式(或调用方指定的样式)。返回新光标位置。 */
|
|
4
|
+
export declare function insertText(index: number, text: string, inherit?: TextProps): Operation<number>;
|
|
5
|
+
/** 回车。空列表项上先降缩进再退出列表;否则切段,两段各自继承合适的属性。 */
|
|
6
|
+
export declare function insertParagraph(index: number): Operation<number>;
|
|
7
|
+
/** 删掉一段区间,边界会向外扩到不切断表格等结构。 */
|
|
8
|
+
export declare function deleteRange(start: number, end: number): Operation<Slice>;
|
|
9
|
+
export type DeleteHit = {
|
|
10
|
+
start: number;
|
|
11
|
+
end: number;
|
|
12
|
+
slice: Slice;
|
|
13
|
+
} | null;
|
|
14
|
+
/** 退格。列表段首先去 bullet;删段分隔符时存活段继承上一段属性;表格骨架不动。 */
|
|
15
|
+
export declare function backspace(index: number): Operation<DeleteHit>;
|
|
16
|
+
/** Delete 键。整表要整体删掉,其余按一个码点删。 */
|
|
17
|
+
export declare function deleteForward(index: number): Operation<DeleteHit>;
|
|
18
|
+
/** 打完字后试着把 `# `、`- `、`**x**` 之类就地转成真正的样式或嵌入块。 */
|
|
19
|
+
export declare function applyMarkdownShortcut(caret: number): Operation<number>;
|
|
20
|
+
//# sourceMappingURL=text.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../../src/operations/text.ts"],"names":[],"mappings":"AAQA,OAAO,EAAmD,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGnG,OAAO,EAAE,SAAS,EAAoB,MAAM,WAAW,CAAC;AAgDxD,iDAAiD;AACjD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAqB9F;AAED,0CAA0C;AAC1C,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAgDhE;AAED,8BAA8B;AAC9B,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAYxE;AAED,MAAM,MAAM,SAAS,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,GAAG,IAAI,CAAC;AAE5E,gDAAgD;AAChD,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,CAkC7D;AAED,iCAAiC;AACjC,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,CAoBjE;AAED,iDAAiD;AACjD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAwDtE"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 虚拟块 Operation:套皮、拆皮、清槽、填槽、插入后盖住新字。
|
|
3
|
+
*
|
|
4
|
+
* 嵌套合法性在这里判断,通过才发 mutation。插删字符对区间的机械挪动在
|
|
5
|
+
* applier 里,但清槽会把覆盖整段删掉(块被表里摘掉),所以这里要按快照补回。
|
|
6
|
+
*/
|
|
7
|
+
import { TextProps, VirtualBlock, VirtualBlockChrome, VirtualBlockKind } from '../model/types';
|
|
8
|
+
import { Operation } from './context';
|
|
9
|
+
export interface VirtualBlockSpec {
|
|
10
|
+
id?: string;
|
|
11
|
+
parentId?: string | null;
|
|
12
|
+
kind: VirtualBlockKind;
|
|
13
|
+
start: number;
|
|
14
|
+
end: number;
|
|
15
|
+
chrome?: VirtualBlockChrome;
|
|
16
|
+
placeholder?: string;
|
|
17
|
+
empty?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export declare function validateInsert(doc: {
|
|
20
|
+
virtualBlocks: Map<string, VirtualBlock>;
|
|
21
|
+
}, block: VirtualBlock): string | null;
|
|
22
|
+
/**
|
|
23
|
+
* 把 [start, end) 包成一层皮。不改字。
|
|
24
|
+
* 完全落在新区间里的已有块会改挂到这一层下面。
|
|
25
|
+
*/
|
|
26
|
+
export declare function insertVirtualBlock(spec: VirtualBlockSpec): Operation<string | null>;
|
|
27
|
+
/** 拆掉皮,字和胶囊留下。子块改挂到被拆掉那一层的父上。 */
|
|
28
|
+
export declare function removeVirtualBlock(id: string): Operation<boolean>;
|
|
29
|
+
export declare function updateVirtualBlockChrome(id: string, chrome: VirtualBlockChrome): Operation<boolean>;
|
|
30
|
+
/** 把槽内容换成 placeholder,empty=true。槽和父块都留下。 */
|
|
31
|
+
export declare function clearSlot(id: string): Operation<boolean>;
|
|
32
|
+
/** 槽是行内区间:去掉尾部换行,中间的段分隔折成空格。 */
|
|
33
|
+
export declare function slotInlineText(text: string): string;
|
|
34
|
+
/**
|
|
35
|
+
* empty 时覆盖 placeholder;已填则整段替换。一次事务。
|
|
36
|
+
* 返回新光标(槽尾)。槽内不进段分隔符。
|
|
37
|
+
*/
|
|
38
|
+
export declare function fillSlot(id: string, text: string, inherit?: TextProps): Operation<number | null>;
|
|
39
|
+
/** 按 id 找到槽/块,连祖先一起撑开盖住 [start, end)。 */
|
|
40
|
+
export declare function coverAncestorsOf(id: string, start: number, end: number): Operation<void>;
|
|
41
|
+
/** 插入后把指定块(及仍在的祖先)撑开盖住 [start, end)。 */
|
|
42
|
+
export declare function coverVirtualBlocks(ids: string[], start: number, end: number): Operation<void>;
|
|
43
|
+
export declare function remapIncomingVirtualBlocks(blocks: VirtualBlock[], offset: number, occupied: Set<string>): VirtualBlock[];
|
|
44
|
+
//# sourceMappingURL=virtualBlock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"virtualBlock.d.ts","sourceRoot":"","sources":["../../../src/operations/virtualBlock.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAiC,SAAS,EAAE,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAI9H,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAItC,MAAM,WAAW,gBAAgB;IAC/B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,EAAE,gBAAgB,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAMD,wBAAgB,cAAc,CAAC,GAAG,EAAE;IAAE,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;CAAE,EAAE,KAAK,EAAE,YAAY,GAAG,MAAM,GAAG,IAAI,CAoBpH;AAkBD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,gBAAgB,GAAG,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,CAmCnF;AAED,iCAAiC;AACjC,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAYjE;AAED,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,GAAG,SAAS,CAAC,OAAO,CAAC,CAOnG;AA8BD,6CAA6C;AAC7C,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAcxD;AAED,gCAAgC;AAChC,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,CAoBhG;AAED,yCAAyC;AACzC,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAcxF;AAED,wCAAwC;AACxC,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAkB7F;AAED,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,YAAY,EAAE,EACtB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,GACpB,YAAY,EAAE,CAoBhB"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { CaretPos, DocLayout, SelRect } from '../layout/types';
|
|
2
|
+
import { PaintBackend } from './types';
|
|
3
|
+
export declare class CanvasPainter implements PaintBackend {
|
|
4
|
+
private host;
|
|
5
|
+
private surface;
|
|
6
|
+
private canvas;
|
|
7
|
+
private chrome;
|
|
8
|
+
private ctx;
|
|
9
|
+
private chromeCtx;
|
|
10
|
+
private layout;
|
|
11
|
+
private selRects;
|
|
12
|
+
private caret;
|
|
13
|
+
private caretVisible;
|
|
14
|
+
private caretTrails;
|
|
15
|
+
private imageCache;
|
|
16
|
+
private embeds;
|
|
17
|
+
private embedCache;
|
|
18
|
+
private hasContent;
|
|
19
|
+
mount(host: HTMLElement): void;
|
|
20
|
+
getSurface(): HTMLElement;
|
|
21
|
+
paintDoc(layout: DocLayout): void;
|
|
22
|
+
paintSelection(rects: SelRect[]): void;
|
|
23
|
+
paintCaret(caret: CaretPos | null, visible: boolean, trails?: CaretPos[]): void;
|
|
24
|
+
destroy(): void;
|
|
25
|
+
private resize;
|
|
26
|
+
/** 只重画脏区带:clip 到那一条,擦白,再画与之相交的内容。 */
|
|
27
|
+
private redrawContent;
|
|
28
|
+
private redrawChrome;
|
|
29
|
+
private fillSelectionRect;
|
|
30
|
+
private paintVBlock;
|
|
31
|
+
private strokeVBlockOutline;
|
|
32
|
+
private drawCaret;
|
|
33
|
+
private paintGlyph;
|
|
34
|
+
private paintLineDeco;
|
|
35
|
+
private imageOf;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=canvasPainter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasPainter.d.ts","sourceRoot":"","sources":["../../../src/paint/canvasPainter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAY,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAEzE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,qBAAa,aAAc,YAAW,YAAY;IAChD,OAAO,CAAC,IAAI,CAA4B;IACxC,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,GAAG,CAAyC;IACpD,OAAO,CAAC,SAAS,CAAyC;IAC1D,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,UAAU,CAAuC;IACzD,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,UAAU,CAAkC;IACpD,OAAO,CAAC,UAAU,CAAS;IAE3B,KAAK,CAAC,IAAI,EAAE,WAAW;IAiBvB,UAAU,IAAI,WAAW;IAKzB,QAAQ,CAAC,MAAM,EAAE,SAAS;IAc1B,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE;IAK/B,UAAU,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAE,QAAQ,EAAO;IAO5E,OAAO;IAgBP,OAAO,CAAC,MAAM;IAqBd,qCAAqC;IACrC,OAAO,CAAC,aAAa;IA8DrB,OAAO,CAAC,YAAY;IAoBpB,OAAO,CAAC,iBAAiB;IAsBzB,OAAO,CAAC,WAAW;IAqBnB,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,SAAS;IAmCjB,OAAO,CAAC,UAAU;IAelB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,OAAO;CAYhB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { TextFill, TextProps, underlineKind } from '../model/types';
|
|
2
|
+
import { GlyphBox } from '../layout/types';
|
|
3
|
+
export declare function fillOf(style: TextProps): TextFill;
|
|
4
|
+
export declare function rainbowAt(index: number): string;
|
|
5
|
+
export declare function sunsetAt(t: number): string;
|
|
6
|
+
export declare function cssFill(style: TextProps, runWidth: number): string;
|
|
7
|
+
export declare function canvasFill(style: TextProps, glyphIndex: number, runT?: number): string;
|
|
8
|
+
export declare function paintCanvasUnderline(ctx: CanvasRenderingContext2D, x: number, y: number, w: number, size: number, kind: ReturnType<typeof underlineKind>, color: string): void;
|
|
9
|
+
export declare function paintCanvasStrike(ctx: CanvasRenderingContext2D, x: number, y: number, w: number, size: number, color: string): void;
|
|
10
|
+
export declare function groupDecorationRuns(glyphs: GlyphBox[]): {
|
|
11
|
+
x: number;
|
|
12
|
+
y: number;
|
|
13
|
+
w: number;
|
|
14
|
+
size: number;
|
|
15
|
+
kind: ReturnType<typeof underlineKind>;
|
|
16
|
+
strike: boolean;
|
|
17
|
+
color: string;
|
|
18
|
+
}[];
|
|
19
|
+
//# sourceMappingURL=decorations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decorations.d.ts","sourceRoot":"","sources":["../../../src/paint/decorations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,wBAAgB,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,QAAQ,CAEjD;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAG/C;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAI1C;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CASlE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,SAAI,GAAG,MAAM,CAKjF;AAED,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,wBAAwB,EAC7B,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,EACtC,KAAK,EAAE,MAAM,QA4Cd;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,wBAAwB,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAG5H;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,CAwBnL"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { CaretPos, DocLayout, SelRect } from '../layout/types';
|
|
2
|
+
import { PaintBackend } from './types';
|
|
3
|
+
export declare class HtmlPainter implements PaintBackend {
|
|
4
|
+
private host;
|
|
5
|
+
private surface;
|
|
6
|
+
private content;
|
|
7
|
+
private selection;
|
|
8
|
+
private caret;
|
|
9
|
+
private trails;
|
|
10
|
+
private embeds;
|
|
11
|
+
private embedCache;
|
|
12
|
+
mount(host: HTMLElement): void;
|
|
13
|
+
getSurface(): HTMLElement;
|
|
14
|
+
paintDoc(layout: DocLayout): void;
|
|
15
|
+
paintSelection(rects: SelRect[]): void;
|
|
16
|
+
paintCaret(caret: CaretPos | null, visible: boolean, trails?: CaretPos[]): void;
|
|
17
|
+
destroy(): void;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=htmlPainter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"htmlPainter.d.ts","sourceRoot":"","sources":["../../../src/paint/htmlPainter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAW,OAAO,EAA+B,MAAM,iBAAiB,CAAC;AAErG,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAWvC,qBAAa,WAAY,YAAW,YAAY;IAC9C,OAAO,CAAC,IAAI,CAA4B;IACxC,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,KAAK,CAA4B;IACzC,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,UAAU,CAAkC;IAEpD,KAAK,CAAC,IAAI,EAAE,WAAW;IAuBvB,UAAU,IAAI,WAAW;IAKzB,QAAQ,CAAC,MAAM,EAAE,SAAS;IAiC1B,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE;IAY/B,UAAU,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAE,QAAQ,EAAO;IAM5E,OAAO;CAWR"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { CaretPos, DocLayout, SelRect } from '../layout/types';
|
|
2
|
+
/**
|
|
3
|
+
* PaintBackend 只消费 layout 几何,不读 Document / DOM 选区。
|
|
4
|
+
*
|
|
5
|
+
* 换 Canvas 时实现同一接口即可,例如:
|
|
6
|
+
*
|
|
7
|
+
* class CanvasPainter implements PaintBackend {
|
|
8
|
+
* paintDoc(layout) {
|
|
9
|
+
* ctx.clearRect(...)
|
|
10
|
+
* for (const line of layout.lines) {
|
|
11
|
+
* for (const g of line.glyphs) ctx.fillText(g.text, g.x, g.y)
|
|
12
|
+
* for (const img of line.images) ctx.drawImage(...)
|
|
13
|
+
* }
|
|
14
|
+
* // 表格线:layout.tables
|
|
15
|
+
* }
|
|
16
|
+
* paintSelection(rects) { for (const r of rects) ctx.fillRect(r.x, r.y, r.w, r.h) }
|
|
17
|
+
* paintCaret(caret) { ctx.fillRect(caret.x, caret.y, 2, caret.h) }
|
|
18
|
+
* }
|
|
19
|
+
*
|
|
20
|
+
* 模型、命令、布局、命中测试和 IME 都不必改。
|
|
21
|
+
*/
|
|
22
|
+
export interface PaintBackend {
|
|
23
|
+
mount(host: HTMLElement): void;
|
|
24
|
+
paintDoc(layout: DocLayout): void;
|
|
25
|
+
paintSelection(rects: SelRect[]): void;
|
|
26
|
+
paintCaret(caret: CaretPos | null, visible: boolean, trails?: CaretPos[]): void;
|
|
27
|
+
getSurface(): HTMLElement;
|
|
28
|
+
destroy(): void;
|
|
29
|
+
}
|
|
30
|
+
export interface PaintHost {
|
|
31
|
+
surface: HTMLElement;
|
|
32
|
+
content: HTMLElement;
|
|
33
|
+
selection: HTMLElement;
|
|
34
|
+
caret: HTMLElement;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/paint/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IAClC,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IACvC,UAAU,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IAChF,UAAU,IAAI,WAAW,CAAC;IAC1B,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,WAAW,CAAC;IACrB,OAAO,EAAE,WAAW,CAAC;IACrB,SAAS,EAAE,WAAW,CAAC;IACvB,KAAK,EAAE,WAAW,CAAC;CACpB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,66 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@one2x/medeo-rte",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"description": "
|
|
6
|
-
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "自绘文档渲染引擎:字符流模型,排版输出纯几何,绘制后端可替换(HTML / Canvas)",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/one2x-ai/medeo-rte.git"
|
|
9
|
+
},
|
|
10
|
+
"license": "UNLICENSED",
|
|
11
|
+
"publishConfig": {
|
|
12
|
+
"access": "public",
|
|
13
|
+
"registry": "https://registry.npmjs.org/",
|
|
14
|
+
"provenance": false
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"main": "./dist/index.js",
|
|
20
|
+
"module": "./dist/index.js",
|
|
21
|
+
"types": "./dist/types/index.d.ts",
|
|
22
|
+
"exports": {
|
|
23
|
+
".": {
|
|
24
|
+
"types": "./dist/types/index.d.ts",
|
|
25
|
+
"import": "./dist/index.js"
|
|
26
|
+
},
|
|
27
|
+
"./formula": {
|
|
28
|
+
"types": "./dist/types/formula.d.ts",
|
|
29
|
+
"import": "./dist/formula.js"
|
|
30
|
+
},
|
|
31
|
+
"./style.css": "./dist/style.css",
|
|
32
|
+
"./package.json": "./package.json"
|
|
33
|
+
},
|
|
34
|
+
"sideEffects": [
|
|
35
|
+
"**/*.css"
|
|
36
|
+
],
|
|
37
|
+
"scripts": {
|
|
38
|
+
"dev": "vite",
|
|
39
|
+
"build": "tsc --noEmit && vite build",
|
|
40
|
+
"build:lib": "vite build --config vite.lib.config.ts && tsc -p tsconfig.build.json",
|
|
41
|
+
"preview": "vite preview",
|
|
42
|
+
"selfcheck": "npx --yes tsx src/operations/selfcheck.ts && npx --yes tsx src/mutations/selfcheck.ts && npx --yes tsx src/edits/selfcheck.ts && npx --yes tsx src/commands/selfcheck.ts && npx --yes tsx src/layout/selfcheck.ts",
|
|
43
|
+
"prepare": "npm run build:lib"
|
|
44
|
+
},
|
|
45
|
+
"peerDependencies": {
|
|
46
|
+
"katex": "^0.18.7",
|
|
47
|
+
"mathlive": "^0.110.0"
|
|
48
|
+
},
|
|
49
|
+
"peerDependenciesMeta": {
|
|
50
|
+
"katex": {
|
|
51
|
+
"optional": true
|
|
52
|
+
},
|
|
53
|
+
"mathlive": {
|
|
54
|
+
"optional": true
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
"dependencies": {
|
|
58
|
+
"@chenglou/pretext": "^0.0.8"
|
|
59
|
+
},
|
|
60
|
+
"devDependencies": {
|
|
61
|
+
"katex": "^0.18.7",
|
|
62
|
+
"mathlive": "^0.110.0",
|
|
63
|
+
"typescript": "^5.7.3",
|
|
64
|
+
"vite": "^6.2.0"
|
|
65
|
+
}
|
|
66
|
+
}
|