// ==UserScript==
// @name 不要翻译github上的代码
// @namespace http://floatsyi.com/
// @version 0.3.8
// @description 避免google网页翻译github和npm站点中的代码
// @author floatsyi
// @license MIT
// @include *://github.com*
// @include *://www.npmjs.com*
// @match *://github.com*
// @match *://www.npmjs.com*
// @downloadURL none
// ==/UserScript==
/* jshint esversion: 6 */
;(function () {
'use strict'
const style = 'font-size: inherit;'
const addCodeEle = function (ele) {
ele.innerHTML = '' + ele.innerHTML + '
'
}
const hasCodeEleChild = function (ele) {
return !!ele.querySelector('code')
}
const addPreEle = function (ele) {
ele.innerHTML = `
${ ele.innerHTML}
`
}
const hasPreEleChild = function (ele) {
return !!ele.querySelector('pre')
}
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 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)
})()