import MarkdownIt from "markdown-it"; export type WidgetMessageAssetPayload = { assetId: string; filename?: string; fileSize?: number; mimeType?: string; url?: string; }; const messageMarkdown = new MarkdownIt({ html: false, linkify: true, breaks: true, }); export function parseMessageAssetPayload( payload?: string, ): WidgetMessageAssetPayload | null { if (!payload?.trim()) { return null; } try { const parsed = JSON.parse(payload) as WidgetMessageAssetPayload; if (!parsed?.assetId?.trim()) { return null; } return parsed; } catch { return null; } } export function renderMessageHTML(message: { messageType: string; content: string; payload?: string; }) { if (message.messageType === "html") { return message.content; } const asset = parseMessageAssetPayload(message.payload); if (message.messageType === "image") { if (asset?.url) { return `

${escapeHTMLAttr(
        asset.filename ||

`; } return "

[图片]

"; } if (message.messageType === "attachment") { if (asset?.url) { const title = escapeHTML(asset.filename || message.content || "附件"); const meta = formatFileSize(asset.fileSize ?? 0); const metaHTML = meta ? `
${escapeHTML(meta)}
` : ""; return `
${title}${metaHTML}
`; } return `

${escapeHTML(message.content || "[附件]")}

`; } return renderTextMessageHTML(message.content || ""); } export function summarizeMessage(message: { messageType: string; content: string; payload?: string; }) { if (message.messageType === "image") { return "[图片]"; } if (message.messageType === "attachment") { const asset = parseMessageAssetPayload(message.payload); return asset?.filename?.trim() ? `[附件] ${asset.filename.trim()}` : "[附件]"; } if (message.messageType === "html") { const text = extractTextFromHTML(message.content); if (text.trim()) { return text.substring(0, 100); } if (message.content.includes("= 1024 && index < units.length - 1) { value /= 1024; index += 1; } const digits = value >= 10 || index === 0 ? 0 : 1; return `${value.toFixed(digits)} ${units[index]}`; } function extractTextFromHTML(html: string): string { if (typeof document === "undefined") { return ""; } const div = document.createElement("div"); div.innerHTML = html; return div.textContent || div.innerText || ""; } function renderTextMessageHTML(content: string) { const value = content.trim(); if (!value) { return "

"; } return messageMarkdown.render(value); } function escapeHTML(value: string) { return value .replaceAll("&", "&") .replaceAll("<", "<") .replaceAll(">", ">") .replaceAll('"', """) .replaceAll("'", "'") .replaceAll("\n", "
"); } function escapeHTMLAttr(value: string) { return value .replaceAll("&", "&") .replaceAll('"', """) .replaceAll("<", "<") .replaceAll(">", ">"); } function getAttachmentIconSVG() { return ``; }