feat(al): update select aritlce

This commit is contained in:
zyronon
2023-09-21 12:26:33 +08:00
parent 5c1b5cf70e
commit 0c5d08e15f
6 changed files with 377 additions and 289 deletions

View File

@@ -29,7 +29,7 @@ export const EnKeyboardMap: KeyboardMap = {
export function splitEnArticle(text: string, lang: string = 'en', keyboardMap: KeyboardMap = EnKeyboardMap): {
sections: Sentence[][],
text: string
newText: string
} {
let sections: Sentence[][] = []
let section: Sentence[] = []
@@ -41,6 +41,9 @@ export function splitEnArticle(text: string, lang: string = 'en', keyboardMap: K
section.push(sentence)
sections.push(section)
let word = cloneDeep({...DefaultArticleWord, name: '', nextSpace: true});
//去除头和尾部的空格
text = text.trim()
//加\n用于添加最后一段
text += '\n'
text = text.replaceAll(``, '"')
@@ -169,7 +172,7 @@ export function splitEnArticle(text: string, lang: string = 'en', keyboardMap: K
})
})
return {
text,
newText: text,
sections
}
}
@@ -185,6 +188,8 @@ export function splitCNArticle(article: string, lang: string = 'cn', keyboardMap
section.push(sentence)
sections.push(section)
let word = cloneDeep({...DefaultArticleWord, name: '', nextSpace: true});
//去除头和尾部的空格
article = article.trim()
//加\n用于添加最后一段
article += '\n'
// console.log('articles', articles)

View File

@@ -5,48 +5,48 @@ import {getSplitTranslateText, splitEnArticle} from "@/hooks/article.ts";
import {Translator} from "@opentranslate/translator/src/translator.ts";
export function updateLocalSentenceTranslate(article: Article, translate: string) {
if (translate.trim()) {
let articleTranslate = translate.split('\n')
// console.log('articleTranslate', articleTranslate)
let count = 0
for (let i = 0; i < article.sections.length; i++) {
let v = article.sections[i]
for (let j = 0; j < v.length; j++) {
let sentence = v[j]
try {
sentence.translate = articleTranslate[count]
} catch (e) {
console.log('没有对应的翻译', sentence.text)
}
count++
}
count++
if (translate.trim()) {
let articleTranslate = translate.split('\n')
// console.log('articleTranslate', articleTranslate)
let count = 0
for (let i = 0; i < article.sections.length; i++) {
let v = article.sections[i]
for (let j = 0; j < v.length; j++) {
let sentence = v[j]
try {
sentence.translate = articleTranslate[count]
} catch (e) {
console.log('没有对应的翻译', sentence.text)
}
count++
}
count++
}
}
}
export function getSentenceAllTranslateText(article: Article) {
let str = ''
article.sections.map((v: Sentence[]) => {
v.map((w: Sentence, j, arr) => {
if (w.translate) {
str += w.translate + '\n'
}
})
str += '\n'
let str = ''
article.sections.map((v: Sentence[]) => {
v.map((w: Sentence, j, arr) => {
if (w.translate) {
str += w.translate + '\n'
}
})
return str
str += '\n'
})
return str
}
export function getSentenceAllText(article: Article) {
let str = ''
article.sections.map((v: Sentence[]) => {
v.map((w: Sentence, j, arr) => {
str += w.text
})
str += '\n'
let str = ''
article.sections.map((v: Sentence[]) => {
v.map((w: Sentence, j, arr) => {
str += w.text
})
return str
str += '\n'
})
return str
}
/***
@@ -57,162 +57,168 @@ export function getSentenceAllText(article: Article) {
* @param progressCb 进度回调
* */
export async function getNetworkTranslate(
article: Article,
translateEngine: TranslateEngine,
allShow: boolean = false,
progressCb?: (val: number) => void
article: Article,
translateEngine: TranslateEngine,
allShow: boolean = false,
progressCb?: (val: number) => void
) {
if (article.networkTranslate) {
updateLocalSentenceTranslate(article, article.networkTranslate)
} else {
let translator: Translator
if (translateEngine === TranslateEngine.Baidu) {
translator = new Baidu({
axios: axiosInstance as any,
config: {
appid: "20230910001811857",
key: "Xxe_yftQR3K3Ue43NQMC"
}
}) as any
}
if (translator) {
if (!article.titleTranslate) {
translator.translate(article.title, 'en', 'zh-CN').then(r => {
article.titleTranslate = r.trans.paragraphs[0]
})
}
let promiseList = []
let retryCount = 0
let retryCountMap = new Map()
const translate = async (sentence: Sentence) => {
try {
let r = await translator.translate(sentence.text, 'en', 'zh-CN')
if (r) {
const cb = () => {
sentence.translate = r.trans.paragraphs[0]
if (!allShow) {
//一次显示所有,顺序会乱
article.networkTranslate += sentence.translate + '\n'
}
}
return Promise.resolve(cb)
} else {
return Promise.reject(() => translate(sentence))
}
} catch (e) {
return Promise.reject(() => translate(sentence))
}
}
let total = 0
let index = 0
article.sections.map(v => total += v.length)
for (let i = 0; i < article.sections.length; i++) {
let v = article.sections[i]
for (let j = 0; j < v.length; j++) {
let sentence = v[j]
let promise = translate(sentence)
if (allShow) {
promiseList.push(promise)
} else {
retryCountMap.set(sentence.text, 0)
let errResult: any
let cb = await promise.catch(err => {
errResult = err
})
while (errResult) {
let count = retryCountMap.get(sentence.text)
if (count > 2) break
cb = await errResult().catch(err => {
errResult = err
})
retryCountMap.set(sentence.text, count + 1)
}
if (cb) cb()
index++
if (progressCb) {
progressCb(Math.floor((index / total) * 100))
}
}
}
}
if (promiseList.length) {
let timer = -1
let progress = 0
if (progressCb) {
timer = setInterval(() => {
progress++
if (progress > 90) {
return clearInterval(timer)
}
progressCb(progress)
}, 100)
}
return new Promise(async resolve => {
let cbs = []
do {
if (retryCount > 2) {
return resolve(true)
}
let results = await Promise.allSettled(promiseList)
promiseList = []
results.map(results => {
if (results.status === 'fulfilled') {
cbs.push(results.value)
} else {
promiseList.push(results.reason())
}
})
retryCount++
} while (promiseList.length)
cbs.map(v => v())
article.networkTranslate = getSentenceAllTranslateText(article)
if (progressCb) {
clearInterval(timer)
progress = 100
progressCb(100)
}
resolve(true)
})
} else {
article.networkTranslate = getSentenceAllTranslateText(article)
}
if (article.textNetworkTranslate) {
updateLocalSentenceTranslate(article, article.textNetworkTranslate)
} else {
let translator: Translator
if (translateEngine === TranslateEngine.Baidu) {
translator = new Baidu({
axios: axiosInstance as any,
config: {
appid: "20230910001811857",
key: "Xxe_yftQR3K3Ue43NQMC"
}
}) as any
}
if (translator) {
if (!article.titleTranslate) {
translator.translate(article.title, 'en', 'zh-CN').then(r => {
article.titleTranslate = r.trans.paragraphs[0]
})
}
let promiseList = []
let retryCount = 0
let retryCountMap = new Map()
const translate = async (sentence: Sentence) => {
try {
let r = await translator.translate(sentence.text, 'en', 'zh-CN')
if (r) {
const cb = () => {
sentence.translate = r.trans.paragraphs[0]
if (!allShow) {
//一次显示所有,顺序会乱
article.textNetworkTranslate += sentence.translate + '\n'
}
}
return Promise.resolve(cb)
} else {
return Promise.reject(() => translate(sentence))
}
} catch (e) {
return Promise.reject(() => translate(sentence))
}
}
let total = 0
let index = 0
article.sections.map(v => total += v.length)
for (let i = 0; i < article.sections.length; i++) {
let v = article.sections[i]
for (let j = 0; j < v.length; j++) {
let sentence = v[j]
let promise = translate(sentence)
if (allShow) {
promiseList.push(promise)
} else {
retryCountMap.set(sentence.text, 0)
let errResult: any
let cb = await promise.catch(err => {
errResult = err
})
while (errResult) {
let count = retryCountMap.get(sentence.text)
if (count > 2) break
cb = await errResult().catch(err => {
errResult = err
})
retryCountMap.set(sentence.text, count + 1)
}
if (cb) cb()
index++
if (progressCb) {
progressCb(Math.floor((index / total) * 100))
}
}
}
}
if (promiseList.length) {
let timer = -1
let progress = 0
if (progressCb) {
timer = setInterval(() => {
progress++
if (progress > 90) {
return clearInterval(timer)
}
progressCb(progress)
}, 100)
}
return new Promise(async resolve => {
let cbs = []
do {
if (retryCount > 2) {
return resolve(true)
}
let results = await Promise.allSettled(promiseList)
promiseList = []
results.map(results => {
if (results.status === 'fulfilled') {
cbs.push(results.value)
} else {
promiseList.push(results.reason())
}
})
retryCount++
} while (promiseList.length)
cbs.map(v => v())
article.textNetworkTranslate = getSentenceAllTranslateText(article)
if (progressCb) {
clearInterval(timer)
progress = 100
progressCb(100)
}
resolve(true)
})
} else {
article.textNetworkTranslate = getSentenceAllTranslateText(article)
}
}
}
}
export function updateSections(article: Article) {
let {newText, sections} = splitEnArticle(article.text)
article.text = newText
article.sections = sections
}
export function test(article: Article) {
if (article?.translateSplit) {
if (!article.sections?.length) {
if (article?.textCustomTranslateIsFormat) {
if (!article.sections?.length) {
}
} else {
if (article.translateType !== undefined) {
if (article.translateType) {
updateLocalSentenceTranslate(article, article.customTranslate)
} else {
updateLocalSentenceTranslate(article, article.networkTranslate)
}
} else {
// article.sections = splitEnArticle(article.article)
if (article.customTranslate) {
article.customTranslate = getSplitTranslateText(article.customTranslate)
updateLocalSentenceTranslate(article, article.customTranslate)
article.translateType = TranslateType.custom
} else {
article.networkTranslate = getSplitTranslateText(article.networkTranslate)
updateLocalSentenceTranslate(article, article.customTranslate)
article.translateType = TranslateType.network
}
}
}
} else {
if (article.useTranslateType !== undefined) {
if (article.useTranslateType) {
updateLocalSentenceTranslate(article, article.textCustomTranslate)
} else {
updateLocalSentenceTranslate(article, article.textNetworkTranslate)
}
} else {
// article.sections = splitEnArticle(article.article)
if (article.textCustomTranslate) {
article.textCustomTranslate = getSplitTranslateText(article.textCustomTranslate)
updateLocalSentenceTranslate(article, article.textCustomTranslate)
article.useTranslateType = TranslateType.custom
} else {
article.textNetworkTranslate = getSplitTranslateText(article.textNetworkTranslate)
updateLocalSentenceTranslate(article, article.textCustomTranslate)
article.useTranslateType = TranslateType.network
}
}
}
}