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 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']
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue