|
| 1 | +import type { FlowBlock, SectionMetadata, TrackedChangesMode } from '@superdoc/contracts'; |
| 2 | + |
| 3 | +import type { SectionRange } from './sections.js'; |
| 4 | + |
| 5 | +/** Opaque document input for a concrete adapter (e.g. PM JSON). */ |
| 6 | +export type DocumentAdapterInput = unknown; |
| 7 | + |
| 8 | +export type FlowBlocksResult = { |
| 9 | + blocks: FlowBlock[]; |
| 10 | + bookmarks: Map<string, number>; |
| 11 | +}; |
| 12 | + |
| 13 | +export interface FlowBlockCacheLike { |
| 14 | + clear(): void; |
| 15 | + setHasExternalChanges?(value: boolean): void; |
| 16 | +} |
| 17 | + |
| 18 | +export interface DocumentAdapterConvertOptions { |
| 19 | + defaultFont?: string; |
| 20 | + defaultSize?: number; |
| 21 | + blockIdPrefix?: string; |
| 22 | + storyKey?: string; |
| 23 | + atomNodeTypes?: Iterable<string>; |
| 24 | + positions?: unknown; |
| 25 | + mediaFiles?: Record<string, string>; |
| 26 | + emitSectionBreaks?: boolean; |
| 27 | + showBookmarks?: boolean; |
| 28 | + trackedChangesMode?: TrackedChangesMode; |
| 29 | + enableTrackedChanges?: boolean; |
| 30 | + enableRichHyperlinks?: boolean; |
| 31 | + enableComments?: boolean; |
| 32 | + themeColors?: Record<string, string>; |
| 33 | + sectionMetadata?: SectionMetadata[]; |
| 34 | + /** Adapter-specific style/converter payload (e.g. PM ConverterContext). */ |
| 35 | + converterContext?: unknown; |
| 36 | + flowBlockCache?: FlowBlockCacheLike; |
| 37 | +} |
| 38 | + |
| 39 | +export interface DocumentAdapter { |
| 40 | + readonly id: string; |
| 41 | + toFlowBlocks(input: DocumentAdapterInput, options?: DocumentAdapterConvertOptions): FlowBlocksResult; |
| 42 | + createFlowBlockCache?(): FlowBlockCacheLike; |
| 43 | +} |
| 44 | + |
| 45 | +export interface SectionAnalysisAdapter { |
| 46 | + analyzeSectionRanges(doc: DocumentAdapterInput, bodySectPr?: unknown): SectionRange[]; |
| 47 | +} |
| 48 | + |
| 49 | +export interface LayoutDocumentAdapter extends DocumentAdapter, SectionAnalysisAdapter {} |
0 commit comments