rapier-markdown-kit 1.2.45 → 1.2.48

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 (52) hide show
  1. package/LICENSE +12 -5
  2. package/README.md +134 -11
  3. package/dist/agent/vendor/BROWSER-ENTITIES.json +36 -0
  4. package/dist/agent/vendor/MARKDOWN-RUNTIME.json +136 -0
  5. package/dist/agent/vendor/MARKDOWNIT.json +582 -0
  6. package/dist/agent/vendor/NOTICE.txt +60 -0
  7. package/dist/agent/vendor/markdown-licenses/entities-LICENSE.txt +11 -0
  8. package/dist/agent/vendor/markdown-licenses/linkify-it-LICENSE.txt +22 -0
  9. package/dist/agent/vendor/markdown-licenses/markdown-it-LICENSE.txt +22 -0
  10. package/dist/agent/vendor/markdown-licenses/mdurl-LICENSE.txt +45 -0
  11. package/dist/agent/vendor/markdown-licenses/punycode.js-LICENSE-MIT.txt +20 -0
  12. package/dist/agent/vendor/markdown-licenses/uc.micro-LICENSE.txt +20 -0
  13. package/dist/agent/vendor/markdown-plugins.json +46 -0
  14. package/dist/agent/vendor/markdown-plugins.mjs +27 -0
  15. package/dist/agent/vendor/markdown-runtime.mjs +13 -0
  16. package/dist/kit/artifact-modules.mjs +19 -0
  17. package/dist/kit/assets.d.mts +106 -0
  18. package/dist/kit/export-fonts.mjs +28 -19
  19. package/dist/kit/index.d.mts +151 -0
  20. package/dist/kit/layout.d.mts +61 -0
  21. package/dist/kit/ledger/carried.d.mts +12 -6
  22. package/dist/kit/ledger/carried.mjs +17 -8
  23. package/dist/kit/ledger/format.mjs +5 -3
  24. package/dist/kit/ledger/source.mjs +31 -2
  25. package/dist/kit/ledger/text-merge.mjs +33 -0
  26. package/dist/kit/ledger/transport.mjs +61 -2
  27. package/dist/kit/ledger.d.mts +137 -31
  28. package/dist/kit/markdown-it.d.mts +2 -2
  29. package/dist/kit/marks.d.mts +241 -0
  30. package/dist/kit/marks.mjs +39 -1
  31. package/dist/kit/model.d.mts +191 -0
  32. package/dist/kit/pdf-source-digest.mjs +10 -0
  33. package/dist/kit/pdf-source.mjs +4 -1
  34. package/dist/kit/pdf-vectors.mjs +3 -2
  35. package/dist/kit/render-entry.d.mts +654 -0
  36. package/dist/kit/render-markdown.mjs +14 -8
  37. package/dist/kit/render-print.mjs +36 -7
  38. package/dist/kit/render.mjs +16 -14
  39. package/dist/kit/typography.d.mts +42 -0
  40. package/dist/kit/will.d.mts +26 -3
  41. package/dist/layout/initial-range.mjs +18 -0
  42. package/dist/layout/typography.mjs +2 -18
  43. package/dist/math/delimiters.mjs +38 -0
  44. package/dist/math/markdown-rules.mjs +103 -0
  45. package/dist/packages/rapier-diff/concerns.mjs +2 -2
  46. package/dist/spec/document-fonts.mjs +62 -16
  47. package/dist/spec/md-assets.mjs +1 -0
  48. package/dist/spec/md-comments.mjs +384 -0
  49. package/dist/spec/md-marks.mjs +9 -0
  50. package/dist/spec/md-parser-config.mjs +463 -0
  51. package/dist/spec/md-parser-runtime.mjs +23 -0
  52. package/package.json +30 -8
