mirror of
https://github.com/open-webui/open-webui.git
synced 2025-12-17 06:45:24 +00:00
Merge pull request #18068 from rgaricano/dev-FEAT_Vega_Visualizer
UPD: Add Validators & Error Toast for Mermaid & Vega diagrams
This commit is contained in:
commit
08f8713ee1
2 changed files with 37 additions and 33 deletions
|
|
@ -326,12 +326,26 @@
|
||||||
const render = async () => {
|
const render = async () => {
|
||||||
onUpdate(token);
|
onUpdate(token);
|
||||||
if (lang === 'mermaid' && (token?.raw ?? '').slice(-4).includes('```')) {
|
if (lang === 'mermaid' && (token?.raw ?? '').slice(-4).includes('```')) {
|
||||||
|
try {
|
||||||
mermaidHtml = await renderMermaidDiagram(code);
|
mermaidHtml = await renderMermaidDiagram(code);
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Failed to render mermaid diagram:', error);
|
||||||
|
const errorMsg = error instanceof Error ? error.message : String(error);
|
||||||
|
toast.error($i18n.t('Failed to render diagram') + `: ${errorMsg}`);
|
||||||
|
mermaidHtml = null;
|
||||||
|
}
|
||||||
} else if (
|
} else if (
|
||||||
(lang === 'vega' || lang === 'vega-lite') &&
|
(lang === 'vega' || lang === 'vega-lite') &&
|
||||||
(token?.raw ?? '').slice(-4).includes('```')
|
(token?.raw ?? '').slice(-4).includes('```')
|
||||||
) {
|
) {
|
||||||
|
try {
|
||||||
vegaHtml = await renderVegaVisualization(code);
|
vegaHtml = await renderVegaVisualization(code);
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Failed to render Vega visualization:', error);
|
||||||
|
const errorMsg = error instanceof Error ? error.message : String(error);
|
||||||
|
toast.error($i18n.t('Failed to render diagram') + `: ${errorMsg}`);
|
||||||
|
vegaHtml = null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1580,39 +1580,29 @@ export const decodeString = (str: string) => {
|
||||||
};
|
};
|
||||||
|
|
||||||
export const renderMermaidDiagram = async (code: string) => {
|
export const renderMermaidDiagram = async (code: string) => {
|
||||||
try {
|
|
||||||
const { default: mermaid } = await import('mermaid');
|
const { default: mermaid } = await import('mermaid');
|
||||||
mermaid.initialize({
|
mermaid.initialize({
|
||||||
startOnLoad: true,
|
startOnLoad: false, // Should be false when using render API
|
||||||
theme: document.documentElement.classList.contains('dark') ? 'dark' : 'default',
|
theme: document.documentElement.classList.contains('dark') ? 'dark' : 'default',
|
||||||
securityLevel: 'loose'
|
securityLevel: 'loose'
|
||||||
});
|
});
|
||||||
if (await mermaid.parse(code)) {
|
const parseResult = await mermaid.parse(code, { suppressErrors: false });
|
||||||
|
if (parseResult) {
|
||||||
const { svg } = await mermaid.render(`mermaid-${uuidv4()}`, code);
|
const { svg } = await mermaid.render(`mermaid-${uuidv4()}`, code);
|
||||||
return svg;
|
return svg;
|
||||||
}
|
}
|
||||||
} catch (error) {
|
|
||||||
console.log('Failed to render mermaid diagram:', error);
|
|
||||||
return '';
|
return '';
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export const renderVegaVisualization = async (spec: string) => {
|
export const renderVegaVisualization = async (spec: string, i18n?: any) => {
|
||||||
try {
|
|
||||||
const vega = await import('vega');
|
const vega = await import('vega');
|
||||||
const parsedSpec = JSON.parse(spec);
|
const parsedSpec = JSON.parse(spec);
|
||||||
let vegaSpec;
|
let vegaSpec = parsedSpec;
|
||||||
if (parsedSpec.$schema && parsedSpec.$schema.includes('vega-lite')) {
|
if (parsedSpec.$schema && parsedSpec.$schema.includes('vega-lite')) {
|
||||||
const vegaLite = await import('vega-lite');
|
const vegaLite = await import('vega-lite');
|
||||||
vegaSpec = vegaLite.compile(parsedSpec).spec;
|
vegaSpec = vegaLite.compile(parsedSpec).spec;
|
||||||
} else {
|
|
||||||
vegaSpec = parsedSpec;
|
|
||||||
}
|
}
|
||||||
const view = new vega.View(vega.parse(vegaSpec), {renderer: 'none'});
|
const view = new vega.View(vega.parse(vegaSpec), { renderer: 'none' });
|
||||||
const svg = await view.toSVG();
|
const svg = await view.toSVG();
|
||||||
return svg;
|
return svg;
|
||||||
} catch (error) {
|
|
||||||
console.log('Failed to render Vega visualization:', error);
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue