goldpankit
Version:
GoldPanKit是一款极速研发套件,可在套件中快速构建各类技术框架和项目。开源作者可发布自己的项目,并为其设定金额,实现开源项目的盈利。
122 lines (117 loc) • 5.12 kB
JavaScript
const serviceConf = require('./service.config')
const serviceFile = require('./service.file')
const fs = require("./utils/fs");
const path = require('path')
const ignore = require("ignore");
class Translator {
constructor() {
}
/**
* 根据翻译器配置翻译代码
* dto = {
* space: '',
* service: '',
* plugin: ''
* }
*/
translate (dto) {
// 获取服务配置
const serviceConfig = serviceConf.getServiceConfig(dto)
if (serviceConfig.translator == null) {
return
}
// 获取翻译器代码
const hasFilepathTranslator = serviceConfig.translator.filepath != null && serviceConfig.translator.filepath.trim() !== ''
const hasContentTranslator = serviceConfig.translator.content != null && serviceConfig.translator.content.trim() !== ''
if (!hasFilepathTranslator && !hasContentTranslator) {
return
}
let filepathTranslateCode = hasFilepathTranslator ? serviceConfig.translator.filepath : ''
let contentTranslateCode = hasContentTranslator ? serviceConfig.translator.content : ''
const targetDirectory = path.join(serviceConfig.codespace, serviceConfig.translator.output)
const files = fs.getFilesWithChildren(serviceConfig.codespace)
// 删除已翻译目录
fs.deleteDirectory(targetDirectory, true)
// 循环文件逐个翻译
for (const absolutePath of files) {
// 目录,直接跳过
if (fs.isDirectory(absolutePath)) {
continue
}
const fileInfo = fs.readFile(absolutePath)
// 服务空间相对路径
let relativePath = fs.getRelativePath(absolutePath, serviceConfig.codespace)
// 翻译路径
let translatedFilepath = relativePath
if (hasFilepathTranslator) {
translatedFilepath = this.#translateFilepath(filepathTranslateCode, relativePath)
}
// 根据翻译路径获取文件设置
const fileSetting = serviceFile.getFileSetting(serviceConfig.codespace, translatedFilepath)
// 修改文件编译器设置为真实编译器
fileSetting.compiler = fileSetting._actualCompiler
delete fileSetting._actualCompiler
// 翻译文件内容
let translatedContent = fileInfo.content
// 文本文件进行翻译
if (fileInfo.encode === 'utf-8') {
if (hasContentTranslator) {
translatedContent = this.#translateContent(contentTranslateCode, relativePath, fileInfo.content, fileSetting)
}
}
// 二进制文件不做翻译,将其转为Buffer对象
else {
translatedContent = Buffer.from(fileInfo.content, 'base64')
}
// 写入翻译文件
fs.createFile(path.join(targetDirectory, translatedFilepath), translatedContent, true)
// 翻译配置路径(用户可能先定义变量再执行翻译,此时需要将配置的path修改为翻译后的path)
// TODO
}
}
// 翻译路径
#translateFilepath (translateCode, filepath) {
// 获取文件名称
const filename = fs.getFilename(filepath)
// 获取文件后缀
let suffix = null
let lastPointIndex = filename.lastIndexOf('.')
if (lastPointIndex !== -1) {
suffix = filename.substring(lastPointIndex)
}
// 文件名为.开头,视为后缀为null
if (filename.lastIndexOf('.') === 0) {
suffix = null
}
const newFilepath = new Function(`return (function ({ filepath, filename, suffix }) {
${translateCode}
})`)()({ filepath, filename, suffix })
if (newFilepath == null || typeof newFilepath !== 'string' || newFilepath.trim() === '') {
throw new Error('文件路径翻译失败,函数返回值必须为一个非空字符串')
}
return newFilepath
}
// 翻译路径
#translateContent (translateCode, filepath, content, fileSetting) {
// 获取文件名称
const filename = fs.getFilename(filepath)
// 获取文件后缀
let suffix = null
let lastPointIndex = filename.lastIndexOf('.')
if (lastPointIndex !== -1) {
suffix = filename.substring(lastPointIndex)
}
// 文件名为.开头,视为后缀为null
if (filename.lastIndexOf('.') === 0) {
suffix = null
}
const newContent = new Function(`return (function ({ filepath, filename, suffix, setting, content }) {
${translateCode}
})`)()({ filepath, filename, suffix, setting: fileSetting, content })
if (newContent == null || typeof newContent !== 'string') {
throw new Error('文件内容翻译失败,函数返回值必须为一个字符串')
}
return newContent
}
}
module.exports = new Translator()