@one2x/medeo-rte 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/README.md +209 -2
  2. package/dist/chunks/types-I0yc5X7i.js +18 -0
  3. package/dist/chunks/types-I0yc5X7i.js.map +1 -0
  4. package/dist/formula.js +186 -0
  5. package/dist/formula.js.map +1 -0
  6. package/dist/index.js +5503 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/style.css +718 -0
  9. package/dist/types/commands/index.d.ts +4 -0
  10. package/dist/types/commands/index.d.ts.map +1 -0
  11. package/dist/types/commands/selfcheck.d.ts +2 -0
  12. package/dist/types/commands/selfcheck.d.ts.map +1 -0
  13. package/dist/types/commands/shortcuts.d.ts +48 -0
  14. package/dist/types/commands/shortcuts.d.ts.map +1 -0
  15. package/dist/types/commands/types.d.ts +69 -0
  16. package/dist/types/commands/types.d.ts.map +1 -0
  17. package/dist/types/convert/clipboard.d.ts +7 -0
  18. package/dist/types/convert/clipboard.d.ts.map +1 -0
  19. package/dist/types/convert/markdown.d.ts +30 -0
  20. package/dist/types/convert/markdown.d.ts.map +1 -0
  21. package/dist/types/convert/mdPaste.d.ts +8 -0
  22. package/dist/types/convert/mdPaste.d.ts.map +1 -0
  23. package/dist/types/editor.d.ts +469 -0
  24. package/dist/types/editor.d.ts.map +1 -0
  25. package/dist/types/edits/editResult.d.ts +62 -0
  26. package/dist/types/edits/editResult.d.ts.map +1 -0
  27. package/dist/types/edits/index.d.ts +12 -0
  28. package/dist/types/edits/index.d.ts.map +1 -0
  29. package/dist/types/edits/selfcheck.d.ts +2 -0
  30. package/dist/types/edits/selfcheck.d.ts.map +1 -0
  31. package/dist/types/edits/transaction.d.ts +35 -0
  32. package/dist/types/edits/transaction.d.ts.map +1 -0
  33. package/dist/types/edits/undoStack.d.ts +50 -0
  34. package/dist/types/edits/undoStack.d.ts.map +1 -0
  35. package/dist/types/embed/code.d.ts +9 -0
  36. package/dist/types/embed/code.d.ts.map +1 -0
  37. package/dist/types/embed/formula-katex.d.ts +4 -0
  38. package/dist/types/embed/formula-katex.d.ts.map +1 -0
  39. package/dist/types/embed/formula-mathlive.d.ts +6 -0
  40. package/dist/types/embed/formula-mathlive.d.ts.map +1 -0
  41. package/dist/types/embed/formula.d.ts +8 -0
  42. package/dist/types/embed/formula.d.ts.map +1 -0
  43. package/dist/types/embed/host.d.ts +70 -0
  44. package/dist/types/embed/host.d.ts.map +1 -0
  45. package/dist/types/embed/image.d.ts +3 -0
  46. package/dist/types/embed/image.d.ts.map +1 -0
  47. package/dist/types/embed/index.d.ts +20 -0
  48. package/dist/types/embed/index.d.ts.map +1 -0
  49. package/dist/types/embed/ref.d.ts +25 -0
  50. package/dist/types/embed/ref.d.ts.map +1 -0
  51. package/dist/types/embed/registry.d.ts +6 -0
  52. package/dist/types/embed/registry.d.ts.map +1 -0
  53. package/dist/types/embed/slot.d.ts +15 -0
  54. package/dist/types/embed/slot.d.ts.map +1 -0
  55. package/dist/types/embed/types.d.ts +53 -0
  56. package/dist/types/embed/types.d.ts.map +1 -0
  57. package/dist/types/embed/video.d.ts +3 -0
  58. package/dist/types/embed/video.d.ts.map +1 -0
  59. package/dist/types/formula.d.ts +15 -0
  60. package/dist/types/formula.d.ts.map +1 -0
  61. package/dist/types/index.d.ts +39 -0
  62. package/dist/types/index.d.ts.map +1 -0
  63. package/dist/types/input/ime.d.ts +27 -0
  64. package/dist/types/input/ime.d.ts.map +1 -0
  65. package/dist/types/input/keyboard.d.ts +21 -0
  66. package/dist/types/input/keyboard.d.ts.map +1 -0
  67. package/dist/types/layout/engine.d.ts +55 -0
  68. package/dist/types/layout/engine.d.ts.map +1 -0
  69. package/dist/types/layout/harness.d.ts +3 -0
  70. package/dist/types/layout/harness.d.ts.map +1 -0
  71. package/dist/types/layout/measure.d.ts +37 -0
  72. package/dist/types/layout/measure.d.ts.map +1 -0
  73. package/dist/types/layout/refMetrics.d.ts +5 -0
  74. package/dist/types/layout/refMetrics.d.ts.map +1 -0
  75. package/dist/types/layout/selfcheck.d.ts +2 -0
  76. package/dist/types/layout/selfcheck.d.ts.map +1 -0
  77. package/dist/types/layout/style.d.ts +4 -0
  78. package/dist/types/layout/style.d.ts.map +1 -0
  79. package/dist/types/layout/types.d.ts +133 -0
  80. package/dist/types/layout/types.d.ts.map +1 -0
  81. package/dist/types/layout/wrap.d.ts +65 -0
  82. package/dist/types/layout/wrap.d.ts.map +1 -0
  83. package/dist/types/model/blocks.d.ts +66 -0
  84. package/dist/types/model/blocks.d.ts.map +1 -0
  85. package/dist/types/model/document.d.ts +102 -0
  86. package/dist/types/model/document.d.ts.map +1 -0
  87. package/dist/types/model/fragment.d.ts +7 -0
  88. package/dist/types/model/fragment.d.ts.map +1 -0
  89. package/dist/types/model/markers.d.ts +14 -0
  90. package/dist/types/model/markers.d.ts.map +1 -0
  91. package/dist/types/model/types.d.ts +155 -0
  92. package/dist/types/model/types.d.ts.map +1 -0
  93. package/dist/types/model/virtualBlock.d.ts +44 -0
  94. package/dist/types/model/virtualBlock.d.ts.map +1 -0
  95. package/dist/types/mutations/apply.d.ts +14 -0
  96. package/dist/types/mutations/apply.d.ts.map +1 -0
  97. package/dist/types/mutations/index.d.ts +15 -0
  98. package/dist/types/mutations/index.d.ts.map +1 -0
  99. package/dist/types/mutations/invert.d.ts +21 -0
  100. package/dist/types/mutations/invert.d.ts.map +1 -0
  101. package/dist/types/mutations/ranges.d.ts +39 -0
  102. package/dist/types/mutations/ranges.d.ts.map +1 -0
  103. package/dist/types/mutations/registry.d.ts +27 -0
  104. package/dist/types/mutations/registry.d.ts.map +1 -0
  105. package/dist/types/mutations/selection.d.ts +12 -0
  106. package/dist/types/mutations/selection.d.ts.map +1 -0
  107. package/dist/types/mutations/selfcheck.d.ts +2 -0
  108. package/dist/types/mutations/selfcheck.d.ts.map +1 -0
  109. package/dist/types/mutations/transform.d.ts +33 -0
  110. package/dist/types/mutations/transform.d.ts.map +1 -0
  111. package/dist/types/mutations/types.d.ts +128 -0
  112. package/dist/types/mutations/types.d.ts.map +1 -0
  113. package/dist/types/operations/context.d.ts +47 -0
  114. package/dist/types/operations/context.d.ts.map +1 -0
  115. package/dist/types/operations/entity.d.ts +18 -0
  116. package/dist/types/operations/entity.d.ts.map +1 -0
  117. package/dist/types/operations/harness.d.ts +54 -0
  118. package/dist/types/operations/harness.d.ts.map +1 -0
  119. package/dist/types/operations/index.d.ts +20 -0
  120. package/dist/types/operations/index.d.ts.map +1 -0
  121. package/dist/types/operations/primitives.d.ts +35 -0
  122. package/dist/types/operations/primitives.d.ts.map +1 -0
  123. package/dist/types/operations/resolve.d.ts +31 -0
  124. package/dist/types/operations/resolve.d.ts.map +1 -0
  125. package/dist/types/operations/selfcheck.d.ts +2 -0
  126. package/dist/types/operations/selfcheck.d.ts.map +1 -0
  127. package/dist/types/operations/slice.d.ts +28 -0
  128. package/dist/types/operations/slice.d.ts.map +1 -0
  129. package/dist/types/operations/style.d.ts +20 -0
  130. package/dist/types/operations/style.d.ts.map +1 -0
  131. package/dist/types/operations/table.d.ts +14 -0
  132. package/dist/types/operations/table.d.ts.map +1 -0
  133. package/dist/types/operations/text.d.ts +20 -0
  134. package/dist/types/operations/text.d.ts.map +1 -0
  135. package/dist/types/operations/virtualBlock.d.ts +44 -0
  136. package/dist/types/operations/virtualBlock.d.ts.map +1 -0
  137. package/dist/types/paint/canvasPainter.d.ts +37 -0
  138. package/dist/types/paint/canvasPainter.d.ts.map +1 -0
  139. package/dist/types/paint/decorations.d.ts +19 -0
  140. package/dist/types/paint/decorations.d.ts.map +1 -0
  141. package/dist/types/paint/htmlPainter.d.ts +19 -0
  142. package/dist/types/paint/htmlPainter.d.ts.map +1 -0
  143. package/dist/types/paint/types.d.ts +36 -0
  144. package/dist/types/paint/types.d.ts.map +1 -0
  145. package/package.json +64 -4
