import type { MarkedExtension } from 'marked' interface InfographicOptions { themeMode?: 'dark' | 'light' } async function renderInfographic(containerId: string, code: string, options?: InfographicOptions) { if (typeof window === 'undefined') return try { const { Infographic, setDefaultFont, setFontExtendFactor, exportToSVG } = await import('@antv/infographic') setFontExtendFactor(1.1) setDefaultFont('-apple-system-font, "system-ui", "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif') const findContainer = (retries = 5, delay = 100) => { const container = document.getElementById(containerId) if (container) { const isDark = options?.themeMode === 'dark' // 从 CSS 变量中读取主题颜色 const root = document.documentElement const computedStyle = getComputedStyle(root) const primaryColor = computedStyle.getPropertyValue('--md-primary-color').trim() const backgroundColor = computedStyle.getPropertyValue('--background').trim() // 转换 HSL 格式 const toHSLString = (variant: string) => { const vars = variant.split(' ') if (vars.length === 3) return `hsl(${vars.join(', ')})` if (vars.length === 4) return `hsla(${vars.join(', ')})` return '' } const instance = new Infographic({ container, svg: { style: { width: '100%', height: '100%', background: isDark ? '#000' : 'transparent', }, background: false, }, theme: isDark ? 'dark' : 'default', themeConfig: { colorPrimary: primaryColor || undefined, colorBg: toHSLString(backgroundColor) || undefined, }, }) instance.on('loaded', ({ node }) => { exportToSVG(node, { removeIds: true }).then((svg) => { container.replaceChildren(svg) }) }) instance.render(code) return } if (retries > 0) { setTimeout(() => findContainer(retries - 1, delay), delay) } } findContainer() } catch (error) { console.error('Failed to render Infographic:', error) const container = document.getElementById(containerId) if (container) { container.innerHTML = `