S1帖子屏蔽器

利用不同条件屏蔽S1的版块主题

// ==UserScript==
// @name         S1帖子屏蔽器
// @version      1.1.0
// @author       tony0815
// @description  利用不同条件屏蔽S1的版块主题
// @icon         https://static.saraba1st.com/image/smiley/face2017/034.png
// @match        *://bbs.saraba1st.com/2b/*
// @grant        none
// @namespace https://greasyfork.org/users/239832
// ==/UserScript==
'use strict';
/*                 *
 *   简易参数设定   *
 *                 */

/*  总开关,预设为 true ,切换为 false 后脚本将不会执行隐藏帖子功能 */
let switch_global = true;

/*  麻将脸开关,预设为 true ,切换为 false 后会隐藏可以开关该页面隐藏帖子功能的麻将脸 */
let switch_mahjong= true;

/*  更新开关,在最差情况下,脚本会以[鼠标移动]为触发条件不断执行过滤代码,
 *  此行为可能会降低页面流畅度,如果电脑机能较差,觉得不耐烦的话,可以关闭此开关。
 *  预设为 true ,切换为 false 后将不会进行相关操作(则同页面的新帖子将不会被过滤)。
 */
let switch_update = true;

/*  功能开关,用作单独类别的隐藏功能的开关。
 *  如希望完整关闭某一种过滤方法,直接把相关参数由 true 变更为 false 即可。
 *  switch_post_title:帖子标题
 *  switch_post_class:帖子分类
 *  switch_post_id   :帖子发表人(论坛ID)
 *  switch_post_vote :投票类帖子
 */
let switch_post_title = true;
let switch_post_class = true;
let switch_post_id    = true;
let switch_post_vote  = false;

/*  过滤词设定,以字符串数组(String Array)储存。和开关的参数名称类似:
 *  NG_pool_title:帖子标题
 *  NG_pool_class:帖子分类
 *  NG_pool_id   :帖子发表人(论坛ID)
 */
let NG_pool_title = ['阴阳怪气'];
let NG_pool_class = ['PSVita','Wii U'];
let NG_pool_id    = ['冬馬かずさ','小木曽雪菜'];

/*                 *
 *   脚本正文开始   *
 *                 */

function main_process(){
    let count = {"title":0,"class":0,"id":0,"vote":0};

    //主题关键词处理
    if(switch_post_title){

        document.querySelectorAll('#threadlist tbody .s.xst:not(.censored)').forEach(ele => {
            for (let i=0;i<NG_pool_title.length;i++){
                if (ele.innerText.match(NG_pool_title[i])) {
                    count.title++;
                    ele.parentElement.parentElement.parentElement.style.display = 'none';
                    ele.parentElement.parentElement.parentElement.classList.add("主题过滤","censored");
                } else {
                    //console.log(ele.innerText);
                }
            };
            ele.classList.add("censored");
        });

    }

    //分类关键词处理
    if(switch_post_class){

        document.querySelectorAll('#threadlist tbody th em>a:not(.censored),#threadlist tbody td.new em>a:not(.censored),#threadlist tbody th span>a.xg1:not(.censored),#threadlist tbody th.new span>a.xg1:not(.censored)').forEach(ele => {
            for (let i=0;i<NG_pool_class.length;i++){
                if (ele.innerText == NG_pool_class[i]) {
                    count.class++;
                    ele.parentElement.parentElement.parentElement.parentElement.style.display = 'none';
                    ele.parentElement.parentElement.parentElement.parentElement.classList.add("类别过滤","censored");
                } else {
                    //console.log(ele.innerText);
                }
            };
            ele.classList.add("censored");
        });

    }

    //作者关键词处理
    if(switch_post_id){

        document.querySelectorAll('#threadlist tbody').forEach((ele,numofa) => {
            let target = ele.querySelector('td.by cite a:not(.censored)');
            for (let i=0;i<NG_pool_id.length;i++){
                if(target){
                    if(target.innerText == NG_pool_id[i]){
                        target.parentElement.parentElement.parentElement.parentElement.style.display = 'none';
                        target.parentElement.parentElement.parentElement.parentElement.classList.add("作者过滤","censored");
                    }else{
                        //console.log(target);
                    }
                    target.classList.add("censored");
                }
            }
        });

    }

    //投票贴子处理
    if(switch_post_vote){

        document.querySelectorAll('#threadlist tbody td.icn img:not(.censored)').forEach(ele => {
                let img_path = ele.src.split('/');
                if (img_path[img_path.length-1] == "pollsmall.gif") {
                     count.vote++;
                     ele.parentElement.parentElement.parentElement.parentElement.style.display = 'none';
                     ele.parentElement.parentElement.parentElement.parentElement.classList.add("投票过滤","censored");
                } else {
                     //console.log(ele.innerText);
                }
            ele.classList.add("censored");
        });

    }

    //过滤统计
    if(count.title!=0||count.class!=0||count.id!=0||count.vote!=0){
        console.log('本次过滤触发条件次数:主题 - '+count.title+'、类别 - '+count.class+'、作者 - '+count.id+'、投票 - '+count.vote+'');
    }

    //麻将脸换脸
    if(switch_mahjong){
        if(document.querySelector("#threadlist tbody.censored") ){
            document.querySelector("#that_S1_censoring_mahjong").style['background-image'] = "url('https://static.saraba1st.com/image/smiley/face2017/177.png')"
        }else{
            document.querySelector("#that_S1_censoring_mahjong").style['background-image'] = "url('https://static.saraba1st.com/image/smiley/face2017/176.png')"
        }
    }

}
function repair_process(){
    document.querySelectorAll('#threadlist tbody.censored').forEach(ele => {
        ele.style.display = 'table-row-group';
        ele.classList.remove("censored");
    });
    document.querySelectorAll('#threadlist .censored').forEach(ele => {
        ele.classList.remove("censored");
    });
}
function update_page(){
    if(switch_global){
        main_process();
    }
}
function toggleONOFF(){
    if(switch_global){
        switch_global = false;
        repair_process();
        document.querySelector("#that_S1_censoring_mahjong").style['background-image'] = "url('https://static.saraba1st.com/image/smiley/face2017/008.png')";
    }else{
        switch_global = true;
        main_process();
    }
}

//实际运行代码
if(document.getElementById("threadlist")){
    if(switch_mahjong){
        let mahjong = document.createElement("span");
        mahjong.setAttribute("id", "that_S1_censoring_mahjong");
        mahjong.style.cssText = 'border-top: 1px #cdcdcd solid;'
            +'width: 32px;height: 32px;padding: 2px 4px;'
            +'display: inline-block;background-position: center;'
            +'background-repeat: no-repeat;';
        mahjong.style['background-image'] = "url('https://static.saraba1st.com/image/smiley/face2017/"
            +(switch_global?/*(document.querySelector("#threadlist tbody.censored")?"176":*/"177"/*)*/:"008")
            +".png')"
        mahjong.addEventListener("click",toggleONOFF);
        let baseelement = document.getElementById('scrolltop');
        baseelement.insertBefore(mahjong, baseelement.childNodes[baseelement.childNodes.length-2]);
    }
    if(switch_global){
        main_process();
    }
    if(switch_update){
        if("MutationObserver" in window){
            new MutationObserver(update_page).observe(document.querySelector("#threadlist"),{childList:true,subtree: true});
        }else if("MutationEvent" in window){
            document.querySelector("#threadlist").addEventListener("DOMNodeInserted",update_page);
        }else{
            document.addEventListener("mousemove",update_page);
        }
    }
}