@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.
62 lines (61 loc) • 2.45 kB
JavaScript
import { defaultRenderers } from './markdown-parser.js';
import { rendererKeysInternal } from './rendererKeys.js';
/**
* Merges caller renderer overrides with the built-in renderer map.
*
* @param renderers Partial renderer overrides from component props.
* @returns Renderer map with default markdown and HTML renderers preserved.
*/
export const buildCombinedRenderers = (renderers) => ({
...defaultRenderers,
...renderers,
html: renderers.html
? {
...defaultRenderers.html,
...renderers.html
}
: defaultRenderers.html
});
/**
* Gets renderer keys recognized by the component.
*
* @param extensionTokenNames Custom token names declared by Marked extensions.
* @returns Built-in markdown renderer keys followed by extension token names.
*/
export const getAllRendererKeys = (extensionTokenNames) => [
...rendererKeysInternal,
...extensionTokenNames
];
/**
* Extracts markdown snippet overrides from rest props.
*
* @param rest Extra component props after known SvelteMarkdown props are removed.
* @param allRendererKeys Built-in and extension renderer keys to match.
* @returns Snippet overrides keyed by markdown token type.
*/
export const getSnippetOverrides = (rest, allRendererKeys) => Object.fromEntries(allRendererKeys
.filter((key) => key in rest && rest[key] != null)
.map((key) => [key, rest[key]]));
/**
* Extracts HTML snippet overrides from rest props.
*
* @param rest Extra component props after known SvelteMarkdown props are removed.
* @returns HTML snippet overrides keyed by tag name without the `html_` prefix.
*/
export const getHtmlSnippetOverrides = (rest) => Object.fromEntries(Object.entries(rest)
.filter(([key, val]) => key.startsWith('html_') && val != null)
.map(([key, val]) => [key.slice(5), val]));
/**
* Removes snippet override props from the props forwarded to Parser.
*
* @param rest Extra component props after known SvelteMarkdown props are removed.
* @param allRendererKeys Built-in and extension renderer keys to exclude.
* @returns Props that should pass through to the rendered markdown tree.
*/
export const getPassThroughProps = (rest, allRendererKeys) => {
const snippetKeySet = new Set([
...allRendererKeys,
...Object.keys(rest).filter((key) => key.startsWith('html_'))
]);
return Object.fromEntries(Object.entries(rest).filter(([key]) => !snippetKeySet.has(key)));
};