github禁翻译代码和文件名

禁止谷歌翻译页面上的文件名和代码,在F辣条要甜点的基础上修改

// ==UserScript==
// @name         github禁翻译代码和文件名
// @namespace    http://5jianzhan.com
// @author       itldg
// @version      1.0.1
// @description  禁止谷歌翻译页面上的文件名和代码,在F辣条要甜点的基础上修改
// @author       MewoChen
// @include      *://github.com*
// @match        *://github.com*
// @match        *://www.npmjs.com*
// @license        MIT
// ==/UserScript==
/*jshint esversion: 6 */
(function() {
    'use strict';
     const addCodeEle = function (ele) {ele.innerHTML = '<code>' + ele.innerHTML + '</code>'}
     const hasCodeEleChild = 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 TV = document.querySelector('body')

    // 监听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() {
             mo.observe(TV, option)
           }, 50)
         }
         const files = document.querySelectorAll('.file,div[role=rowheader]')
         let pres = document.querySelectorAll('pre,div[itemprop=text]')
         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)})
             }
         }
         if (pres.length > 0) {
             pres.forEach(function(pre){if (!hasCodeEleChild(pre)) addCodeEle(pre)})
         }
         time++
     }
     //const mo = new MutationObserver(_.debounce(doNotTranslateCode, 50))
     const mo = new MutationObserver(_.debounce(doNotTranslateCode, 50))
     mo.observe(TV, option)


    //----------------------------------------------------------------------------------------------------------------------------------------------------
    const markNoTranslate = function () {

      // 代码  议题  拉取请求  操作
        const lists = document.querySelectorAll('ul.list-style-none');
        lists.forEach(function (ul) {
            const items = ul.querySelectorAll('li.d-inline');
            items.forEach(function (li) {
                li.classList.add('notranslate');
            });
        });

      // 文件名
        const elements = document.querySelectorAll('.react-directory-filename-cell');
        elements.forEach(function (element) {
            element.classList.add('notranslate');
        });

    //----------------------------------------------------------------------------------------------------------------------------------------------------
      //
        const elements17 = document.querySelectorAll('.files');
        elements17.forEach(function (element) {
            element.classList.add('notranslate');
        });
      // 标签
        const elements2 = document.querySelectorAll('.topic-tag.topic-tag-link');
        elements2.forEach(function (element) {
            element.classList.add('notranslate');
        });
      // 语言使用情况
        const elements3 = document.querySelectorAll('.color-fg-default.text-bold.mr-1');
        elements3.forEach(function (element) {
            element.classList.add('notranslate');
        });
      // 顶部项目名
        const elements4 = document.querySelectorAll('.AppHeader-context-item-label  ');
        elements4.forEach(function (element) {
            element.classList.add('notranslate');
        });

      // ❌
        const elements6 = document.querySelectorAll('.my-3.d-flex.flex-items-center');
        elements6.forEach(function (element) {
            element.classList.add('notranslate');
        });
      // 右栏仓库大小
        const elements7 = document.querySelectorAll('.Link.Link--muted');
        // const elements7 = document.querySelectorAll('.Link.Link--muted span');
        elements7.forEach(function (element) {
            element.classList.add('notranslate');
        });
      // ❌
        const elements8 = document.querySelectorAll('.Box-row.d-flex.flex-column.flex-md-row');
        elements8.forEach(function (element) {
            element.classList.add('notranslate');
        });
      // 代码  议题  拉取请求  操作
        const elements9 = document.querySelectorAll('.ActionListItem');
        elements9.forEach(function (element) {
            element.classList.add('notranslate');
        });
      //
      // 顶部星数
        const elements14 = document.querySelectorAll('.d-flex.flex-items-center.flex-justify-center.mr-1.gap-1.color-fg-muted');
        elements14.forEach(function (element) {
            element.classList.add('notranslate');
        });
      //
        const elements18 = document.querySelectorAll('#StickyHeader #file-name-id-wide code');
        elements18.forEach(function (element) {
            element.classList.add('notranslate');
        });
      //
        const elements19 = document.querySelectorAll('#StickyHeader a[data-testid="breadcrumbs-repo-link"]');
        elements19.forEach(function (element) {
            element.classList.add('notranslate');
        });
      //
        const elements20 = document.querySelectorAll('#repos-file-tree ul[class*="prc-TreeView-TreeView"] .PRIVATE_TreeView-item-content-text span');
        elements20.forEach(function (element) {
            element.classList.add('notranslate');
        });
      //
        /*const elements21 = document.querySelectorAll('.react-directory-truncate .Link--primary');
        elements21.forEach(function (element) {
            element.classList.add('notranslate');
        });*/
      //
        /*const elements22 = document.querySelectorAll('.react-directory-truncate .Link--primary');
        elements22.forEach(function (element) {
            element.classList.add('notranslate');
        });*/
      //
        /*const elements23 = document.querySelectorAll('.react-directory-truncate .Link--primary');
        elements23.forEach(function (element) {
            element.classList.add('notranslate');
        });*/
      //
        /*const elements24 = document.querySelectorAll('.react-directory-truncate .Link--primary');
        elements24.forEach(function (element) {
            element.classList.add('notranslate');
        });*/
      //
        /*const elements25 = document.querySelectorAll('.react-directory-truncate .Link--primary');
        elements25.forEach(function (element) {
            element.classList.add('notranslate');
        });*/
    };


    // 还可以在页面加载时立即标记已经存在的元素
    setTimeout(function() {
         markNoTranslate();
    },1000);

})()