// ==UserScript== // @name 恢复被浏览器错误翻译的文本块 // @namespace https://gist.github.com/imlinhanchao/9b826afbeda6f1d99fa85ca2d62d9648 // @homepage https://github.com/imlinhanchao/script-restore-translate // @version 0.0.5 // @description 经过浏览器翻译的内容,使用快捷键 Ctrl + Alt + R 即可调出选择器,选中的翻译文本块将会被恢复。 // @author Hancel // @include * // @grant none // @license MIT // @supportURL https://github.com/imlinhanchao/script-restore-translate // @downloadURL https://update.greasyfork.icu/scripts/401888/%E6%81%A2%E5%A4%8D%E8%A2%AB%E6%B5%8F%E8%A7%88%E5%99%A8%E9%94%99%E8%AF%AF%E7%BF%BB%E8%AF%91%E7%9A%84%E6%96%87%E6%9C%AC%E5%9D%97.user.js // @updateURL https://update.greasyfork.icu/scripts/401888/%E6%81%A2%E5%A4%8D%E8%A2%AB%E6%B5%8F%E8%A7%88%E5%99%A8%E9%94%99%E8%AF%AF%E7%BF%BB%E8%AF%91%E7%9A%84%E6%96%87%E6%9C%AC%E5%9D%97.meta.js // ==/UserScript== (function() { 'use strict'; window.onload = function() { window.oldbody = document.createElement('div'); setTimeout(() => { window.oldbody.innerHTML = document.body.innerHTML }, 2000); let lastTarget = null; let enable = false; function clickEvent() { enable ? removeSelector() : enableSelector(); enable = !enable; eventBtn.style.backgroundColor = enable ? 'rgba(18, 115, 235, .8)' : 'rgba(100, 100, 100, .8)' } function createBtn() { let eventBtn = document.createElement('div'); eventBtn.innerHTML = ` `; eventBtn.id = '__event_btn'; Object.assign(eventBtn.style, { display: 'none', padding: '10px', backgroundColor: enable ? 'rgba(18, 115, 235, .8)' : 'rgba(100, 100, 100, .8)', position: 'fixed', right: '2em', top: '2em', borderRadius: '50%', height: '60px', width: '60px', boxShadow: '0px 0px 5px rgb(200, 200, 200)', cursor: 'pointer', zIndex: 9999, boxSizing: 'border-box' }); eventBtn.title = 'Ctrl + Alt + D'; eventBtn.onclick = clickEvent; document.body.appendChild(eventBtn); return eventBtn; } let eventBtn = createBtn(); document.addEventListener('keydown', (e) => { if (e.keyCode == 82 && e.ctrlKey && e.altKey) { eventBtn.style.display = eventBtn.style.display == 'none' ? 'inline-block' : 'none' } if (e.keyCode == 68 && e.ctrlKey && e.altKey) { clickEvent(); } if (e.keyCode == 69 && e.ctrlKey && e.altKey) { window.oldbodyEx = document.createElement('div'); window.oldbodyEx.innerHTML = document.body.innerHTML } }) let overfn = (e) => { let target = getNoIgnore(e.target); if (!target) return; target.dataset.oldbackground = target.style.backgroundColor || ''; target.dataset.oldcursor = target.style.cursor || 'default'; target.style.backgroundColor = "rgba(0,0,255,.2)" target.style.cursor = 'pointer' lastTarget = target; }, outfn = (e) => { let target = getNoIgnore(e.target); if (!target) return; target.style.backgroundColor = target.dataset.oldbackground; target.style.cursor = target.dataset.oldcursor }, clickfn = (e) => { let target = getNoIgnore(e.target); if (!target) return; let selector = getSelector(target); let parentEle = target.parentElement; if (target.id) selector = '#' + target.id; else { while(parentEle.nodeName.toLowerCase() != 'body') { selector = (parentEle.id ? '#' + parentEle.id : getSelector(parentEle)) + '>' + selector; if (parentEle.id) break; parentEle = parentEle.parentElement; } let oldbody = window.oldbody if (!oldbody.querySelector(selector) && window.oldbodyEx) oldbody = window.oldbodyEx; if(oldbody.querySelector(selector)) { if (target.dataset.restore == 'yes') { target.innerHTML = oldbody.querySelector(selector).innerHTML; target.dataset.restore = undefined; return; } target.innerHTML = `${oldbody.querySelector(selector).innerHTML}`; Object.assign(document.querySelector(selector + '>code').style, { font: 'inherit', background: 'inherit', border: '0', margin: '0', padding: '0', wordWrap: 'inherit', wordBreak: 'inherit', wordSpacing: 'inherit', direction: 'inherit', color: 'inherit' }); target.dataset.restore = 'yes'; } else { alert("无法找到该标签的未翻译内容,请尝试恢复原文后按 Ctrl + Alt + E。") console.log(selector); } } }; function getNoIgnore(target) { if (target.id == '__event_btn' || target.parentElement.id == '__event_btn') return null; else if(!isIgnore(target)) return target; let parentEle = target.parentElement; let i = 0; while(!isIgnore(parentEle) && i++ < 10) { parentEle = target.parentElement } return parentEle; } function isIgnore(target) { return target.id == '__event_btn' || target.parentElement.id == '__event_btn' || target.nodeName.toLowerCase() == 'code' || target.nodeName.toLowerCase() == 'span' || target.nodeName.toLowerCase() == 'font' || target.nodeName.toLowerCase() == 'sup' || target.nodeName.toLowerCase() == 'sub' || target.nodeName.toLowerCase() == 'b' || target.nodeName.toLowerCase() == 'i' || target.nodeName.toLowerCase() == 'u' || target.nodeName.toLowerCase() == 'strong' || target.nodeName.toLowerCase() == 'big' || target.nodeName.toLowerCase() == 'small' || target.nodeName.indexOf('#') == 0; } function enableSelector() { document.body.addEventListener("mouseover", overfn) document.body.addEventListener("mouseout", outfn) document.body.addEventListener("click", clickfn) } function removeSelector() { document.body.removeEventListener("mouseover", overfn) document.body.removeEventListener("mouseout", outfn) document.body.removeEventListener("click", clickfn) lastTarget.style.backgroundColor = lastTarget.dataset.oldbackground; lastTarget.style.cursor = lastTarget.dataset.oldcursor } function getSelector(ele) { let childs = Array.from(ele.parentElement.childNodes).filter(n => n.nodeName.indexOf('#') < 0); for (let i = 0; i < ele.parentElement.childElementCount; i++) { if(childs[i] == ele) { return `*:nth-child(${i + 1})`; } } return ele.nodeName.toLowerCase(); } } })();