メインコンテンツまでスキップ

画像のエクスポート

Mind Elixir の画像エクスポート API は 2 つあります:

exportSvg: (
this: MindElixirInstance,
noForeignObject?: boolean,
injectCss?: string | undefined
) => Blob
exportPng: (
this: MindElixirInstance,
noForeignObject?: boolean,
injectCss?: string | undefined
) => Promise<Blob | null>

noForeignObjecttrue に設定されると、SVG のエクスポート時に foreignObject が使用されません。

すべての SVG レンダラが foreignObject をサポートしているわけではないため、特定のシナリオでエクスポートされた SVG を使用できない場合は foreignObject を無効にすることができます。その代償として、ノード内の非常に長いテキストは改行されません。(もちろん、直接 PNG を出力することもできます)

injectCssdangerouslySetInnerHTML を使用する場合に、カスタムノード内の CSS を補完する必要がある場合に、直接 CSS 文字列を渡すことができます。渡された CSS は生成された SVG に追加され、レンダリングがブラウザと大きく異ならないようにします。

警告

dangerouslySetInnerHTMLを使用する場合、任意の内容を注入できるため、エクスポートアルゴリズムが考慮しきれない状況が発生する可能性があり、このため画像のエクスポートに予測できない問題が発生する可能性があります。

実践

以下はdownload関数を包装する例です。ここでstyle + katexはカスタム CSS と katex の必要なスタイルです(詳細はこのリンクを参照してください)。これを出力関数に渡すと、SVG の出力時にスタイルが正しく適用されます。

const download = (type) => {
return async () => {
try {
let blob = null
if (type === 'png') blob = await mind.exportPng(false, style + katex)
else blob = await mind.exportSvg(false, style + katex)
if (!blob) return
const url = URL.createObjectURL(blob)
const a = document.createElement('a')
a.href = url
a.download = 'filename.' + type
a.click()
URL.revokeObjectURL(url)
} catch (e) {
console.error(e)
}
}
}