@textbus/collaborate
Version:
Textbus is a rich text editor and framework that is highly customizable and extensible to achieve rich wysiwyg effects.
107 lines (106 loc) • 4.77 kB
TypeScript
import { Observable } from '@tanbo/stream';
import { Component, Formats, FormatValue, Registry, Scheduler, Selection, Slot, AbstractSelection } from '@textbus/core';
import { AbstractType, Doc as YDoc, Map as YMap, RelativePosition, Text as YText } from 'yjs';
import { SubModelLoader } from './sub-model-loader';
export interface RelativePositionRecord {
doc: YDoc;
position: RelativePosition;
}
export interface CursorPosition {
anchor: RelativePositionRecord;
focus: RelativePositionRecord;
}
export interface CollaborateHistorySelectionPosition {
before: CursorPosition | null;
after: CursorPosition | null;
}
declare class SlotMap {
private slotAndYTextMap;
private yTextAndSlotMap;
set(key: Slot, value: YText): void;
set(key: YText, value: Slot): void;
get(key: Slot): YText | null;
get(key: YText): Slot | null;
delete(key: Slot | YText): void;
}
export interface SubModelLoaded {
yType: AbstractType<any>;
yDoc: YDoc;
}
export declare class Collaborate {
private scheduler;
private registry;
private selection;
private subModelLoader;
yDoc: YDoc;
slotMap: SlotMap;
onAddSubModel: Observable<SubModelLoaded>;
private subscriptions;
private updateFromRemote;
private addSubModelEvent;
private updateRemoteActions;
private noRecord;
constructor(scheduler: Scheduler, registry: Registry, selection: Selection, subModelLoader: SubModelLoader);
syncRootComponent(yDoc: YDoc, sharedComponent: YMap<any>, localComponent: Component<any>): void;
syncRootSlot(yDoc: YDoc, sharedSlot: YText, localSlot: Slot): void;
getAbstractSelection(position: CursorPosition): AbstractSelection | null;
getRelativeCursorLocation(): CursorPosition | null;
restoreCursorPosition(position: CursorPosition | null): void;
private initSyncEvent;
private syncComponent;
private syncSlot;
destroy(): void;
private syncSharedMapToLocalMap;
private createLocalMapBySharedMap;
private createLocalArrayBySharedArray;
private syncLocalMapToSharedMap;
private createSharedMapByLocalMap;
private createSharedArrayByLocalArray;
private createSharedSlotByLocalSlot;
private initSharedSlotByLocalSlot;
private createLocalSlotBySharedSlot;
private initLocalSlotBySharedSlot;
private createSharedModelByLocalModel;
private createLocalModelBySharedByModel;
private createSharedComponentByLocalComponent;
private createLocalComponentBySharedComponent;
private createArrayHoleXmlElement;
private isArrayHoleElement;
/**
* 仅用于 YArray ↔ 可观察数组:本地 `undefined` 槽位用 XmlElement 占位同步到 Yjs(不与对象字面量同步混用)。
*/
private sharedModelForArraySlot;
/**
* 在可观察数组中插入稀疏空洞(与 YArray 中 XmlElement 占位对齐)。
* 仅在远端同步路径调用;先改 raw,再用与 {@link ArrayProxyHandler} `length` 增长一致的原子命令
* `retain` + `insert`(`undefined` 槽)记录,`unApply` 为 `retain` + `delete`。
* `runLocalUpdate` 在 `updateFromRemote` 为 true 时会跳过,不会把洞再写回 Y。
*/
private insertSparseHole;
/** 与 Y 洞位对齐的稀疏洞写入,仅操作 raw */
private applySparseHoleToRaw;
/**
* 双向同步数组
* @param sharedArray
* @param localArray
* @private
*/
private syncArray;
/**
* 双向同步对象
* @param sharedObject
* @param localObject
* @private
*/
private syncObject;
private runLocalUpdate;
private runRemoteUpdate;
}
export declare function localFormatsToYjsAttributes(registry: Registry, slot: Slot, start: number, end: number, localFormats: Record<string, FormatValue>): Record<string, FormatValue | FormatValue[] | null>;
export declare function localFormatsRecordToRemote(registry: Registry, formats: Record<string, FormatValue> | undefined): Record<string, FormatValue | FormatValue[] | null> | undefined;
export declare function formatsArrayToRemoteRecord(registry: Registry, formats: Formats): Record<string, FormatValue | FormatValue[]> | undefined;
/** 远程插入内容的格式 → 本地 Formats(新内容无旧状态,可堆叠仅展开远程数组) */
export declare function remoteInsertFormatsToLocal(registry: Registry, attrs?: Record<string, FormatValue | FormatValue[] | null> | null): Formats;
/** 远程 retain 格式 → 本地 Formats(可堆叠与区间内本地快照做差量对齐) */
export declare function remoteRetainFormatsToLocal(registry: Registry, slot: Slot, start: number, end: number, attrs?: Record<string, FormatValue | FormatValue[] | null> | null): Formats;
export {};