update lib/renderer/Renderer.js.
Signed-off-by: hbj白夜 <hei_bai_jun@163.com>
This commit is contained in:
parent
4b5599422f
commit
a6478b91ac
|
@ -1,82 +1,39 @@
|
||||||
import template from 'art-template'
|
|
||||||
import chokidar from 'chokidar'
|
|
||||||
import path from 'node:path'
|
|
||||||
import fs from 'node:fs'
|
import fs from 'node:fs'
|
||||||
|
import yaml from 'yaml'
|
||||||
|
import lodash from 'lodash'
|
||||||
|
import cfg from '../config/config.js'
|
||||||
|
import { Data } from '#miao'
|
||||||
|
|
||||||
export default class Renderer {
|
let rendererBackends = {}
|
||||||
/**
|
|
||||||
* 渲染器
|
|
||||||
* @param data.id 渲染器ID
|
|
||||||
* @param data.type 渲染器类型
|
|
||||||
* @param data.render 渲染器入口
|
|
||||||
*/
|
|
||||||
constructor(data) {
|
|
||||||
/** 渲染器ID */
|
|
||||||
this.id = data.id || 'renderer'
|
|
||||||
/** 渲染器类型 */
|
|
||||||
this.type = data.type || 'image'
|
|
||||||
/** 渲染器入口 */
|
|
||||||
this.render = this[data.render || 'render']
|
|
||||||
this.dir = './temp/html'
|
|
||||||
this.html = {}
|
|
||||||
this.watcher = {}
|
|
||||||
this.createDir(this.dir)
|
|
||||||
}
|
|
||||||
|
|
||||||
/** 创建文件夹 */
|
|
||||||
createDir(dirname) {
|
|
||||||
if (fs.existsSync(dirname)) {
|
|
||||||
return true
|
|
||||||
} else {
|
|
||||||
if (this.createDir(path.dirname(dirname))) {
|
|
||||||
fs.mkdirSync(dirname)
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** 模板 */
|
|
||||||
dealTpl(name, data) {
|
|
||||||
let { tplFile, saveId = name } = data
|
|
||||||
let savePath = `./temp/html/${name}/${saveId}.html`
|
|
||||||
|
|
||||||
/** 读取html模板 */
|
|
||||||
if (!this.html[tplFile]) {
|
|
||||||
this.createDir(`./temp/html/${name}`)
|
|
||||||
|
|
||||||
|
async function registerRendererBackends () {
|
||||||
|
const subFolders = fs.readdirSync(`${process.cwd()}/renderers`, { withFileTypes: true }).filter((dirent) => dirent.isDirectory())
|
||||||
|
for (let subFolder of subFolders) {
|
||||||
|
let name = subFolder.name
|
||||||
|
const rendererFn = await Data.importDefault(`/renderers/${name}/index.js`)
|
||||||
|
let configFile = `./renderers/${name}/config.yaml`
|
||||||
|
let rendererCfg = {}
|
||||||
|
if (fs.existsSync(configFile)) {
|
||||||
try {
|
try {
|
||||||
this.html[tplFile] = fs.readFileSync(tplFile, 'utf8')
|
rendererCfg = yaml.parse(fs.readFileSync(configFile, 'utf8'))
|
||||||
} catch (error) {
|
} catch (e) {
|
||||||
logger.error(`加载html错误:${tplFile}`)
|
rendererCfg = {}
|
||||||
return false
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this.watch(tplFile)
|
|
||||||
}
|
}
|
||||||
|
let renderer = rendererFn(rendererCfg)
|
||||||
data.resPath = `./resources/`
|
if (!renderer.id || !renderer.type || !renderer.render || !lodash.isFunction(renderer.render)) {
|
||||||
|
logger.warn('渲染后端 ' + (renderer.id || subFolder.name) + ' 不可用')
|
||||||
/** 替换模板 */
|
|
||||||
let tmpHtml = template.render(this.html[tplFile], data)
|
|
||||||
|
|
||||||
/** 保存模板 */
|
|
||||||
fs.writeFileSync(savePath, tmpHtml)
|
|
||||||
|
|
||||||
logger.debug(`[图片生成][使用模板] ${savePath}`)
|
|
||||||
|
|
||||||
return savePath
|
|
||||||
}
|
}
|
||||||
|
rendererBackends[renderer.id] = renderer
|
||||||
/** 监听配置文件 */
|
logger.info(`加载渲染后端 ${renderer.id}`)
|
||||||
watch(tplFile) {
|
}
|
||||||
if (this.watcher[tplFile]) return
|
}
|
||||||
|
|
||||||
const watcher = chokidar.watch(tplFile)
|
await registerRendererBackends()
|
||||||
watcher.on('change', path => {
|
|
||||||
delete this.html[tplFile]
|
export default {
|
||||||
logger.mark(`[修改html模板] ${tplFile}`)
|
getRenderer () {
|
||||||
})
|
// TODO 渲染器降级
|
||||||
|
return rendererBackends[cfg.renderer?.name || 'puppeteer']
|
||||||
this.watcher[tplFile] = watcher
|
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue