@humanspeak/svelte-markdown
Version:
Markdown and HTML renderer for Svelte 5 — built for rendering streaming AI agent output from Claude Code, ChatGPT, and agentic workflows. XSS-safe defaults, streaming-aware sanitization, token caching, TypeScript types, and Svelte 5 runes.
40 lines (39 loc) • 1.81 kB
TypeScript
import type { SvelteMarkdownOptions } from '../types.js';
import type { Token, TokensList } from './markdown-parser.js';
export interface RenderPreparation {
source?: string;
startIndex?: number;
startOffset?: number;
}
export interface RenderMetadata {
prepareTokensForRender: (_tokens: Token[] | TokensList | undefined, _options: SvelteMarkdownOptions, _preparation?: RenderPreparation) => Token[] | TokensList | undefined;
getPreparedHeadingId: (_node: unknown) => string | undefined;
getStableNodeKey: (_node: unknown, _index: number) => unknown;
getStableRowKey: (_row: unknown[] | undefined, _index: number) => unknown;
}
export declare const RENDER_METADATA_CONTEXT: unique symbol;
/**
* Creates a per-`SvelteMarkdown`-instance render metadata helper. State
* (render keys, precomputed heading ids, source offsets, and cross-pass
* bookkeeping) is captured in the returned closure via WeakMaps keyed by token
* objects, so each component instance gets isolated metadata and caller token
* arrays are never mutated. See the module overview above for the keying and
* heading-id strategy.
*
* @returns A {@link RenderMetadata} whose methods precompute per-pass metadata
* (`prepareTokensForRender`) and read it back during render
* (`getPreparedHeadingId`, `getStableNodeKey`, `getStableRowKey`).
* @example
* ```ts
* const metadata = createRenderMetadata()
* // Streaming append: skip the stable prefix via the parser's diverge point.
* const tokens = metadata.prepareTokensForRender(rawTokens, options, {
* source,
* startIndex,
* startOffset
* })
* const key = metadata.getStableNodeKey(tokens?.[0], 0)
* const id = metadata.getPreparedHeadingId(tokens?.[0])
* ```
*/
export declare const createRenderMetadata: () => RenderMetadata;