Greasy Fork is available in English.

不要翻译github上的代码

避免google网页翻译github和npm站点中的代码

Version au 21/10/2019. Voir la dernière version.

// ==UserScript==
// @name         不要翻译github上的代码
// @namespace    http://floatsyi.com/
// @version      0.3.9
// @description  避免google网页翻译github和npm站点中的代码
// @author       floatsyi
// @license      MIT
// @include      *://github.com*
// @include      *://www.npmjs.com*
// @match        *://github.com*
// @match        *://www.npmjs.com*
// ==/UserScript==
/* jshint esversion: 6 */
;(function () {
  'use strict'
  const style = 'font-size: inherit;'
  const addCodeEle = function (ele) {
    ele.innerHTML = '<code>' + ele.innerHTML + '</code>'
  }
  const hasCodeEleChild = function (ele) {
    return !!ele.querySelector('code')
  }
  const addPreEle = function (ele) {
    ele.innerHTML = `<pre style= "${style}"><code style="${style}">${ ele.innerHTML}</code></pre>`
  }
  const hasPreEleChild = function (ele) {
    return !!ele.querySelector('code')
  }
  const _ = {}
  _.debounce = function (func, wait) {
    var lastCallTime
    var lastThis
    var lastArgs
    var timerId

    function startTimer (timerExpired, wait) {
      return setTimeout(timerExpired, wait)
    }

    function remainingWait (time) {
      const timeSinceLastCall = time - lastCallTime
      const timeWaiting = wait - timeSinceLastCall
      return timeWaiting
    }

    function shoudInvoking (time) {
      return lastCallTime !== undefined && time - lastCallTime >= wait
    }

    function timerExpired () {
      const time = Date.now()
      if (shoudInvoking(time)) {
        return invokeFunc()
      }
      timerId = startTimer(timerExpired, remainingWait(time))
    }

    function invokeFunc () {
      timerId = undefined
      const args = lastArgs
      const thisArg = lastThis
      let result = func.apply(thisArg, args)
      lastArgs = lastThis = undefined
      return result
    }

    function debounced (...args) {
      let time = Date.now()
      lastThis = this
      lastArgs = args
      lastCallTime = time
      if (timerId === undefined) {
        timerId = startTimer(timerExpired, wait)
      }
    }

    return debounced
  }
  let time = 0
  const githubTV = document.querySelector('body')
  const npmTV = document.querySelector('body')
  const isGitHub =
    window.location.href.search(/github.com/i) !== -1 && !!githubTV
  const isNPM = window.location.href.search(/npmjs.com/i) !== -1 && !!npmTV

  // 监听DOM变更
  const MutationObserver =
    window.MutationObserver ||
    window.WebKitMutationObserver ||
    window.MozMutationObserver
  const option = {
    childList: true,
    subtree: true
  }
  const doNotTranslateCode = function (mutations, observer) {
    if (time >= 20) {
      observer.disconnect()
      observer.takeRecords()
      time = 0
      setTimeout(function () {
        isGitHub && observer.observe(githubTV, option)
        isNPM && observer.observe(npmTV, option)
      }, 50)
    }
   const fileAndDirectory = document.querySelectorAll('.file-wrap .js-navigation-item .js-navigation-open')
   ;[...fileAndDirectory].forEach(item => {
    if (!hasPreEleChild(item)) {
         addPreEle(item)
       }
    })
    const codeContainer = document.querySelector('.js-file-line-container')
    if (!!codeContainer) {
     const main = document.querySelector('main')
     if (main.parentNode.nodeName !== 'CODE') {
       main.parentNode.innerHTML = `<code>${main.parentNode.innerHTML}</code>`
     }
    }
    const files = document.querySelectorAll('.file')
    let pres = document.querySelectorAll('pre')
    let h = []
    ;['1', '2', '3', '4', '5', '6'].forEach(item => {
      if (!document.querySelectorAll(`h${item}`)) return false
      h = [...h, ...document.querySelectorAll(`h${item}`)]
    })
    pres = [...pres, ...h]
    if (files.length > 0) {
      if (window.location.href.search(/.md/i) !== -1) {
        if (pres.length > 0) {
          pres.forEach(function (pre) {
            if (!hasCodeEleChild(pre)) addCodeEle(pre)
          })
        }
      } else {
        files.forEach(function (file) {
          if (!hasCodeEleChild(file)) addCodeEle(file)
        })
      }
    } else if (pres.length > 0) {
      pres.forEach(function (pre) {
        if (!hasCodeEleChild(pre)) addCodeEle(pre)
      })
    }
    time++
    // console.log(time)
  }
  const mo = new MutationObserver(_.debounce(doNotTranslateCode, 50))
  isGitHub && mo.observe(githubTV, option)
  isNPM && mo.observe(npmTV, option)
})()