@@ -0,0 +1,21 @@
1
+ /**
2
+ * 键盘输入源:DOM 事件 → 命令。
3
+ *
4
+ * 这里只做三件事:判断该不该管这个事件、查表、跑命令。它不碰模型也不碰选区 ——
5
+ * 所以「哪个键干什么」改起来只动 `commands/shortcuts.ts`,不用进这个文件。
6
+ */
7
+ import { CommandTable, KeyStroke, Shortcut } from '../commands';
8
+ export interface KeyboardHost {
9
+ commands: CommandTable;
10
+ /** 这个事件归不归本编辑器管(焦点、输入框内、嵌入对象里等) */
11
+ accepts(e: KeyboardEvent): boolean;
12
+ /** 组合输入是否进行中 */
13
+ composing(): boolean;
14
+ /** 吞掉了一个会引发文本输入的键,通知宿主连带压掉那次输入 */
15
+ suppressInput(e: KeyboardEvent): void;
16
+ shortcuts?: Shortcut[];
17
+ }
18
+ export declare function strokeOf(e: KeyboardEvent): KeyStroke;
19
+ /** 挂上 keydown 监听,返回解绑函数。 */
20
+ export declare function bindKeyboard(host: KeyboardHost): () => void;
21
+ //# sourceMappingURL=keyboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyboard.d.ts","sourceRoot":"","sources":["../../../src/input/keyboard.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,YAAY,EAAgB,SAAS,EAAE,QAAQ,EAAa,MAAM,aAAa,CAAC;AAQzF,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,YAAY,CAAC;IACvB,mCAAmC;IACnC,OAAO,CAAC,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC;IACnC,gBAAgB;IAChB,SAAS,IAAI,OAAO,CAAC;IACrB,kCAAkC;IAClC,aAAa,CAAC,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IACtC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;CACxB;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,aAAa,GAAG,SAAS,CAEpD;AAED,4BAA4B;AAC5B,wBAAgB,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,IAAI,CAuB3D"}
@@ -0,0 +1,55 @@
1
+ import { DocumentModel } from '../model/document';
2
+ import { StyleSpan, Selection } from '../model/types';
3
+ import { CaretPos, DocLayout, ImageBox, SelRect } from './types';
4
+ export { resolvedTextStyle } from './style';
5
+ /**
6
+ * 按块查样式区间的索引。
7
+ *
8
+ * 每排一次版就要给每个块算一次内容哈希,而哈希要知道「盖住这个块的样式区间」。
9
+ * 直接在全表上筛是块数 × 区间数,长文档里这是排版的主要开销。
10
+ *
11
+ * 区间表本身按 `start` 有序(模型每次写完都会规范化),所以再存一列「前 i 个区间
12
+ * 里最大的 end」—— 这一列必然单调,可以二分出第一个可能盖住本块的位置。它不要求
13
+ * 区间互不相交,同一个下标上叠着文字、链接、图片好几层也照样对。
14
+ */
15
+ export declare class StyleIndex {
16
+ private spans;
17
+ /** maxEnd[i] = spans[0..i] 里最大的 end,单调不减 */
18
+ private maxEnd;
19
+ constructor(spans: StyleSpan[]);
20
+ /** 第一个可能与 `start` 之后相交的区间下标。 */
21
+ private lowerBound;
22
+ /**
23
+ * 块内的样式区间,端点相对块起点、并裁到块边界内。
24
+ *
25
+ * 相对化是缓存能跨编辑复用的前提:在文档中间插一个字,后面每个块的绝对下标都会
26
+ * 平移,但它们的排版结果一模一样。裁剪是同一个道理 —— 一段样式伸到块外多远,不
27
+ * 影响这个块怎么排。
28
+ */
29
+ key(start: number, end: number, types?: Set<string>): string;
30
+ }
31
+ /**
32
+ * 上一次排版复用了多少块、重排了多少块。
33
+ *
34
+ * 只为诊断和自检存在 —— 自检要能确认「确实复用了」,否则缓存整体失效也会静静
35
+ * 通过。嵌套排版(引用块内部)累加进同一份计数,顶层调用时清零。
36
+ */
37
+ export interface LayoutStats {
38
+ reused: number;
39
+ laidOut: number;
40
+ }
41
+ export declare function lastLayoutStats(): LayoutStats;
42
+ export declare function layoutDocument(doc: DocumentModel, contentWidth?: number, prev?: DocLayout, insets?: {
43
+ x: number;
44
+ y: number;
45
+ }, depth?: number): DocLayout;
46
+ export declare function caretFromIndex(layout: DocLayout, index: number): CaretPos;
47
+ export declare function hitTestIndex(layout: DocLayout, localX: number, localY: number): number;
48
+ export declare function selectionRects(layout: DocLayout, sel: Selection): SelRect[];
49
+ export declare function imageBoxAt(layout: DocLayout, index: number): ImageBox | null;
50
+ export declare function hitColBorder(layout: DocLayout, x: number, y: number): {
51
+ tableStart: number;
52
+ col: number;
53
+ widths: number[];
54
+ } | null;
55
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../src/layout/engine.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,OAAO,EAGL,SAAS,EACT,SAAS,EAGV,MAAM,gBAAgB,CAAC;AAKxB,OAAO,EAAE,QAAQ,EAAyB,SAAS,EAAY,QAAQ,EAA4B,OAAO,EAA+B,MAAM,SAAS,CAAC;AAGzJ,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAqX5C;;;;;;;;;GASG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,KAAK,CAAc;IAC3B,4CAA4C;IAC5C,OAAO,CAAC,MAAM,CAAW;gBAEb,KAAK,EAAE,SAAS,EAAE;IAU9B,gCAAgC;IAChC,OAAO,CAAC,UAAU;IAWlB;;;;;;OAMG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM;CAa7D;AAmFD;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAID,wBAAgB,eAAe,IAAI,WAAW,CAE7C;AAED,wBAAgB,cAAc,CAC5B,GAAG,EAAE,aAAa,EAClB,YAAY,SAAqB,EACjC,IAAI,CAAC,EAAE,SAAS,EAChB,MAAM,GAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAA6C,EAC3E,KAAK,SAAI,GACR,SAAS,CA6JX;AAYD,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,CAkCzE;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CActF;AAiCD,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,GAAG,OAAO,EAAE,CAyB3E;AAqBD,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAE5E;AA8BD,wBAAgB,YAAY,CAC1B,MAAM,EAAE,SAAS,EACjB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,GACR;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CAc9D"}
@@ -0,0 +1,3 @@
1
+ /** 装上测量替身。已经装过或环境本来就有就什么都不做。 */
2
+ export declare function installMeasureShim(): void;
3
+ //# sourceMappingURL=harness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness.d.ts","sourceRoot":"","sources":["../../../src/layout/harness.ts"],"names":[],"mappings":"AA+BA,gCAAgC;AAChC,wBAAgB,kBAAkB,SAQjC"}
@@ -0,0 +1,37 @@
1
+ import { TextProps } from '../model/types';
2
+ /**
3
+ * 默认测量/绘制字体。具名字体,避免 system-ui 在 canvas 与 DOM 上解析不一致。
4
+ *
5
+ * 宿主可通过 `textDefaults.fontFamily` / 文字 span 覆盖。
6
+ * `.mini-editor` 的 `--mini-font-family` 必须与当前测量字体一致。
7
+ */
8
+ export declare const FONT_FAMILY = "\"PingFang SC\", \"Hiragino Sans GB\", \"Microsoft YaHei\", sans-serif";
9
+ export declare const LINE_HEIGHT = 1.6;
10
+ export declare const PAGE_CONTENT_WIDTH = 680;
11
+ export declare const PAGE_PADDING_X = 72;
12
+ export declare const PAGE_PADDING_Y = 56;
13
+ export declare const LIST_MARKER_WIDTH = 28;
14
+ export declare const INDENT_STEP = 24;
15
+ export declare const CELL_PAD = 8;
16
+ /** 列宽下限(约 18pt,这里用 px) */
17
+ export declare const MIN_COL_WIDTH = 36;
18
+ export declare const COL_BORDER_HIT = 4;
19
+ export declare function ensureLocale(): void;
20
+ export declare function fontFamilyOf(props?: TextProps | null): string;
21
+ export declare function resolveFont(props: TextProps): {
22
+ size: number;
23
+ weight: string;
24
+ style: string;
25
+ family: string;
26
+ };
27
+ /** canvas / pretext 用的 font 字符串,需与绘制层 CSS 一致。 */
28
+ export declare function canvasFont(props: TextProps): string;
29
+ /**
30
+ * 宽度测量走 pretext:canvas measureText + 分段缓存,不读 DOM、不触发布局回流。
31
+ * 同一 font+text 只 prepare 一次。
32
+ */
33
+ export declare function measureWidth(text: string, props: TextProps): number;
34
+ export declare function lineHeightOf(props: TextProps): number;
35
+ export declare function isCjk(ch: string): boolean;
36
+ export declare function canBreakAfter(ch: string): boolean;
37
+ //# sourceMappingURL=measure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"measure.d.ts","sourceRoot":"","sources":["../../../src/layout/measure.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEzD;;;;;GAKG;AACH,eAAO,MAAM,WAAW,2EAAqE,CAAC;AAE9F,eAAO,MAAM,WAAW,MAAM,CAAC;AAC/B,eAAO,MAAM,kBAAkB,MAAM,CAAC;AACtC,eAAO,MAAM,cAAc,KAAK,CAAC;AACjC,eAAO,MAAM,cAAc,KAAK,CAAC;AACjC,eAAO,MAAM,iBAAiB,KAAK,CAAC;AACpC,eAAO,MAAM,WAAW,KAAK,CAAC;AAC9B,eAAO,MAAM,QAAQ,IAAI,CAAC;AAC1B,0BAA0B;AAC1B,eAAO,MAAM,aAAa,KAAK,CAAC;AAChC,eAAO,MAAM,cAAc,IAAI,CAAC;AAKhC,wBAAgB,YAAY,SAI3B;AAED,wBAAgB,YAAY,CAAC,KAAK,CAAC,EAAE,SAAS,GAAG,IAAI,GAAG,MAAM,CAK7D;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAO7G;AAED,iDAAiD;AACjD,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAGnD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,MAAM,CAWnE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAErD;AAED,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAQzC;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAIjD"}
@@ -0,0 +1,5 @@
1
+ /** 与正文对齐,不再为轨或标题栏留空。 */
2
+ export declare const REF_PAD = 0;
3
+ export declare const REF_HEAD = 0;
4
+ export declare function refInnerWidth(boxW: number): number;
5
+ //# sourceMappingURL=refMetrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refMetrics.d.ts","sourceRoot":"","sources":["../../../src/layout/refMetrics.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,eAAO,MAAM,OAAO,IAAI,CAAC;AACzB,eAAO,MAAM,QAAQ,IAAI,CAAC;AAE1B,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=selfcheck.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selfcheck.d.ts","sourceRoot":"","sources":["../../../src/layout/selfcheck.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ import { DocumentModel } from '../model/document';
2
+ import { ParagraphProps, TextProps } from '../model/types';
3
+ export declare function resolvedTextStyle(doc: DocumentModel, index: number, para: ParagraphProps): TextProps;
4
+ //# sourceMappingURL=style.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.d.ts","sourceRoot":"","sources":["../../../src/layout/style.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAqD,cAAc,EAAE,SAAS,EAAgB,MAAM,gBAAgB,CAAC;AA0B5H,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,SAAS,CAwBpG"}
@@ -0,0 +1,133 @@
1
+ import { Align, ImageEntity, ListKind, ParagraphProps, TextProps, VirtualBlockChrome, VirtualBlockKind } from '../model/types';
2
+ export interface CaretStop {
3
+ index: number;
4
+ x: number;
5
+ }
6
+ export interface GlyphBox {
7
+ index: number;
8
+ x: number;
9
+ y: number;
10
+ w: number;
11
+ h: number;
12
+ text: string;
13
+ style: TextProps;
14
+ }
15
+ export interface ImageBox {
16
+ index: number;
17
+ x: number;
18
+ y: number;
19
+ w: number;
20
+ h: number;
21
+ entity: ImageEntity;
22
+ inner?: DocLayout;
23
+ }
24
+ export interface MarkerBox {
25
+ x: number;
26
+ y: number;
27
+ w: number;
28
+ h: number;
29
+ text: string;
30
+ kind: ListKind;
31
+ }
32
+ /** 一行上某一层虚拟块的绘制碎片(折行后每截一份)。 */
33
+ export interface VBlockFragment {
34
+ id: string;
35
+ kind: VirtualBlockKind;
36
+ depth: number;
37
+ x: number;
38
+ y: number;
39
+ w: number;
40
+ h: number;
41
+ chrome: VirtualBlockChrome;
42
+ empty?: boolean;
43
+ }
44
+ export interface LineBox {
45
+ paragraphStart: number;
46
+ start: number;
47
+ end: number;
48
+ x: number;
49
+ y: number;
50
+ w: number;
51
+ h: number;
52
+ ascent: number;
53
+ align: Align;
54
+ glyphs: GlyphBox[];
55
+ images: ImageBox[];
56
+ marker?: MarkerBox;
57
+ caretStops: CaretStop[];
58
+ vblocks?: VBlockFragment[];
59
+ }
60
+ export interface ParagraphLayout {
61
+ start: number;
62
+ end: number;
63
+ x: number;
64
+ y: number;
65
+ w: number;
66
+ h: number;
67
+ props: ParagraphProps;
68
+ lines: LineBox[];
69
+ floats?: ImageBox[];
70
+ hash?: string;
71
+ }
72
+ export interface CellLayout {
73
+ row: number;
74
+ col: number;
75
+ start: number;
76
+ end: number;
77
+ x: number;
78
+ y: number;
79
+ w: number;
80
+ h: number;
81
+ paragraphs: ParagraphLayout[];
82
+ }
83
+ export interface TableLayout {
84
+ start: number;
85
+ end: number;
86
+ x: number;
87
+ y: number;
88
+ w: number;
89
+ h: number;
90
+ colWidths: number[];
91
+ cells: CellLayout[];
92
+ hash?: string;
93
+ }
94
+ export interface DocLayout {
95
+ width: number;
96
+ height: number;
97
+ contentX: number;
98
+ contentY: number;
99
+ contentWidth: number;
100
+ paragraphs: ParagraphLayout[];
101
+ tables: TableLayout[];
102
+ lines: LineBox[];
103
+ images: ImageBox[];
104
+ /**
105
+ * 需要重绘的纵向区间(闭开区间,文档坐标)。
106
+ *
107
+ * 排版会复用没变的块,所以「哪些像素变了」是排版的副产物,绘制层不必再猜。
108
+ * `top >= bottom` 表示这一帧没有任何像素变化。
109
+ */
110
+ dirty: {
111
+ top: number;
112
+ bottom: number;
113
+ };
114
+ }
115
+ export interface CaretPos {
116
+ x: number;
117
+ y: number;
118
+ h: number;
119
+ index: number;
120
+ italic?: boolean;
121
+ bold?: boolean;
122
+ opacity?: number;
123
+ }
124
+ export interface SelRect {
125
+ x: number;
126
+ y: number;
127
+ w: number;
128
+ h: number;
129
+ /** 虚拟块选中描边,不是普通选区填充。 */
130
+ outline?: boolean;
131
+ radius?: number;
132
+ }
133
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/layout/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ import { type PreparedTextWithSegments } from '@chenglou/pretext';
2
+ import { DocumentModel } from '../model/document';
3
+ import { ImageEntity, ParagraphProps, TextProps } from '../model/types';
4
+ export type WrapItem = {
5
+ kind: 'text';
6
+ index: number;
7
+ length: number;
8
+ text: string;
9
+ style: TextProps;
10
+ } | {
11
+ kind: 'image';
12
+ index: number;
13
+ length: 1;
14
+ entity: ImageEntity;
15
+ };
16
+ export declare function embedLayoutSize(entity: ImageEntity, maxWidth?: number): {
17
+ width: number;
18
+ height: number;
19
+ };
20
+ /** 测宽达到行宽则独占一行。芯片 host 按 kind 行内折,不走高度阈值;代码块/视频仍按高度独占。 */
21
+ export declare function embedOccupiesLine(entity: ImageEntity, maxWidth: number): boolean;
22
+ export type WrappedLine = {
23
+ items: WrapItem[];
24
+ start: number;
25
+ end: number;
26
+ };
27
+ export type SourceRun = {
28
+ kind: 'text';
29
+ index: number;
30
+ text: string;
31
+ style: TextProps;
32
+ prepared: PreparedTextWithSegments;
33
+ } | {
34
+ kind: 'image';
35
+ index: number;
36
+ entity: ImageEntity;
37
+ };
38
+ /**
39
+ * 断行走 pretext 的 prepareWithSegments + layoutNextLine(pre-wrap)。
40
+ * 嵌入对象(图/视频/代码/公式)保持原子盒,不交给 pretext。
41
+ */
42
+ export declare function wrapParagraph(doc: DocumentModel, start: number, end: number, para: ParagraphProps, maxWidth: number): WrappedLine[];
43
+ export type FlowObstacle = {
44
+ x: number;
45
+ y: number;
46
+ w: number;
47
+ h: number;
48
+ side: 'left' | 'right';
49
+ };
50
+ export declare function bandSlot(contentX: number, contentW: number, bandTop: number, bandH: number, obstacles: FlowObstacle[], gap?: number): {
51
+ x: number;
52
+ w: number;
53
+ };
54
+ export type RunCursor = {
55
+ runs: SourceRun[];
56
+ i: number;
57
+ off: number;
58
+ };
59
+ export declare function createWrapCursor(doc: DocumentModel, start: number, end: number, para: ParagraphProps, skipFloats?: boolean): RunCursor;
60
+ export declare function wrapCursorDone(cur: RunCursor): boolean;
61
+ export declare function wrapCursorIndex(cur: RunCursor, fallback: number): number;
62
+ export declare function wrapCursorPeek(cur: RunCursor): SourceRun | undefined;
63
+ export declare function wrapCursorSkip(cur: RunCursor): void;
64
+ export declare function consumeWrapLine(cur: RunCursor, maxWidth: number): WrapItem[];
65
+ //# sourceMappingURL=wrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrap.d.ts","sourceRoot":"","sources":["../../../src/layout/wrap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import type { ParagraphProps } from './types';
2
+ export interface ParaRange {
3
+ start: number;
4
+ end: number;
5
+ }
6
+ export interface TableCellBlock {
7
+ marker: number;
8
+ start: number;
9
+ end: number;
10
+ paragraphs: ParaRange[];
11
+ }
12
+ export interface TableRowBlock {
13
+ marker: number;
14
+ start: number;
15
+ end: number;
16
+ cells: TableCellBlock[];
17
+ }
18
+ export interface ParagraphBlock {
19
+ kind: 'paragraph';
20
+ start: number;
21
+ end: number;
22
+ }
23
+ export interface TableBlock {
24
+ kind: 'table';
25
+ start: number;
26
+ end: number;
27
+ rows: TableRowBlock[];
28
+ }
29
+ export type Block = ParagraphBlock | TableBlock;
30
+ export declare function parseBlocks(spacers: string): Block[];
31
+ export declare function findTableAt(spacers: string, index: number): TableBlock | null;
32
+ export declare function isEmptyParagraph(spacers: string, para: ParaRange): boolean;
33
+ /** 列表标记 / 标题画在段落样式上,不进 spacer;有它们时占位符不能当空文档。 */
34
+ export declare function isVisuallyEmptyDoc(doc: {
35
+ spacers: string;
36
+ entities: {
37
+ size: number;
38
+ };
39
+ paragraphPropsAt: (index: number) => ParagraphProps;
40
+ }): boolean;
41
+ export declare function findParagraphAt(spacers: string, index: number): ParaRange | null;
42
+ export declare function paragraphsIntersecting(spacers: string, start: number, end: number): ParaRange[];
43
+ export declare function cellAt(spacers: string, index: number): {
44
+ table: TableBlock;
45
+ row: number;
46
+ col: number;
47
+ cell: TableCellBlock;
48
+ } | null;
49
+ /** 把下标吸附到最近的安全落点,避开表格结构标记 */
50
+ export declare function nearestSafeIndex(spacers: string, index: number): number;
51
+ export declare function cellContentRange(cell: TableCellBlock): {
52
+ start: number;
53
+ end: number;
54
+ };
55
+ export declare function isLastTableCell(hit: {
56
+ table: TableBlock;
57
+ row: number;
58
+ col: number;
59
+ }): boolean;
60
+ export declare function nextCellIndex(spacers: string, index: number, dir: 1 | -1): number | null;
61
+ export declare function expandRangeOverStructures(spacers: string, start: number, end: number): {
62
+ start: number;
63
+ end: number;
64
+ };
65
+ export declare function emptyTableSpacers(rows: number, cols: number): string;
66
+ //# sourceMappingURL=blocks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blocks.d.ts","sourceRoot":"","sources":["../../../src/model/blocks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,102 @@
1
+ import { Fragment, ImageEntity, ParagraphProps, Selection, Slice, StyleSpan, StyleType, TableProps, TextProps, VirtualBlock } from './types';
2
+ export declare function nextEntityId(): string;
3
+ export declare function nextFragmentId(): string;
4
+ export declare function nextVirtualBlockId(): string;
5
+ export type DocSnapshot = {
6
+ spacers: string;
7
+ styles: StyleSpan[];
8
+ entities: ImageEntity[];
9
+ fragments: Fragment[];
10
+ virtualBlocks: VirtualBlock[];
11
+ };
12
+ export declare class DocumentModel {
13
+ spacers: string;
14
+ styles: StyleSpan[];
15
+ entities: Map<string, import("./types").EmbedEntity>;
16
+ fragments: Map<string, Fragment>;
17
+ virtualBlocks: Map<string, VirtualBlock>;
18
+ private fragmentModels;
19
+ constructor(initial?: {
20
+ spacers: string;
21
+ styles: StyleSpan[];
22
+ entities?: ImageEntity[];
23
+ fragments?: Fragment[];
24
+ virtualBlocks?: VirtualBlock[];
25
+ });
26
+ /** 未写 text span 时的默认字号/颜色。嵌入式输入框可覆盖文档编辑器的 16px 默认。 */
27
+ textDefaults: TextProps | null;
28
+ get length(): number;
29
+ clamp(index: number): number;
30
+ /** insertSpacers 的落地:插入字符,已有样式区间跟着挪。 */
31
+ applyInsertSpacers(index: number, text: string): void;
32
+ /** deleteSpacers 的落地(半开区间):删字符,样式区间跟着裁剪与前挪。 */
33
+ applyDeleteSpacers(start: number, end: number): void;
34
+ /** addVirtualBlock 的落地:同 id 则整体替换。 */
35
+ applyAddVirtualBlock(block: VirtualBlock): void;
36
+ applyDeleteVirtualBlock(blockId: string): void;
37
+ applyUpdateVirtualBlock(blockId: string, block: VirtualBlock): void;
38
+ /**
39
+ * applyStyle 的落地(半开区间):把某类样式在这段里整体换成给定的一组区间。
40
+ * 语义是**覆盖**不是合并补丁,所以传进来的 props 必须已经解析完整。
41
+ */
42
+ /** addFragment 的落地:把整份 fragment 写入。已打开过的派生模型作废重建。 */
43
+ applyAddFragment(fragment: Fragment): void;
44
+ /** deleteFragment 的落地:移除 fragment 及其派生模型。 */
45
+ applyDeleteFragment(fragmentId: string): void;
46
+ applyStyleSpans(type: StyleType, start: number, end: number, next: StyleSpan[]): void;
47
+ snapshot(): DocSnapshot;
48
+ restore(snap: DocSnapshot): void;
49
+ /** 取半开区间 [start, end) 的内容副本,含落在里面的实体与它们引用的同步块。 */
50
+ takeSlice(start: number, end: number): Slice;
51
+ /**
52
+ * 读出某类样式在半开区间 [start, end) 内的分布,边缘按区间裁剪。
53
+ * 求 applyStyle 的逆操作时用来记录「原来长什么样」。
54
+ */
55
+ styleSpansOver(type: StyleType, start: number, end: number): StyleSpan[];
56
+ imageAt(index: number): ImageEntity | null;
57
+ imageSpanAt(index: number): StyleSpan | null;
58
+ textPropsAt(index: number): TextProps;
59
+ paragraphPropsAt(index: number): ParagraphProps;
60
+ linkSpanAt(index: number): StyleSpan | null;
61
+ linkUrlAt(index: number): string | null;
62
+ tablePropsAt(index: number): TableProps;
63
+ /** 半开区间 [start, end) 的可读文本,结构标记被剔除,图片算一个空格。 */
64
+ plainText(start: number, end: number): string;
65
+ /**
66
+ * 构造一份新的 fragment(分配 id、规范化 slice),但**不写模型**。
67
+ * 落地由 addFragment mutation 完成,这样提取同步块能进撤销栈、走协同。
68
+ */
69
+ buildFragment(slice: Slice, title?: string): Fragment;
70
+ ensureFragmentModel(id: string): DocumentModel;
71
+ syncFragment(id: string): void;
72
+ listFragments(): Fragment[];
73
+ refIndices(fragmentId: string): number[];
74
+ refCount(fragmentId: string): number;
75
+ rangeHasRef(start: number, end: number): boolean;
76
+ listVirtualBlocks(): VirtualBlock[];
77
+ blockById(id: string): VirtualBlock | null;
78
+ /** 覆盖下标 i 的虚拟块,外层在前。 */
79
+ blocksAt(index: number): VirtualBlock[];
80
+ virtualBlocksOverlapping(start: number, end: number): VirtualBlock[];
81
+ innermostSlotAt(index: number): VirtualBlock | null;
82
+ /** 含槽尾光标:`start <= i <= end` 的最内层 slot。 */
83
+ slotAtCaret(index: number): VirtualBlock | null;
84
+ private replaceVirtualBlocks;
85
+ /**
86
+ * 把 paragraph 区间对齐到块结构。
87
+ *
88
+ * 只在**构造**文档时用(从切片建模型、从磁盘读文档)。编辑过程中的对齐是
89
+ * Operation 层的 normalizeParagraphs,走 mutation,因为它必须能被撤销。
90
+ */
91
+ normalize(): void;
92
+ /** 排序 + 合并相邻且属性相同的文字区间。纯粹的规范化,不改变可见结果。 */
93
+ private mergeStyles;
94
+ }
95
+ export declare function shiftStylesOnInsert(styles: StyleSpan[], index: number, len: number): StyleSpan[];
96
+ export declare function shiftStylesOnDelete(styles: StyleSpan[], start: number, end: number): StyleSpan[];
97
+ export declare function collapsedSel(index: number): Selection;
98
+ export declare function documentFromSlice(slice: Slice): DocumentModel;
99
+ export declare function sliceFromDocument(doc: DocumentModel): Slice;
100
+ /** 去掉指定 groupId 的段落,留下其余内容。 */
101
+ export declare function sliceWithoutParagraphGroup(doc: DocumentModel, groupId: string): Slice;
102
+ //# sourceMappingURL=document.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../../../src/model/document.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Fragment, Slice } from './types';
2
+ export declare function cloneFragment(fragment: Fragment): Fragment;
3
+ export declare function cloneSlice(slice: Slice): Slice;
4
+ export declare function previewTitle(slice: Slice, max?: number): string;
5
+ export declare function normalizeFragmentSlice(slice: Slice): Slice;
6
+ export declare function sliceHasContent(slice: Slice): boolean;
7
+ //# sourceMappingURL=fragment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fragment.d.ts","sourceRoot":"","sources":["../../../src/model/fragment.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8C,QAAQ,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAGtF,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,CAM1D;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAQ9C;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,SAAK,GAAG,MAAM,CAI3D;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAU1D;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAErD"}
@@ -0,0 +1,14 @@
1
+ /** 文档流里的结构标记:每个标记占一个下标,和普通字符一样参与排版与选区。 */
2
+ export declare const MARKERS: {
3
+ readonly PARAGRAPH: "\n";
4
+ readonly IMAGE: "*";
5
+ readonly TABLE_START: "\u0010";
6
+ readonly TABLE_END: "\u0011";
7
+ readonly TABLE_ROW: "\u0012";
8
+ readonly TABLE_CELL: "\u001C";
9
+ };
10
+ export declare function isTableMarker(ch: string): boolean;
11
+ export declare function isStructuralMarker(ch: string): boolean;
12
+ export declare function prevCodePointLen(text: string, index: number): number;
13
+ export declare function nextCodePointLen(text: string, index: number): number;
14
+ //# sourceMappingURL=markers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markers.d.ts","sourceRoot":"","sources":["../../../src/model/markers.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,eAAO,MAAM,OAAO;;;;;;;CAOV,CAAC;AAEX,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAOjD;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAQpE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAQpE"}