import path from 'path'
import fs from 'fs'
import process from 'process'
import get from 'lodash-es/get.js'
import genID from 'wsemi/src/genID.mjs'
import str2b64 from 'wsemi/src/str2b64.mjs'
import execScript from 'wsemi/src/execScript.mjs'
import fsIsFile from 'wsemi/src/fsIsFile.mjs'
import isestr from 'wsemi/src/isestr.mjs'
import cstr from 'wsemi/src/cstr.mjs'
let fdSrv = path.resolve()
let fnExe = `cvcc.exe`
function isWindows() {
return process.platform === 'win32'
}
function getExecFolder() {
let fdExeSrc = `${fdSrv}/src/`
let fdExeNM = `${fdSrv}/node_modules/w-opencc/src/`
if (fsIsFile(`${fdExeSrc}${fnExe}`)) {
return fdExeSrc
}
else if (fsIsFile(`${fdExeNM}${fnExe}`)) {
return fdExeNM
}
else {
return { error: 'can not find executable file for opencc' }
}
}
function getExecPath(fd) {
return `${fd}${fnExe}`
}
/**
* opencc簡體轉繁體
*
* @param {String} str 輸入簡體中文字串
* @param {Object} [opt={}] 輸入設定物件,預設{}
* @returns {Promise} 回傳Promise,resolve回傳繁體中文字串,reject回傳錯誤訊息
* @example
*
* import WOpencc from 'w-opencc'
*
* async function test() {
*
* let sinp = `OpenCC是中文简繁转换开源项目,支持词汇级别的转换、异体字转换和地区习惯用词转换(中国大陆、台湾、香港、日本新字体)。不提供普通话与粤语的转换。`
* let opt = {}
*
* let r = await WOpencc(sinp, opt)
* console.log(r)
* // => OpenCC是中文簡繁轉換開源項目,支持詞彙級別的轉換、異體字轉換和地區習慣用詞轉換(中國大陸、臺灣、香港、日本新字體)。不提供普通話與粵語的轉換。
*
* }
* test()
* .catch((err) => {
* console.log('catch', err)
* })
*
*/
async function WOpencc(str, opt = {}) {
let errTemp = null
//isWindows
if (!isWindows()) {
return Promise.reject('operating system is not windows')
}
//check
if (!isestr(str)) {
return Promise.reject('str is not a string')
}
//fdExe
let fdExe = getExecFolder()
// console.log('fdExe', fdExe)
//check
if (get(fdExe, 'error')) {
return Promise.reject(fdExe.error)
}
//prog
let prog = getExecPath(fdExe)
// console.log('prog', prog)
//id
let id = genID()
//fpIn
let fpIn = `${fdExe}_${id}_fpIn.txt`
// console.log('fpIn', fpIn)
//fpIn
let fpOut = `${fdExe}_${id}_fpOut.txt`
// console.log('fpOut', fpOut)
//input
// let input = o2j({ inp: str })
let input = str
//save
fs.writeFileSync(fpIn, input, 'utf8')
//inp
let inp = {
fpIn,
fpOut,
opt: {},
}
// console.log('inp', inp)
//input to b64
let cInput = JSON.stringify(inp)
let b64Input = str2b64(cInput)
// console.log('b64Input', b64Input)
//execScript
await execScript(prog, b64Input)
.catch((err) => {
console.log('WOpencc execScript catch', err)
errTemp = err
})
//read output
let j = fs.readFileSync(fpOut, 'utf8')
// console.log('j', j)
//output
// let output = j2o(j)
let output = j
// console.log('output', output)
//unlinkSync
try {
fs.unlinkSync(fpIn)
}
catch (err) {}
//unlinkSync
try {
fs.unlinkSync(fpOut)
}
catch (err) {}
//check
if (errTemp !== null) {
return Promise.reject(errTemp)
}
//check
if (!isestr(output)) {
errTemp = `output[${cstr(output)}] is not a string`
}
//check
if (errTemp !== null) {
return Promise.reject(errTemp)
}
return output
}
export default WOpencc