anti-twitter-breadvirus

anti #breadvirus

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램을 설치해야 합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==UserScript==
// @name         anti-twitter-breadvirus
// @namespace    https://greasyfork.org/en/scripts/407479-anti-twitter-breadvirus
// @version      0.1.1
// @description  anti #breadvirus
// @author       YeXiaoRain
// @match        https://twitter.com/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';
    const debounce = function(fn, timeout) {
        let timer;
        return function() {
            if (timer) {
                clearTimeout(timer);
            }
            timer = setTimeout(function(){
                fn(arguments);
            }, timeout);
        }
    }
    const dfs = (item,d = 10000) => {
        let anticount = 0;
        if(item.nodeType === 3){ // #Text
            const reg = /扩散性百万(?!甜)(.+)面包/;
            while(reg.test(item.textContent)){
                anticount ++;
                // 为了计数 没有使用 /g
                item.textContent = item.textContent.replace(reg,'$1');
            }
        }else if(d > 0){
            for (let i = 0; i < item.childNodes.length; i++) {
                anticount += dfs(item.childNodes[i],d-1);
            }
        }
        return anticount;
    }
    const work = debounce(()=>{
        console.log('Anti #breadvirus ',dfs(window.document.body));
    },1000);
    const observer = new MutationObserver(()=>{
        setTimeout(work,0);
    });
    const options = {
        childList: true,
        subtree: true
    } ;
    observer.observe(document.body,options);
})();