渲染器
import type { RasterChartRenderer } from '@tiptap-pro/extension-diagrams'
import { Chart, registerables } from 'chart.js'
Chart.register(...registerables)
export const chartJsRenderer: RasterChartRenderer = {
id: 'chartjs',
label: 'Chart.js',
types: ['bar', 'line', 'pie', 'doughnut'],
mount(target, input) {
const canvas = document.createElement('canvas')
target.replaceChildren(canvas)
const chart = new Chart(canvas, toChartJsConfig(input))
return {
update: (next) => {
const config = toChartJsConfig(next)
chart.data = config.data
chart.options = config.options
chart.update('none')
},
destroy: () => chart.destroy(),
}
},
toImage(input) {
const canvas = document.createElement('canvas')
canvas.width = input.size.width
canvas.height = input.size.height
const chart = new Chart(canvas, { ...toChartJsConfig(input), options: { animation: false } })
return new Promise((resolve, reject) =>
canvas.toBlob((blob) => {
chart.destroy()
blob ? resolve(blob) : reject(new Error('No picture.'))
}, 'image/png'),
)
},
}toChartJsConfig 将图表数据和图表规范转换为 Chart.js 配置,颜色为 input.theme。该演示有完整的演示。
- SVG 文件 保存的是 PNG,而不是形状,并且
export返回raster: true。 - 在
toImage中绘制无动画。还要传递responsive: false和固定的devicePixelRatio,因此 PNG 的大小正是所要求的。 - 服务器没有画布。因此
toImage仅在浏览器中运行,或者使用您自己的画布库运行。