Google result tweaker

Mark & re order spam sites

// ==UserScript==
// @name         Google result tweaker
// @namespace    https://www.topcl.net/myapps/write-a-user-script-to-tweaker-google-result.html
// @version      0.24
// @description  Mark & re order spam sites
// @author       VJ
// @match        https://www.google.com/search?*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    const resultSections=document.querySelectorAll('#rso');
    if(0==resultSections.length){ console.warn("No result found, google has page layout update?"); return; }
    const lastResultSection =resultSections[resultSections.length-1];

    const BlockList=[
        {hostname:"csdn.net",reason:"低质量社区",tobottom:true},
        {hostname:"iteye.com",reason:"低质量社区",tobottom:true},

        {hostname:"softonic.com",reason:"低相关度",tobottom:true},

        {hostname:"logphp.com",reason:"链接站",tobottom:true},

        {hostname:"outofmemory.cn",reason:"采集站",tobottom:true},
        {hostname:"ctolib.com",reason:"采集站",tobottom:true},
        {hostname:"voidcn.com",reason:"采集站",tobottom:true},
        {hostname:"saowen.com",reason:"采集站",tobottom:true},
        {hostname:"bbsmax.com",reason:"采集站",tobottom:true},

        {hostname:"stackoverrun.com",reason:"机翻采集站",tobottom:true},
        {hostname:"stackovernet.com",reason:"机翻采集站",tobottom:true},
        {hostname:"codeday.me",reason:"机翻采集站",tobottom:true},
        {hostname:"landcareweb.com",reason:"机翻采集站",tobottom:true},
        {hostname:"xbuba.com",reason:"机翻采集站",tobottom:true},
        {hostname:"kutu66.com",reason:"机翻采集站",tobottom:true},
        {hostname:"qastack.cn",reason:"机翻采集站",tobottom:true},
        {hostname:"stackoom.com",reason:"机翻采集站",tobottom:true},
        {hostname:"thinbug.com",reason:"机翻采集站",tobottom:true},

        {hostname:"91flac.com",reason:"不解释",tobottom:true},
        {hostname:"wenku.baidu.com",reason:"不解释",tobottom:true},
    ];

    const ExtractHandler=(resultContainer)=>resultContainer.querySelectorAll('div.g');

    const MatchHandler=(result,config)=>{
        const a=result.querySelector('div.rc div.r a');
        return 0 <= a.hostname.indexOf(config.hostname);
    };

    const BlockHandler=(result,config)=>{
        result.style.opacity='.5';
        const summary = result.querySelector('span.st');
        summary.innerHTML=`[${config.reason}]<br />`+summary.innerHTML
        if(config.tobottom){ lastResultSection.appendChild(result); }
    };

    const handledEntries=[];

    for(let c=0; c<resultSections.length; ++c)
    {
        const resultContainer = resultSections[c];
        //TODO: Skip links entry
        const items = ExtractHandler(resultContainer);
        for(let i=0;i<items.length;++i)
        {
            const resultEntry = items[i];
            if(-1!=handledEntries.indexOf(resultEntry)) continue;
            for(let j=0;j<BlockList.length;j++){
                const confEntry=BlockList[j];
                if(MatchHandler(resultEntry,confEntry)){
                    BlockHandler(resultEntry,confEntry);
                    handledEntries.push(resultEntry);
                    --i;
                    break;
                }
            }

        }
    }
})();