basb-cli
Version:
Blog as Second Brain!
65 lines (59 loc) • 1.98 kB
HTML
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Echarts Chart Renderer</title>
<style>
#render-target {
width: 720px;
height: 480px;
}
</style>
</head>
<body>
<div id="render-target"></div>
<script type="module">
import mergeObj from "../../../common/mergeObj.js"
globalThis.mergeObj = mergeObj
</script>
<script>
const { ipcRenderer } = require("electron")
const { writeFileSync } = require("node:fs")
const echarts = require("echarts")
ipcRenderer.once("chart-content", async (_, {
chartContent,
renderOptions,
savePath,
}) => {
const targetEl = document.querySelector("#render-target")
try {
const options = new Function(
"let option;"
+ chartContent
+ ";return option"
)()
const finalOptions = mergeObj(renderOptions, options)
finalOptions.animation = false
const chart = echarts.init(targetEl)
chart.setOption(finalOptions)
} catch(err) {
ipcRenderer.send("render-error", err.message)
return
}
// SVG output
// const SVGContent = targetEl.childNodes[0].innerHTML
// writeFileSync(savePath, SVGContent)
// ipcRenderer.send("render-ended")
// PNG output
const canvas = targetEl.querySelector("canvas")
canvas.toBlob(async blob => {
const buffer = await blob.arrayBuffer()
const viewer = new DataView(buffer)
writeFileSync(savePath, viewer)
ipcRenderer.send("render-ended")
})
})
</script>
</body>
</html>