UNPKG

@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
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))); };