export type MessageAssetPayload = { assetId: string filename?: string fileSize?: number mimeType?: string url?: string } export function parseMessageAssetPayload(payload?: string): MessageAssetPayload | null { if (!payload?.trim()) { return null } try { const parsed = JSON.parse(payload) as MessageAssetPayload if (!parsed?.assetId?.trim()) { return null } return parsed } catch { return null } } export function renderIMMessageHTML(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 `

${escapeHTML(message.content || "")}

` } export function summarizeIMMessage(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 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 `` }