This commit is contained in:
Timothy J. Baek 2024-08-16 15:33:14 +02:00
parent 92062ff722
commit 4ef042e966
6 changed files with 77 additions and 8 deletions

View File

@ -45,6 +45,14 @@
{#if token.text} {#if token.text}
<KatexRenderer content={revertSanitizedResponseContent(token.text)} displayMode={false} /> <KatexRenderer content={revertSanitizedResponseContent(token.text)} displayMode={false} />
{/if} {/if}
{:else if token.type === 'iframe'}
<iframe
src="{WEBUI_BASE_URL}/api/v1/files/{token.fileId}/content"
title={token.fileId}
width="100%"
frameborder="0"
onload="this.style.height=(this.contentWindow.document.body.scrollHeight+20)+'px';"
></iframe>
{:else if token.type === 'text'} {:else if token.type === 'text'}
{token.raw} {token.raw}
{/if} {/if}

View File

@ -7,6 +7,7 @@
import CodeBlock from '$lib/components/chat/Messages/CodeBlock.svelte'; import CodeBlock from '$lib/components/chat/Messages/CodeBlock.svelte';
import MarkdownInlineTokens from '$lib/components/chat/Messages/MarkdownInlineTokens.svelte'; import MarkdownInlineTokens from '$lib/components/chat/Messages/MarkdownInlineTokens.svelte';
import KatexRenderer from './KatexRenderer.svelte'; import KatexRenderer from './KatexRenderer.svelte';
import { WEBUI_BASE_URL } from '$lib/constants';
export let id: string; export let id: string;
export let tokens: Token[]; export let tokens: Token[];
@ -98,6 +99,14 @@
{:else} {:else}
{token.text} {token.text}
{/if} {/if}
{:else if token.type === 'iframe'}
<iframe
src="{WEBUI_BASE_URL}/api/v1/files/{token.fileId}/content"
title={token.fileId}
width="100%"
frameborder="0"
onload="this.style.height=(this.contentWindow.document.body.scrollHeight+20)+'px';"
></iframe>
{:else if token.type === 'paragraph'} {:else if token.type === 'paragraph'}
<p> <p>
<MarkdownInlineTokens id={`${id}-${tokenIdx}-p`} tokens={token.tokens ?? []} /> <MarkdownInlineTokens id={`${id}-${tokenIdx}-p`} tokens={token.tokens ?? []} />

View File

@ -76,13 +76,15 @@
import 'katex/dist/katex.min.css'; import 'katex/dist/katex.min.css';
import markedKatex from '$lib/utils/katex-extension'; import markedKatex from '$lib/utils/marked/katex-extension';
import markedToken from '$lib/utils/marked/token-extension';
const options = { const options = {
throwOnError: false throwOnError: false
}; };
marked.use(markedKatex(options)); marked.use(markedKatex(options));
marked.use(markedToken({ WEBUI_BASE_URL }));
$: (async () => { $: (async () => {
if (message?.content) { if (message?.content) {

View File

@ -27,7 +27,6 @@ export const replaceTokens = (content, char, user) => {
const charToken = /{{char}}/gi; const charToken = /{{char}}/gi;
const userToken = /{{user}}/gi; const userToken = /{{user}}/gi;
const videoIdToken = /{{VIDEO_FILE_ID_([a-f0-9-]+)}}/gi; // Regex to capture the video ID const videoIdToken = /{{VIDEO_FILE_ID_([a-f0-9-]+)}}/gi; // Regex to capture the video ID
const htmlIdToken = /{{HTML_FILE_ID_([a-f0-9-]+)}}/gi; // Regex to capture the HTML ID
// Replace {{char}} if char is provided // Replace {{char}} if char is provided
if (char !== undefined && char !== null) { if (char !== undefined && char !== null) {
@ -45,12 +44,6 @@ export const replaceTokens = (content, char, user) => {
return `<video src="${videoUrl}" controls></video>`; return `<video src="${videoUrl}" controls></video>`;
}); });
// Replace HTML ID tags with corresponding HTML content
content = content.replace(htmlIdToken, (match, fileId) => {
const htmlUrl = `${WEBUI_BASE_URL}/api/v1/files/${fileId}/content`;
return `<iframe src="${htmlUrl}" width="100%" frameborder="0" onload="this.style.height=(this.contentWindow.document.body.scrollHeight+20)+'px';"></iframe>`;
});
return content; return content;
}; };

View File

@ -0,0 +1,57 @@
export default function (options = {}) {
return {
extensions: [inlineIframeToken(options), blockIframeToken(options)]
};
}
const inlineIframeToken = (options = {}) => {
const WEBUI_BASE_URL = options.WEBUI_BASE_URL || '';
const htmlIdToken = /{{HTML_FILE_ID_([a-f0-9-]+)}}/gi; // Regex to capture the HTML ID
function tokenizer(src) {
const match = htmlIdToken.exec(src);
if (match) {
return {
type: 'iframe',
raw: match[0],
fileId: match[1]
};
}
}
function renderer(token) {
const htmlUrl = `${WEBUI_BASE_URL}/api/v1/files/${token.fileId}/content`;
const iframeElement = `<iframe src="${htmlUrl}" width="100%" frameborder="0" onload="this.style.height=(this.contentWindow.document.body.scrollHeight+20)+'px';"></iframe>`;
return iframeElement;
}
return {
name: 'iframe',
level: 'inline',
tokenizer,
renderer
};
};
const blockIframeToken = (options = {}) => {
const WEBUI_BASE_URL = options.WEBUI_BASE_URL || '';
const htmlIdToken = /{{HTML_FILE_ID_([a-f0-9-]+)}}/gi; // Regex to capture the HTML ID
function tokenizer(src) {
const match = htmlIdToken.exec(src);
if (match) {
return {
type: 'iframe',
raw: match[0],
fileId: match[1]
};
}
}
function renderer(token) {
const htmlUrl = `${WEBUI_BASE_URL}/api/v1/files/${token.fileId}/content`;
const iframeElement = `<iframe src="${htmlUrl}" width="100%" frameborder="0" onload="this.style.height=(this.contentWindow.document.body.scrollHeight+20)+'px';"></iframe>`;
return iframeElement;
}
return {
name: 'iframe',
level: 'block',
tokenizer,
renderer
};
};