1
import type { FileData } from "@gradio/client";
2
import { uploadToHuggingFace } from "@gradio/utils";
4
export const format_chat_for_sharing = async (
5
chat: [string | FileData | null, string | FileData | null][]
7
let messages = await Promise.all(
8
chat.map(async (message_pair) => {
9
return await Promise.all(
10
message_pair.map(async (message, i) => {
11
if (message === null) return "";
12
let speaker_emoji = i === 0 ? "😃" : "🤖";
13
let html_content = "";
15
if (typeof message === "string") {
16
const regexPatterns = {
17
audio: /<audio.*?src="(\/file=.*?)"/g,
18
video: /<video.*?src="(\/file=.*?)"/g,
19
image: /<img.*?src="(\/file=.*?)".*?\/>|!\[.*?\]\((\/file=.*?)\)/g
22
html_content = message;
24
for (let [_, regex] of Object.entries(regexPatterns)) {
27
while ((match = regex.exec(message)) !== null) {
28
const fileUrl = match[1] || match[2];
29
const newUrl = await uploadToHuggingFace(fileUrl, "url");
30
html_content = html_content.replace(fileUrl, newUrl);
34
if (!message?.url) return "";
35
const file_url = await uploadToHuggingFace(message.url, "url");
36
if (message.mime_type?.includes("audio")) {
37
html_content = `<audio controls src="${file_url}"></audio>`;
38
} else if (message.mime_type?.includes("video")) {
39
html_content = file_url;
40
} else if (message.mime_type?.includes("image")) {
41
html_content = `<img src="${file_url}" />`;
45
return `${speaker_emoji}: ${html_content}`;
51
.map((message_pair) =>
53
message_pair[0] !== "" && message_pair[1] !== "" ? "\n" : ""