// ==UserScript== // @name COC2 翻译分段修复 // @namespace http://tampermonkey.net/ // @version 2024-10-31 // @description 修复 Google 翻译导致段落合并的问题 // @author LinHQ // @match *://*/* // @grant none // @run-at context-menu // @license AGPLv3 // @downloadURL none // ==/UserScript== (function () { 'use strict'; const target = 'span.mainText' const noTranslate = 'span.listItemQuantity,div.totalCard .value,.sidebarDetailsContainer,.sidebarControlContainer,.keybindDisplay.trayButtonBind,.hotkeyIndicator' new MutationObserver((li, ob) => { try { const patchNodes = li.filter(mu => mu.type === 'childList' && !!mu.addedNodes) .map(mu => Array.from(mu.addedNodes).map(node => { if (node.nodeType === 3) { // #text 节点 return node.parentElement?.matches(target) ? node.parentNode : undefined } // 放下面,因为 #text 没有 querySelectorAll const mainText = node?.querySelectorAll(target) if (mainText.length) { return [...mainText].pop() } return undefined }) ).flat() const noTransNodes = li.filter(mu => mu.type === 'childList' && !!mu.addedNodes) .map(mu => Array.from(mu.addedNodes) .map(node => node.nodeType === 1 ? Array.from(node?.querySelectorAll(noTranslate)) : undefined)) .flat(2) ob.disconnect() noTransNodes.forEach(node => node?.setAttribute('translate', 'no')) patchNodes.forEach(patchNode => { if (!patchNode?.innerHTML) return patchNode.innerHTML = patchNode.innerHTML.replaceAll('\n', '
') }) ob.observe(document.body, { subtree: true, childList: true }) } catch (e) { console.warn('脚本遇到未预料问题', e) } }).observe(document, { subtree: true, childList: true }) })()