Greasy Fork

COC2 翻译分段修复

修复 Google 翻译导致段落合并的问题

目前为 2024-11-02 提交的版本。查看 最新版本

// ==UserScript==
// @name         COC2 翻译分段修复
// @namespace    http://tampermonkey.net/
// @version      2024-10-31
// @description  修复 Google 翻译导致段落合并的问题
// @author       LinHQ
// @match        *://*/*
// @grant        none
// @run-at       context-menu
// @license      AGPLv3
// ==/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', '<br>')
      })
      ob.observe(document.body, {
        subtree: true,
        childList: true
      })
    } catch (e) {
      console.warn('脚本遇到未预料问题', e)
    }
  }).observe(document, {
    subtree: true,
    childList: true
  })
})()