@@ -0,0 +1,654 @@
1
+ // SPDX-License-Identifier: MIT
2
+ import type {MarkdownParser, MarkdownParserInternals, MarkdownToken, MarkdownEnvironment, MarkdownOptions} from './marks.mjs';
3
+ import type {Layout} from './layout.mjs';
4
+ import type {ShapeProfile} from './model.mjs';
5
+ import type {LedgerEnvelope, AuthorshipEnvelope} from './ledger.mjs';
6
+ import type {ComparisonBase, DocumentParts} from './ledger/carried.mjs';
7
+
8
+ export type Awaitable<T> = T | PromiseLike<T>;
9
+ export type DocumentKind = 'markdown' | 'text' | 'code';
10
+ export type RenderTheme = 'system' | 'light' | 'dark';
11
+ export type SanitizeContext = 'render' | 'paste' | 'diagram' | 'raw' | 'export' | 'source';
12
+ export interface RenderWork {
13
+ signal?: AbortSignal;
14
+ check?(): void;
15
+ onProgress?(fraction?: number, label?: string): void;
16
+ yield?(fraction?: number, label?: string): Awaitable<void>;
17
+ }
18
+ export interface RenderMetadata {
19
+ filename?: string;
20
+ docKind?: DocumentKind;
21
+ codeLang?: string;
22
+ bom?: boolean;
23
+ }
24
+ /** BOM metadata is read from the source; callers cannot override it. */
25
+ export interface RenderOptions extends Omit<RenderMetadata, 'bom'> {}
26
+ export interface HtmlArtifact { html: string; filename: string; }
27
+ export interface FileArtifact { blob: Blob; filename: string; }
28
+ export interface FontChoice { family: string; css: string; stack: string; word: string; }
29
+ /** Document settings use twips for page sizes and margins. */
30
+ export interface RenderDocumentSettings {
31
+ title?: string | null;
32
+ subtitle?: string | null;
33
+ lang?: string | null;
34
+ mainfont?: FontChoice | null;
35
+ sansfont?: FontChoice | null;
36
+ monofont?: FontChoice | null;
37
+ defaultfont?: FontChoice | null;
38
+ fontsize?: {step: string; unit: number; css: string; halfPoints: number} | null;
39
+ linestretch?: {step: string; factor: number; css: string; line: number} | null;
40
+ papersize?: {name: string; width: number; height: number; css: string} | null;
41
+ geometry?: {margin: string; twips: number | null; top: number; right: number; bottom: number; left: number} | null;
42
+ pagestyle?: 'plain' | 'empty' | null;
43
+ template?: 'page' | null;
44
+ word?: boolean;
45
+ spacing?: {
46
+ preset?: 'compact' | 'standard' | 'roomy';
47
+ paragraph?: Spacing; h1?: Spacing; h2?: Spacing; h3?: Spacing; h4?: Spacing; h5?: Spacing; h6?: Spacing;
48
+ list?: Spacing; item?: Spacing; table?: Spacing; picture?: Spacing; drawing?: Spacing;
49
+ quote?: Spacing; code?: Spacing; rule?: Spacing; footnote?: Spacing; toc?: Spacing;
50
+ } | null;
51
+ }
52
+ export interface Spacing {before?: number; after?: number; line?: number;}
53
+ export interface FontRunOptions {
54
+ settings?: RenderDocumentSettings | null;
55
+ css?: string;
56
+ fontCss?: string;
57
+ }
58
+ export interface FontValidationOptions {family: string; format?: string;}
59
+ /** Only the boolean true admits a font. Errors, including cancellation, propagate. */
60
+ export type FontValidator = (bytes: Uint8Array, options: FontValidationOptions) => Awaitable<boolean>;
61
+ export type FontSubsetter = (bytes: Uint8Array, text: string) => Awaitable<Uint8Array | null>;
62
+ export interface ExportFontOptions extends FontRunOptions {
63
+ subset: FontSubsetter;
64
+ validateFont?: FontValidator;
65
+ portableFactory?: boolean;
66
+ customFontCss?: string;
67
+ }
68
+ /** The renderer calls a host wrapper which owns the subsetter and factory font CSS. */
69
+ export interface HostExportFontOptions extends FontRunOptions {
70
+ theme: RenderTheme;
71
+ portableFactory?: boolean;
72
+ customFontCss?: string;
73
+ }
74
+ export interface CapturedFontAsset {family: string; url: string; data: string; format: string;}
75
+ export interface FontAssetIndex {
76
+ assets: readonly CapturedFontAsset[];
77
+ references: Readonly<Record<string, {href: string; title: string}>>;
78
+ }
79
+ export interface RequiredFontOptions extends FontRunOptions {
80
+ parser: RenderMarkdownParser;
81
+ index: FontAssetIndex;
82
+ root: Element;
83
+ validateFont?: FontValidator;
84
+ }
85
+ export interface FontRequest {family: string; style: string; weight: string; stretch: string;}
86
+ export interface WaitForFontOptions extends FontRunOptions {install?: boolean;}
87
+ /** Returns CSS. Optional factory subsetting can return an empty string; cancellation still rejects. */
88
+ export function exportFontCss(root: Element, options: ExportFontOptions): Promise<string>;
89
+ /** Validates used captured font bytes; rejects with export_font_unavailable or export_font_invalid. Does not install fonts. */
90
+ export function requireDocumentFonts(source: string, options: RequiredFontOptions): Promise<void>;
91
+ export function fontRequests(root: Element, options?: FontRunOptions): FontRequest[];
92
+ /** Resolves to the cleanup callback for the faces installed by this call. */
93
+ export function waitForFonts(root: Element, options?: WaitForFontOptions): Promise<() => void>;
94
+ export function waitForFontRequests(document: Pick<Document, 'fonts'>, requests?: readonly FontRequest[] | null): Promise<void>;
95
+
96
+ export interface RenderStylesHost {
97
+ _rapierArtifactAccent(): string;
98
+ _rapierStyleText(id: string): string;
99
+ }
100
+ export interface RenderStyles {
101
+ _rapierArtifactThemeCss(houseDefaults?: boolean): string;
102
+ _rapierArtifactPrintCss(): string;
103
+ _rapierDocumentPrintCss(hostSelector: string): string;
104
+ _rapierArtifactStyles(theme: RenderTheme, includeFonts: boolean, printMode: boolean, houseDefaults?: boolean, fontCss?: string | null): string;
105
+ }
106
+ export function createRenderStyles(host: RenderStylesHost): RenderStyles;
107
+
108
+ export interface SanitizeAttributeHookData {
109
+ attrName: string;
110
+ attrValue: string;
111
+ keepAttr: boolean;
112
+ forceKeepAttr?: boolean;
113
+ }
114
+ export interface SanitizeElementHookData {tagName: string; allowedTags: Record<string, boolean>;}
115
+ export interface SanitizerConfig {
116
+ ALLOWED_TAGS?: readonly string[];
117
+ ALLOWED_ATTR?: readonly string[];
118
+ FORBID_TAGS?: readonly string[];
119
+ FORBID_CONTENTS?: readonly string[];
120
+ FORBID_ATTR?: readonly string[];
121
+ ADD_TAGS?: readonly string[] | ((tagName: string) => boolean);
122
+ ADD_DATA_URI_TAGS?: readonly string[];
123
+ HTML_INTEGRATION_POINTS?: Readonly<Record<string, boolean>>;
124
+ ALLOW_DATA_ATTR?: boolean;
125
+ RETURN_DOM_FRAGMENT?: boolean;
126
+ KEEP_CONTENT?: boolean;
127
+ ALLOWED_URI_REGEXP?: RegExp;
128
+ }
129
+ /** The host supplies its sanitizer; this package does not bundle DOMPurify. */
130
+ export interface RenderDOMPurify {
131
+ sanitize(source: string): string | DocumentFragment;
132
+ setConfig(options?: SanitizerConfig): void;
133
+ addHook(name: 'uponSanitizeAttribute', hook: (node: Element, data: SanitizeAttributeHookData) => void): void;
134
+ addHook(name: 'uponSanitizeElement', hook: (node: Node, data: SanitizeElementHookData) => void): void;
135
+ addHook(name: 'afterSanitizeAttributes', hook: (node: Element) => void): void;
136
+ addHook(name: 'afterSanitizeElements', hook: (node: Node) => void): void;
137
+ removeHook(name: 'uponSanitizeAttribute', hook: (node: Element, data: SanitizeAttributeHookData) => void): void;
138
+ removeHook(name: 'uponSanitizeElement', hook: (node: Node, data: SanitizeElementHookData) => void): void;
139
+ removeHook(name: 'afterSanitizeAttributes', hook: (node: Element) => void): void;
140
+ }
141
+ export interface RemoteContentPolicy {allowed: boolean;}
142
+ export interface SanitizeRuntime {context?: SanitizeContext; chromeIds?: Set<string>;}
143
+ export interface SanitizerRealm {
144
+ document?: Document;
145
+ RapierMarkdownSpec?: {wordListLevel(style: string): number; wordListIsMarker(style: string): boolean};
146
+ RapierImageAssets?: Pick<RenderImageAssets, 'dataImage' | 'decodeDataImageBytes' | 'isJxl'>;
147
+ RapierEmbedPictureBase?: MarkdownRealm['RapierEmbedPictureBase'];
148
+ }
149
+ export interface RenderSanitizerHost {
150
+ CSSStyleSheet: typeof CSSStyleSheet;
151
+ DOMPurify: RenderDOMPurify;
152
+ RAPIER_RASTER_DATA_URL_RE: RegExp;
153
+ URL: typeof URL;
154
+ _rapierCssDeclaration(): CSSStyleDeclaration;
155
+ _rapierDropRemoteDeclarations(style: CSSStyleDeclaration): boolean;
156
+ _rapierRemoteContent: RemoteContentPolicy;
157
+ _rapierRuleDescriptorIsRemote(rule: CSSRule): boolean;
158
+ _rapierSanitizeRuntime: SanitizeRuntime;
159
+ document: Document;
160
+ globalThis: SanitizerRealm;
161
+ location: Pick<Location, 'protocol' | 'host'>;
162
+ }
163
+ export interface RenderSanitizer {
164
+ _rapierVerifyRasterBytes(bytes: Uint8Array, mime: string): boolean;
165
+ _rapierInstallSanitizeHooks(): void;
166
+ _rapierInstallDocumentSanitizeHooks(): void;
167
+ sanitizeRapierHtml(value: unknown, context?: SanitizeContext): string;
168
+ sanitizeRapierFragment: ((value: unknown, context?: SanitizeContext) => DocumentFragment) | undefined;
169
+ diagramLabelStyle(property: string, value: string): boolean;
170
+ escapeRapierHtmlText(value: unknown): string;
171
+ _rapierChromeOwnsId(id: string): boolean;
172
+ _rapierLinkDestinationToConfirm(href: string, text?: string): string;
173
+ _rapierSafeRasterDataUrl(value: string): boolean;
174
+ _rapierCssPresentationIsRemote(property: string, value: string): boolean;
175
+ _rapierRemoteSubresourceOrigin(value: string | null | undefined): string;
176
+ _rapierStyleWithoutRemoteUrls(value: string | null | undefined): string;
177
+ _rapierStylesheetWithoutRemoteUrls(css: string | null | undefined): string;
178
+ _rapierDropRemoteRules(rules: CSSRuleList, owner: {deleteRule(index: number): void}): void;
179
+ }
180
+ export function createRenderSanitizer(host: RenderSanitizerHost): RenderSanitizer;
181
+
182
+ export interface WillMarkerPlan {canonical: string; markers: string[]; sentinel: string;}
183
+ export interface WillCarrierFont {family: 'RapierWillCarrier'; bytes: Uint8Array; size: number; codes: number[]; bounds: [number, number, number, number];}
184
+ export interface TemplatePage {
185
+ url: string; width: number; height: number;
186
+ margins: {top: number; right: number; bottom: number; left: number};
187
+ }
188
+ export interface PrintSource {
189
+ root: HTMLElement;
190
+ css: string;
191
+ fontCss?: string;
192
+ canonical: string;
193
+ bom?: boolean;
194
+ filename: string;
195
+ title?: string;
196
+ settings?: RenderDocumentSettings | null;
197
+ templatePage?: TemplatePage | null;
198
+ }
199
+ export interface CaptureRequest {
200
+ root: Element;
201
+ clip: {x: number; y: number; width: number; height: number};
202
+ transparent?: boolean;
203
+ scale?: number;
204
+ signal?: AbortSignal;
205
+ current?: () => boolean;
206
+ pixels?: boolean;
207
+ }
208
+ export type CaptureResult = {rgb: Uint8Array; alpha: Uint8Array; width: number; height: number}
209
+ | {mimeType: string; data: string; width?: number; height?: number};
210
+ export type PrintCapture = (request: CaptureRequest) => Awaitable<CaptureResult>;
211
+ export interface PrintFilmRequest {root: Element; signal?: AbortSignal; current?: () => boolean; frame: {width: number; height: number};}
212
+ export interface PrintFilmSession {
213
+ raster(clip: CaptureRequest['clip'], options: {transparent: boolean}): Awaitable<{
214
+ width: number; height: number; rgb: Uint8Array; alpha?: Uint8Array | null;
215
+ }>;
216
+ close(): void;
217
+ }
218
+ export interface PrintOptions {
219
+ capture: PrintCapture;
220
+ signal?: AbortSignal;
221
+ current?: () => boolean;
222
+ maxBytes?: number;
223
+ film(request: PrintFilmRequest): Awaitable<PrintFilmSession>;
224
+ ink?(root: HTMLElement): void;
225
+ }
226
+ export interface PaintedGlyph {text: string; reason: string; family: string; page?: number;}
227
+ export interface PrintPdf {bytes: Uint8Array; pages: number; painted: PaintedGlyph[];}
228
+ export interface PrintRendererHost {
229
+ Node: Pick<typeof Node, 'ELEMENT_NODE' | 'TEXT_NODE'>;
230
+ _rapierWillParse(source: string): {present: boolean; blocks: readonly {start: number; end: number}[]};
231
+ crypto: Pick<Crypto, 'randomUUID'>;
232
+ document: Document;
233
+ globalThis: PrintRealm;
234
+ }
235
+ export interface PrintRenderer {
236
+ _rapierWillSentinelPlan(canonical: string, kind: DocumentKind): WillMarkerPlan | null;
237
+ _rapierPrintWillAdmit(canonical: string, plan: WillMarkerPlan): void;
238
+ _rapierPrintWillFont(markers: string[], advanceOverride?: number): WillCarrierFont;
239
+ _rapierPrintWillMetrics(markers: string[]): {size: number; advance: number};
240
+ _rapierPrintWillPlace(root: HTMLElement, plan: WillMarkerPlan): void;
241
+ _rapierPrintWillLost(why: string, fix: string): Error;
242
+ _rapierPrintWillPageCss(): string;
243
+ /** Uses an isolated print frame. Closes its film/removes the frame on success or refusal; rejects cancellation/document changes. */
244
+ _rapierWritePrintPdf(source: PrintSource, options: PrintOptions): Promise<PrintPdf>;
245
+ }
246
+ export function createPrintRenderer(host: PrintRendererHost): PrintRenderer;
247
+
248
+ export interface PdfFontAsset {
249
+ family: string; weight: string | number; style?: string; italic?: boolean;
250
+ data?: string; read?(): Awaitable<Uint8Array>;
251
+ system?: boolean; postscriptName?: string;
252
+ }
253
+ export interface PreparedPdfFont {
254
+ bytes: Uint8Array; cids?: readonly number[]; postscriptName?: string; subset?: boolean;
255
+ }
256
+ /** Optional PDF font providers belong to the host, including their licenses. */
257
+ export interface PrintRealm {
258
+ document?: Document;
259
+ RapierMath?: {fit(root: Element): number};
260
+ RapierImageAssets?: {sanitizeSvgText?(source: string): string};
261
+ RapierExportFonts?: {
262
+ preparePdfFont?(bytes: Uint8Array, text: string, style: CSSStyleDeclaration, face: PdfFontAsset,
263
+ options: {subset?: FontSubsetter}): Awaitable<Uint8Array | PreparedPdfFont | null>;
264
+ systemPdfFonts?(): Awaitable<PdfFontAsset[]>;
265
+ maskPdfFont?(bytes: Uint8Array, glyphs: number[]): Awaitable<Uint8Array>;
266
+ };
267
+ RapierFontSubsetPlugin?: {subset: FontSubsetter};
268
+ RapierDocxFonts?: {DOCX_FONTS: readonly PdfFontAsset[]};
269
+ }
270
+
271
+ /** Parser interfaces are shared with marks/assets and the bundled parser door. */
272
+ export type RenderToken = MarkdownToken;
273
+ export type RenderEnvironment = MarkdownEnvironment;
274
+ export type RenderMarkdownParser = MarkdownParser;
275
+ export type {MarkdownOptions} from './marks.mjs';
276
+
277
+ export interface MathDiagnostic {
278
+ code: string; message: string; offset: number; command?: string; suggestion?: string;
279
+ sourceOmitted?: boolean; messageTruncated?: boolean; commandTruncated?: boolean;
280
+ }
281
+ export interface MathSemantics {
282
+ mathml: string;
283
+ status: 'complete' | 'presentation-fallback' | 'refused';
284
+ errors: MathDiagnostic[];
285
+ source: {encoding: 'application/x-tex' | 'application/x-rapier-tex-utf16' | null; omitted?: boolean};
286
+ metrics: {nodes: number; depth: number; outputCodeUnits: number; links: number};
287
+ }
288
+ export interface MathEquation {
289
+ source: string; tex: string; displayMode: boolean; semantics: MathSemantics; errors: MathDiagnostic[];
290
+ }
291
+ export interface MathProvider {
292
+ status: string;
293
+ request?(): boolean | void;
294
+ renderToString?(source: string, options: {displayMode: boolean}): string;
295
+ renderWithMathML?(source: string, options: {displayMode: boolean}): {svg: string; semantics: MathSemantics; errors: MathDiagnostic[]};
296
+ }
297
+ export interface RenderProviders {
298
+ math?: MathProvider;
299
+ mermaid?: {status: string; request?(): boolean | void; renderToString?(source: string): Awaitable<string>};
300
+ }
301
+ export interface SemanticCarry {slugs?: Record<string, number>; headingIds?: readonly string[]; captions?: number; continued?: boolean;}
302
+ export interface SemanticOptions extends RenderWork {
303
+ work?: RenderWork;
304
+ carry?: SemanticCarry;
305
+ imagePresentation?: boolean; passive?: boolean; page?: boolean; providers?: boolean;
306
+ wikiEmbedding?: boolean; wikiLinks?: false | 'links' | 'label';
307
+ mathEquations?: MathEquation[];
308
+ maxNesting?: number; codeBudget?: number;
309
+ parsed?: {tokens: RenderToken[]; env: RenderEnvironment};
310
+ }
311
+ export interface ProjectionOptions {
312
+ baseName?: string;
313
+ keepLayoutData?: boolean; inPlace?: boolean; keepMath?: boolean; keepDiagrams?: boolean; heldPictures?: boolean;
314
+ work?: RenderWork;
315
+ }
316
+ export interface PlainTextOptions {visible?: boolean; inPre?: boolean; heldPictures?: boolean; finalNewline?: boolean; work?: RenderWork;}
317
+ export interface ClipboardOptions {
318
+ formatted?: boolean; baseName?: string; work?: RenderWork;
319
+ materialize?(semanticRoot: HTMLDivElement): Awaitable<boolean | void>;
320
+ }
321
+ export interface ClipboardPayload {plain: string; html?: string; withoutPictures?: (() => Promise<string>) | null;}
322
+ export interface SourceBlock {type: string; raw: string; _sourceStart?: number; _sourceEnd?: number; rendered?: string | null;}
323
+ export interface ImageGeometry {width: number; height: number;}
324
+ export interface MarkdownRenderer {
325
+ /** A missing docKind uses the plain-document path; supply docKind: 'markdown' for Markdown. */
326
+ render(source: string, metadata?: RenderMetadata): string;
327
+ /** Throws when a ready math provider with renderToString and renderWithMathML is unavailable. */
328
+ renderWithMathML(source: string, metadata?: RenderMetadata): {html: string; equations: MathEquation[]};
329
+ /** Creates/configures the parser and replaces this instance's parser binding. */
330
+ initMarkdownIt(): void;
331
+ parser(): RenderMarkdownParser | null | undefined;
332
+ _rapierReadPartDecorations(canonical: string, metadata: RenderMetadata, options?: SemanticOptions): Readonly<{headingIds: readonly string[]; captionStart: number}>;
333
+ _rapierClipboardPayloadAsync(canonical: string, metadata: RenderMetadata, options?: ClipboardOptions): Promise<ClipboardPayload | null>;
334
+ _rapierPlainTextFileAsync(context: RenderContext): Promise<string>;
335
+ _rapierCloneRootAsync<T extends Node>(root: T, work?: RenderWork): Promise<T>;
336
+ _rapierPortablePlainTextAsync(root: Element, options?: PlainTextOptions): Promise<string>;
337
+ _rapierHeldPicturesAsWordsAsync<T extends Element>(root: T, work?: RenderWork): Promise<T>;
338
+ _rapierRenderSemanticRootAsync(canonical: string, metadata: RenderMetadata, options?: SemanticOptions): Promise<HTMLDivElement>;
339
+ _rapierProjectPortableRootAsync(semanticRoot: HTMLElement, options?: ProjectionOptions): Promise<HTMLElement>;
340
+ _rapierPortableHtmlAsync(root: Element, work?: RenderWork): Promise<string>;
341
+ _rapierCalloutInfo(blockquote: Element | null): {first: Element; type: string; existing: Element | null} | null;
342
+ _rapierRemoveCalloutMarker(first: Element | null): void;
343
+ _rapierMathSource(node: Element | null): string;
344
+ _rapierFlattenPortableDetails(root: Element): void;
345
+ _rapierProjectPortableRoot(semanticRoot: HTMLElement, options?: ProjectionOptions): HTMLElement;
346
+ _rapierPortableHtml(root: Element): string;
347
+ _rapierNormalizeInlineText(value: string): string;
348
+ _rapierPortableInlineText(node: Node | null, options?: PlainTextOptions): string;
349
+ _rapierPortableListText(list: Element, depth: number, options?: PlainTextOptions): string;
350
+ _rapierPortableTableText(table: Element, options?: PlainTextOptions): string;
351
+ _rapierPortablePlainText(root: Element, options?: PlainTextOptions): string;
352
+ _rapierPlainTextFile(context: RenderContext): string;
353
+ _rapierHeldPicturesAsWords<T extends Element>(root: T): T;
354
+ _rapierSourceTokenValue(node: Element | null): string | null;
355
+ _rapierResolveSoftBreakTokens<T extends Element>(root: T): T;
356
+ _rapierInertParse(markups: readonly string[]): {doc: Document; boxes: Element[] | null};
357
+ _rapierUnwrapElement(element: Element): void;
358
+ _rapierBidiStrong(codePoint: number): 'L' | 'R' | null;
359
+ _rapierSealBlockHtml(html: string): string;
360
+ _rapierMergeForeignBlocks(blocks: SourceBlock[], source: string, parser: RenderMarkdownParser): SourceBlock[];
361
+ _rapierRenderSemanticRoot(canonical: string, metadata: RenderMetadata, options?: SemanticOptions): HTMLDivElement;
362
+ _rapierInstallSemanticProbe(instance: RenderMarkdownParser): void;
363
+ _rapierApplyImageGeometry(image: HTMLImageElement, geometry?: ImageGeometry): boolean;
364
+ _rapierImageAltSize(value: string): {alt: string; width: number} | null;
365
+ _rapierImageAltSourceParts(value: string): {alt: string; width: number};
366
+ _rapierImageAltText(value: string, environment?: RenderEnvironment): string;
367
+ _rapierImageSizeAttributes(size: {width: number} | null, marker: string | null, geometry?: ImageGeometry, automatic?: boolean): string;
368
+ _rapierRawHtmlFragment(source: string, rewrite: (tag: string) => string, parser: MarkdownParserInternals): string;
369
+ _rapierApplyBlockDirection(root: Element): void;
370
+ _rapierFirstStrongDir(text: string): 'ltr' | 'rtl';
371
+ _rapierAssignHeadingSlugs(root: Element, selector?: string, reserveExisting?: boolean, taken?: Record<string, number> | null, assigned?: readonly string[] | null): void;
372
+ _rapierDisambiguateRenderedAnchors(root: Element): void;
373
+ _rapierDecodeHash(hash: string | null): string;
374
+ _rapierDecorateJumpLists(root: Element, carry?: SemanticCarry | null): void;
375
+ _rapierMarkFigureCaptions(root: Element): void;
376
+ _rapierMarkListContinuations(blocks: Iterable<Element>, mark?: (element: Element, name: string) => void): void;
377
+ _rapierMarkTableCaptions(root: Element, carry?: SemanticCarry | null): void;
378
+ _rapierNormalizeCodeElement(code: Element): void;
379
+ _rapierLanguageClass(element: Element): string;
380
+ _relabelFootnoteHtml(html: string, labels: readonly string[]): string;
381
+ _footnoteIdFromLabel(label: string): string;
382
+ wrapDisplayMath(html: string): string;
383
+ }
384
+
385
+ export interface MarkdownRendererCommonHost {
386
+ Node: Pick<typeof Node, 'ELEMENT_NODE' | 'TEXT_NODE'>;
387
+ _rapierPrefixPortableAnchors: Renderer['_rapierPrefixPortableAnchors'];
388
+ RAPIER_RENDERED_HEADING_SELECTOR: string;
389
+ _rapierChromeOwnsId(id: string): boolean;
390
+ _rapierDormantHeadings(root: ParentNode, selector: string, includeRoot?: boolean): Element[];
391
+ _rapierEmbedAssetSource?(source: string): boolean;
392
+ _rapierHeadingSlugBase(text: string): string;
393
+ _rapierNextHeadingSlug(base: string, taken: Record<string, number>): string;
394
+ _rapierMarkdownPreview?(source: string): string;
395
+ _rapierProviders: RenderProviders;
396
+ _rapierRemoteContent: RemoteContentPolicy;
397
+ _rapierRemoteSubresourceOrigin(value: string): string;
398
+ _rapierRenderedAnchorOriginalIds: WeakMap<Element, string>;
399
+ _rapierSplitOpeningFrontmatter(source: string): {body: string; bodyOffset?: number};
400
+ document: Document;
401
+ escapeRapierHtmlText(value: unknown): string;
402
+ globalThis: Partial<MarkdownRealm>;
403
+ sanitizeRapierHtml(value: string, context?: SanitizeContext): string;
404
+ sanitizeRapierFragment?(value: string, context?: SanitizeContext): DocumentFragment;
405
+ parseAsync?(source: string, options: SemanticOptions): Awaitable<{tokens: RenderToken[]; env: RenderEnvironment}>;
406
+ prefixAnchorsSteps?: Renderer['_rapierPrefixPortableAnchorsSteps'];
407
+ }
408
+ /** Parser installation and image/typography helpers use these ports. A prebound parser can omit unused helpers. */
409
+ export interface MarkdownInitializationPorts {
410
+ RAPIER_HIGHLIGHT_COLOR_BY_MARKER: Readonly<Record<string, string>>;
411
+ RAPIER_MARKDOWN_SPEC: {options: MarkdownOptions; rules: {mathBlock: string}};
412
+ _rapierApplyMarkdownSpec(parser: RenderMarkdownParser, window: MarkdownWindow): void;
413
+ _rapierCodeHtml(source: string, language: string): string;
414
+ _rapierDeriveDarkColor(color: string): string;
415
+ _rapierHighlightAdmitted(source: string): boolean;
416
+ _rapierInstallMarkdownMath(parser: RenderMarkdownParser, blockRule: string): void;
417
+ _rapierPlainLayout(): boolean;
418
+ _rapierRemoteImagePlaceholder(source: string, alt: string, title: string, size: {alt: string; width: number} | null, layout: string, rawAlt: string): string;
419
+ _rapierSourceCharEscaped(source: string, index: number): boolean;
420
+ _rapierUiDiagram?: {request(): void};
421
+ _rapierUiMath?: {request(): void};
422
+ }
423
+ export type PreboundMarkdownRendererHost = MarkdownRendererCommonHost & Partial<MarkdownInitializationPorts> & {
424
+ md: RenderMarkdownParser;
425
+ window?: Pick<Window, 'addEventListener'>;
426
+ };
427
+ export type ConstructedMarkdownRendererHost = MarkdownRendererCommonHost & MarkdownInitializationPorts & {
428
+ md?: null;
429
+ window: MarkdownWindow;
430
+ globalThis: MarkdownRealm;
431
+ _rapierSplitOpeningFrontmatter(source: string): {body: string; bodyOffset: number};
432
+ };
433
+ export type MarkdownRendererHost = PreboundMarkdownRendererHost | ConstructedMarkdownRendererHost;
434
+ export interface MarkdownWindow extends Pick<Window, 'addEventListener'> {
435
+ markdownit(options: MarkdownOptions): RenderMarkdownParser;
436
+ }
437
+ export function createMarkdownRenderer(host: MarkdownRendererHost): MarkdownRenderer;
438
+
439
+ export interface CapturedDocument {
440
+ canonical: string;
441
+ metadata: RenderMetadata;
442
+ baseName: string;
443
+ ledger?: LedgerEnvelope | null;
444
+ carried?: string;
445
+ comparisonBase?: ComparisonBase | null;
446
+ work?: RenderWork;
447
+ }
448
+ export interface RenderContext extends CapturedDocument {semanticRoot: HTMLElement;}
449
+ export interface StyledProjectionOptions extends ProjectionOptions {metadata?: RenderMetadata; print?: boolean;}
450
+ export interface ArtifactOptions {
451
+ kind?: 'standalone' | 'page' | 'publishing' | 'fragment';
452
+ print?: boolean;
453
+ scripts?: boolean;
454
+ extraCss?: string;
455
+ work?: RenderWork;
456
+ willFont?: WillCarrierFont | null;
457
+ afterRoot?(root: HTMLElement): Awaitable<void>;
458
+ afterFonts?(root: HTMLElement, style: {
459
+ css: string; fontCss: string; settings: RenderDocumentSettings | null; language: string; theme: RenderTheme;
460
+ }): Awaitable<void>;
461
+ }
462
+ export interface RenderedArtifact extends HtmlArtifact {
463
+ metadata: RenderMetadata;
464
+ bodyHtml?: string; css?: string; fontCss?: string;
465
+ fontRequests?: FontRequest[];
466
+ settings?: RenderDocumentSettings | null;
467
+ templatePage?: TemplatePage | null;
468
+ docClass?: string; language?: string; documentTitle?: string;
469
+ }
470
+ export interface SharedSourceForms {resolved: string; carried: string; ids: string[]; definitions: string[];}
471
+ export interface SharedDocument {
472
+ source: string; filename: string; kind: DocumentKind; bom: boolean;
473
+ ledger?: LedgerEnvelope | null; authorship?: AuthorshipEnvelope | null;
474
+ comparisonBase: ComparisonBase | null;
475
+ }
476
+ export interface ImageRun {open: string; close: string;}
477
+ export interface MarkdownImageSource {
478
+ kind: 'inline' | 'reference'; start: number; end: number;
479
+ source: string; altStart?: number; altEnd?: number; parenStart?: number; innerStart?: number; innerEnd?: number;
480
+ altSource?: string; destinationSource?: string; titleSource?: string; referenceSource?: string;
481
+ renderIndex?: number; reference?: string; destination?: string | null; title?: string;
482
+ openRuns?: ImageRun[]; tokenEnd?: number; layoutStart?: number; placementSource?: string; placement?: Layout;
483
+ }
484
+ export interface HtmlImageSource {
485
+ htmlBlock: true; renderIndex: 0; alt: string; altSource: ''; tokenEnd: number;
486
+ source: string; start: number; end: number; fenceEnd: number;
487
+ info: string; body: string; infoStart: number; infoEnd: number;
488
+ attrs: {id?: string; viewport?: string; overflow?: 'clip'; [name: string]: string | undefined};
489
+ layout: Layout; placement: Layout;
490
+ marker: {start: number; end: number; text: string} | null;
491
+ standalone: true; imageOnly: true;
492
+ }
493
+ export interface ImageDestination {
494
+ start: number; end: number; outerStart: number; outerEnd: number; delimited: boolean;
495
+ destination: string; source: string; image?: MarkdownImageSource; reference?: string; title?: string;
496
+ }
497
+ export interface ArtifactFactories {
498
+ factories: Record<string, () => object>;
499
+ groups?: Record<string, readonly string[]>;
500
+ inkLicense?: string;
501
+ }
502
+ export interface ArtifactLayoutSession {reflow(): void; destroy(options?: {documentChanged?: boolean}): void;}
503
+ export interface Renderer {
504
+ /** Writes an offline HTML page. Rejects invalid source/filename, unavailable resources, or host cancellation. */
505
+ render(source: string, options?: RenderOptions): Promise<HtmlArtifact>;
506
+ _rapierDataImageDestinationsAsync(source: string, work?: RenderWork): Promise<ImageDestination[]>;
507
+ _rapierSharedSourceFormsAsync(source: string, root: Element, work?: RenderWork): Promise<SharedSourceForms>;
508
+ _rapierPrefixPortableAnchorsSteps(root: Element, baseName: string): Generator<void, void, unknown>;
509
+ _rapierPortableAnchorId(baseName: string, id: string): string;
510
+ _rapierProjectStyledRootAsync(semanticRoot: HTMLElement, options?: StyledProjectionOptions): Promise<HTMLElement>;
511
+ _rapierBuildArtifact(options?: ArtifactOptions, providedContext?: RenderContext): Promise<RenderedArtifact>;
512
+ _rapierBuildPublishedPage(context: RenderContext): Promise<RenderedArtifact>;
513
+ _rapierProjectStyledRoot(semanticRoot: HTMLElement, options?: StyledProjectionOptions): HTMLElement;
514
+ _rapierDocxRenderStyles(root: HTMLElement): void;
515
+ _rapierPaintCode(element: Element, html: string): void;
516
+ _rapierPrefixPortableAnchors(root: Element, baseName: string): void;
517
+ _rapierDocumentSettingsOf(canonical: string): RenderDocumentSettings | null;
518
+ _rapierDocumentSettingsCss(settings: RenderDocumentSettings | null): string;
519
+ _rapierExportedPageCsp(nonce: string, fonts: boolean): string;
520
+ _rapierArtifactNonce(): string;
521
+ _rapierAnnotateExportBoxPolygons(root: Element): void;
522
+ _rapierSharedSourceHash(source: string, work?: RenderWork | null): Promise<string>;
523
+ _rapierSharedSourceForms(source: string, root: Element): SharedSourceForms;
524
+ _rapierSharedSourceCarrier(context: CapturedDocument, root: Element): Promise<string>;
525
+ _rapierSharedResolve(text: string, ids: string[], images: Map<string, string | null>, definitions: Set<string>): {text: string; broken: boolean};
526
+ _rapierReadSharedDocument(text: string, filename: string): Promise<SharedDocument | null>;
527
+ _rapierSharedPageFallbackCss(clearOnly?: boolean): string;
528
+ _rapierShareWrapKind(element: Element): 'prose' | 'picture' | 'metadata' | null;
529
+ _rapierSharePictureParagraph(image: HTMLImageElement): HTMLParagraphElement | null;
530
+ _rapierSharedPageLayout(root: HTMLElement): void;
531
+ _rapierShareCapLongCodeBlocks(root: HTMLElement): void;
532
+ _rapierRequireOfflinePageImages(root: Element): Promise<void>;
533
+ _rapierCssValueUrls(value: string): string[] | null;
534
+ _rapierBuildSharedPage(captured: CapturedDocument): Promise<FileArtifact>;
535
+ _rapierImageSources(tokens: readonly RenderToken[] | null | undefined): Set<string>;
536
+ _rapierImageDestinations(source: string, accepts: (url: string) => boolean): ImageDestination[];
537
+ _rapierScanMarkdownImages(source: string, parsedTokens?: RenderToken[] | null): (MarkdownImageSource | HtmlImageSource)[];
538
+ _rapierParseMarkdownImageDestination(inner: string): {destination: string; title: string};
539
+ _rapierImageOpenRunsList(tokens: readonly RenderToken[]): ImageRun[][];
540
+ _rapierArtifactFactoryModules(dependencies: ArtifactFactories, group: string): string;
541
+ _rapierProjectArtifactLayout(root: HTMLElement, metadata: typeof import('./layout.mjs'), geometry: typeof import('./model.mjs'), preparation: Pick<typeof import('./model.mjs'), 'createPreparationScope'>): Readonly<ArtifactLayoutSession> | null;
542
+ _rapierArtifactLayoutScript(root: Element, nonce?: string, options?: {pictures?: boolean}): string;
543
+ _rapierArtifactInkScript(root: Element, nonce?: string): string;
544
+ }
545
+
546
+ /** Feature ports may be omitted when the host refuses source/options requiring that feature. */
547
+ export interface RendererHostPorts {
548
+ RapierPageReturnAddress: {PAGE_SEED: string};
549
+ RapierTextCodec: {normalizeDocument(source: string): string; maxDocumentBytes: number};
550
+ _rapierArtifactHighlight(source: string, language: string): string;
551
+ _rapierArtifactPreference(name: string, values: readonly string[]): string;
552
+ _rapierArtifactStyles: RenderStyles['_rapierArtifactStyles'];
553
+ _rapierBlobDataUrl?(blob: Blob): Awaitable<string>;
554
+ _rapierBuildInterchangeContext?(options: ArtifactOptions): RenderContext;
555
+ _rapierDocumentNameIsAdmissible(filename: string): boolean;
556
+ _rapierLedgerParts?(source: string, ledger?: LedgerEnvelope | null, carried?: string): DocumentParts;
557
+ _rapierDrawReadSVGRecipe?(source: string): DrawingRecipe | null;
558
+ _rapierDrawShapeProfileFor?(recipe: DrawingRecipe, glyphs: ShapeProfile | null): ShapeProfile | null;
559
+ _rapierExportFontCss?(root: Element, options: HostExportFontOptions): Awaitable<string>;
560
+ _rapierFillDiagram?(element: Element, force?: boolean): Awaitable<void>;
561
+ _rapierFinalizeExportCode?(root: Element): Awaitable<void>;
562
+ _rapierLanguageClass(element: Element): string;
563
+ _rapierLineStartOffsets?(source: string): number[];
564
+ _rapierMarkdownEnvironment?(): RenderEnvironment;
565
+ _rapierPortableHtml: MarkdownRenderer['_rapierPortableHtml'];
566
+ _rapierPrepareInterchangeContext(options: {kind: 'share'}, captured: CapturedDocument): Awaitable<RenderContext>;
567
+ _rapierProjectPortableRoot: MarkdownRenderer['_rapierProjectPortableRoot'];
568
+ _rapierProjectPortableRootAsync?: MarkdownRenderer['_rapierProjectPortableRootAsync'];
569
+ _rapierPortableHtmlAsync?: MarkdownRenderer['_rapierPortableHtmlAsync'];
570
+ _rapierProviders?: RenderProviders;
571
+ _rapierSourceCharEscaped?(source: string, index: number): boolean;
572
+ _rapierSourceLineSpan?(source: string, starts: readonly number[], startLine: number, endLine: number): {start: number; end: number};
573
+ crypto: Pick<Crypto, 'getRandomValues' | 'subtle'>;
574
+ document: Document;
575
+ escapeRapierHtmlText(value: unknown): string;
576
+ globalThis: RenderRealm;
577
+ sanitizeRapierHtml(value: string, context?: SanitizeContext): string;
578
+ md: RenderMarkdownParser;
579
+ materializeDocumentFonts?(source: string, options: {parser: RenderMarkdownParser}): Awaitable<string>;
580
+ validateFont?: FontValidator;
581
+ dataImageDestinationsAsync?(source: string, work?: RenderWork): Awaitable<ImageDestination[]>;
582
+ }
583
+ /** A ledger module and the callback that supplies its document parts are one capability. */
584
+ export type RendererHost = RendererHostPorts & (
585
+ {RapierLedgerCarried?: null; _rapierLedgerParts?: RendererHostPorts['_rapierLedgerParts']}
586
+ | {RapierLedgerCarried: typeof import('./ledger/carried.mjs'); _rapierLedgerParts: NonNullable<RendererHostPorts['_rapierLedgerParts']>}
587
+ );
588
+ export function createRenderer<Host extends RendererHost>(host: Host): Renderer;
589
+
590
+ /** These are the recipe fields read here; the drawing provider may retain more data. */
591
+ export interface DrawingRecipe {
592
+ canvas: {w: number; h: number};
593
+ view?: {x: number; y: number; w: number; h: number};
594
+ shapes: readonly {recognized?: string; label?: string}[];
595
+ }
596
+
597
+ export interface RenderImageAssets extends Pick<typeof import('./assets.mjs'), 'dataImage' | 'installMarkdownImages' | 'configureParser'> {
598
+ decodeDataImageBytes(source: string): {bytes: Uint8Array};
599
+ drawingImageAlt(source: string): string | null;
600
+ imagePlaceholderDimensions(source: string): ImageGeometry | null;
601
+ isJxl?(bytes: Uint8Array): boolean;
602
+ sanitizeSvgText?(source: string): string;
603
+ imageAnimation?(source: string): {first: string; width: number; height: number} | null;
604
+ }
605
+
606
+ export interface MarkdownRealm {
607
+ document?: Document;
608
+ location?: Pick<Location, 'href'>;
609
+ RapierMarkdownSpec: typeof import('./marks.mjs');
610
+ RapierMarkdownLayout: typeof import('./layout.mjs');
611
+ RapierImageAssets: RenderImageAssets;
612
+ RapierEmbedPictureBase?: ((source: string) => string | null) & {vouched?: Set<string>};
613
+ RapierSiblingPictures?: Set<string>;
614
+ RapierPlatform?: {files: {relativeCandidate?(source: string): boolean}};
615
+ RapierOriginalFolderCore?: {currentOriginal(): null | {
616
+ embed(href: string): Promise<{text: string; displayPath: string}>;
617
+ addressFrom(displayPath: string, address: string): Promise<string>;
618
+ }};
619
+ RapierEmbeddedImages?: {
620
+ imageHtml(reference: string | null | undefined, alt: string, title: string, size: {alt: string; width: number} | null,
621
+ layout: string, rawAlt: string, source: string | undefined, url: string, presentation: boolean): string;
622
+ geometry?(source: string): ImageGeometry | null;
623
+ };
624
+ RapierFlowchart?: {parseFlowchart(source: string): {ok: boolean}};
625
+ rapierRenderPreview?(source: string): string;
626
+ }
627
+
628
+ /** Host-supplied module capabilities. Optional feature ports retain their own licenses. */
629
+ export interface RenderRealm {
630
+ document?: Document;
631
+ navigator?: Pick<Navigator, 'language'>;
632
+ location?: Pick<Location, 'href'>;
633
+ RapierMarkdownSpec?: typeof import('./marks.mjs') & {
634
+ readDocumentSettings?(source: string): RenderDocumentSettings | null;
635
+ documentSettingsStyle?(settings: RenderDocumentSettings): string;
636
+ documentSettingsPageRule?(settings: RenderDocumentSettings): string | null;
637
+ documentTitle?(settings: RenderDocumentSettings): string;
638
+ wordListLevel?(style: string): number;
639
+ wordListIsMarker?(style: string): boolean;
640
+ };
641
+ RapierMarkdownLayout?: typeof import('./layout.mjs');
642
+ RapierImageLayout?: typeof import('./model.mjs');
643
+ RapierImageAssets?: RenderImageAssets;
644
+ RapierEmbedPictureBase?: ((source: string) => string | null) & {vouched?: Set<string>};
645
+ RapierSiblingPictures?: Set<string>;
646
+ RapierPlatform?: {files: {relativeCandidate?(source: string): boolean}};
647
+ RapierOriginalFolderCore?: {currentOriginal(): null | {
648
+ embed(href: string): Promise<{text: string; displayPath: string}>;
649
+ addressFrom(displayPath: string, address: string): Promise<string>;
650
+ }};
651
+ RapierArtifactLayoutDependencies?: ArtifactFactories;
652
+ RapierMath?: {fit(root: Element): number};
653
+ rapierRenderPreview?(source: string): string;
654
+ }