From a6478b91acb51c3573b2a964ed931545506481be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?hbj=E7=99=BD=E5=A4=9C?= Date: Fri, 15 Sep 2023 21:10:20 +0000 Subject: [PATCH] update lib/renderer/Renderer.js. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: hbj白夜 --- lib/renderer/Renderer.js | 99 ++++++++++++---------------------------- 1 file changed, 28 insertions(+), 71 deletions(-) diff --git a/lib/renderer/Renderer.js b/lib/renderer/Renderer.js index a6dfe14..33c8aa9 100644 --- a/lib/renderer/Renderer.js +++ b/lib/renderer/Renderer.js @@ -1,82 +1,39 @@ -import template from 'art-template' -import chokidar from 'chokidar' -import path from 'node:path' 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 { - /** - * 渲染器 - * @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}`) +let rendererBackends = {} +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 { - this.html[tplFile] = fs.readFileSync(tplFile, 'utf8') - } catch (error) { - logger.error(`加载html错误:${tplFile}`) - return false + rendererCfg = yaml.parse(fs.readFileSync(configFile, 'utf8')) + } catch (e) { + rendererCfg = {} } - - this.watch(tplFile) } - - data.resPath = `./resources/` - - /** 替换模板 */ - let tmpHtml = template.render(this.html[tplFile], data) - - /** 保存模板 */ - fs.writeFileSync(savePath, tmpHtml) - - logger.debug(`[图片生成][使用模板] ${savePath}`) - - return savePath + let renderer = rendererFn(rendererCfg) + if (!renderer.id || !renderer.type || !renderer.render || !lodash.isFunction(renderer.render)) { + logger.warn('渲染后端 ' + (renderer.id || subFolder.name) + ' 不可用') + } + rendererBackends[renderer.id] = renderer + logger.info(`加载渲染后端 ${renderer.id}`) } +} - /** 监听配置文件 */ - watch(tplFile) { - if (this.watcher[tplFile]) return +await registerRendererBackends() - const watcher = chokidar.watch(tplFile) - watcher.on('change', path => { - delete this.html[tplFile] - logger.mark(`[修改html模板] ${tplFile}`) - }) - - this.watcher[tplFile] = watcher +export default { + getRenderer () { + // TODO 渲染器降级 + return rendererBackends[cfg.renderer?.name || 'puppeteer'] } } \ No newline at end of file