Слияние кода завершено, страница обновится автоматически
window.FO = {};
window.FO.config = {
// 扫描类型
scanType:['div','span','p'],
// 每次翻译的文本最大字符长度
MAX_LENGTH:2000,
// 分隔符
DELIMITER:"!!!",
NODE_TYPE_TEXT:3,
NODE_TYPE_ELEMENT:1,
NODE_TYPE_ATTRIBUTE:2
};
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
window.FO.scan();
window.FO.assemble();
window.FO.translate();
return true;
});
window.FO.nodeList = [];
window.FO.srcTextArray = [];
window.FO.tgtTextArray = [];
/**
* 扫描
*/
window.FO.scan = function () {
let body = document.getElementsByTagName('body')[0];
window.FO.bfs(body);
}
window.FO.bfs = function (elememt) {
let childNodes = elememt.childNodes;
if (childNodes.length===0){
return;
}
for (let i=0;i<childNodes.length;i++){
if (childNodes[i].nodeType===1){
window.FO.bfs(childNodes[i]);
}else if (childNodes[i].nodeType===3) {
childNodes[i].nodeValue = childNodes[i].nodeValue.trim();
if (childNodes[i].nodeValue.length===0) continue;
window.FO.nodeList.push(childNodes[i]);
}
}
}
/**
* 对扫描到的所有Element,取出它们的firstChild.nodeValue.
* 拼装出尽可能打的但不超过最大长度的需要翻译的文本。
* 存在 srcTextArray 中
* 拼装时使用分割符 window.FO.config.DELIMITER
*/
window.FO.assemble = function(){
let temp = [];
let nodeValue ;
for(let i=0;i<window.FO.nodeList.length;i++){
let nodeValue = window.FO.nodeList[i].nodeValue;
// 如果单个Element.firstChild.nodeValue的长度就大于MAX_LENGTH
if (nodeValue.length>window.FO.config.MAX_LENGTH){
// 把之前的给存进去
if (temp.length!==0){ // 考虑第一个元素就超标的情况
window.FO.srcTextArray.push(temp.join(window.FO.config.DELIMITER));
temp = [];
}
window.FO.srcTextArray.push(nodeValue);
continue;
}
temp.push(nodeValue);
if (temp.join("").length>window.FO.config.MAX_LENGTH){
temp.pop();
window.FO.srcTextArray.push(temp.join(window.FO.config.DELIMITER));
temp = [];
i--;
}else if (i===window.FO.nodeList.length-1){
window.FO.srcTextArray.push(temp.join(window.FO.config.DELIMITER));
}
}
}
/**
* 翻译
*/
window.FO.translate = function (){
if (window.FO.srcTextArray.length===0) {
window.FO.replace();
return;
}
let srcText = window.FO.srcTextArray.pop();
//fixme
console.log("翻译:"+srcText);
chrome.runtime.sendMessage({src: srcText},
function(response) {
// 如果没有成功,就再来一次
if (response.trans_result === undefined) {
console.log("failed: "+JSON.stringify(response))
window.FO.srcTextArray.push(srcText);
} else {
let temp = [];
for (let i=0;i<response.trans_result.length;i++){
temp.push(response.trans_result[i].dst);
}
window.FO.tgtTextArray.push(temp.join(""));
console.log("response: " + temp.join(""));
}
window.FO.translate();
}
);
}
/**
* 替换
*/
window.FO.replace = function () {
for(let i=0;i<window.FO.nodeList.length;){
let tgtText = window.FO.tgtTextArray.pop();
if (tgtText===undefined) break;
let array = tgtText.split(window.FO.config.DELIMITER);
if (array.length>1) {
for (let j=0;j<array.length;j++){
window.FO.nodeList[i].nodeValue = array[j];
i++;
}
}else{
window.FO.nodeList[i].nodeValue = tgtText;
i++;
}
}
}
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )