ニコニコ大百科掲示板NG機能。IDを入力して設定を押せばNGできます。
// ==UserScript== // @name ニコニコ大百科掲示板NG機能 // @namespace yakisoft // @include /^https?:\/\/dic\.nico(moba|video)\.jp\/[a-z]\/.*$/ // @version 1.11.0 // @grant none // @run-at document-start // @description ニコニコ大百科掲示板NG機能。IDを入力して設定を押せばNGできます。 // ==/UserScript== const url = window.location.href; function hide(e, c, r){ if(e===undefined) return; const key = c+"_cache"; if(r!==undefined){ if(e[c]!=r){ e[key]=e[c]; e[c]=r; } } else{ if(e[key]!==undefined){ e[c]=e[key]; e[key]=undefined; } } } function getNGdiv(engine){ const div = document.createElement("div"); const NGList = document.createElement("textarea"); const NGButton = document.createElement("button"); NGList.name = "NGList"; NGList.cols = "40"; NGList.rows = "10"; if(typeof(Storage) !== "undefined"){ if(localStorage.nicodicNG){ NGList.value = localStorage.getItem('nicodicNG'); } } NGList.addNGID=function(id){ NGList.value+="\n"+id; while(NGList.value.indexOf("\n\n")!=-1) NGList.value=NGList.value.replace("\n\n", "\n"); localStorage.setItem('nicodicNG', NGList.value); }; NGList.removeNGID=function(id){ NGList.value=NGList.value.replace(id, ""); while(NGList.value.indexOf("\n\n")!=-1) NGList.value=NGList.value.replace("\n\n", "\n"); localStorage.setItem('nicodicNG', NGList.value); }; NGButton.name = "NGButton"; NGButton.textContent = "NG設定"; NGButton.style = "width:75px; height:25px"; NGButton.onclick=function(){ localStorage.setItem('nicodicNG', NGList.value); engine.doNG(NGList); }; div.appendChild(NGList); div.appendChild(NGButton); div.NGList=NGList; return div; } //PC or nicomoba class NGPC{ constructor(){ const NGdiv = getNGdiv(this); this.NGdiv = NGdiv; if(url.indexOf("nicomoba")===-1){//PC const div = document.getElementById("main"); div.appendChild(NGdiv); this.addNGButton(NGdiv.NGList); } else{//nicomoba const div = document.querySelectorAll("[id='bottom']")[1]; div.parentNode.insertBefore(NGdiv, div); this.addNGButton(NGdiv.NGList); } } doNGImpl(dl, ngList){ const resList = []; //st-bbs_reshead //st-bbs_resbody //res_reaction for(let child of dl.children){ if(child.tagName=="DT") resList.push({}); resList[resList.length-1][child.className.split("_")[1]] = child; } for(const res of resList){ const name = res.reshead.childNodes[5]; const resinfo = res.reshead.childNodes[9]; const date = resinfo.children[0]; const id = resinfo.children[resinfo.children.length-2]; const text = res.resbody; const reaction = res.reaction; if(ngList.indexOf(id.textContent)!=-1){ hide(name, "textContent", "NGしました"); hide(date, "textContent", "NGしました"); hide(text, "innerHTML", "NGしました"); hide(reaction, "innerHTML", ""); } else{ hide(name, "textContent"); hide(date, "textContent"); hide(text, "innerHTML"); hide(reaction, "innerHTML"); } } }; getBBS(){ return document.getElementsByTagName("dl"); }; getSelectorString(){ return 'dl > dt[class=st-bbs_reshead]'; }; doNG(){ console.log("doNG PC or nicomoba"); const ngList=this.NGdiv.NGList.value.split('\n').filter(function(el) {return el.length !== 0;}); const bbs = document.querySelectorAll('div[class=st-bbs-contents] > dl'); for(var dl=0; dl<bbs.length; dl++) this.doNGImpl(bbs[dl], ngList); }; addNGButton(NGList){ const dts=document.querySelectorAll(this.getSelectorString()+ ' > div[class=st-bbs_resInfo]'); const regex=/ID: (.*)/; dts.forEach(function(e){ e.innerHTML=e.innerHTML.replace(regex, "ID: <id title='NGする' style='cursor: pointer;'>$1</id>"); const id=e.querySelectorAll('id')[0]; id.onmouseover = function() { id.style.color="red"; id.style.textDecoration = "underline"; }; id.onmouseleave = function() { id.style.color="grey"; id.style.textDecoration = "none"; }; }); const ids=document.querySelectorAll(this.getSelectorString()+ ' > div > id'); ids.forEach((e)=>{ e.onclick=()=>{ const ID=e.textContent; if(NGList.value.indexOf(ID)==-1){ NGList.addNGID(ID); } else{ NGList.removeNGID(ID); } this.doNG(NGList); e.onmouseleave(); }; }); }; } //mobile class NGMobile{ constructor(){ const NGdiv = getNGdiv(this); this.NGdiv = NGdiv; const div = document.getElementsByClassName("st-Footer_Inner")[0]; div.parentNode.insertBefore(NGdiv, div.nextSibling); NGdiv.NGList.rows = "5"; NGdiv.NGList.cols = "20"; document.getElementsByClassName("st-Footer")[0].style.height="295.9375px"; this.addNGButton(NGdiv.NGList); } doNGImpl(bbs, ngList){ const resList = []; for(let child of bbs.children){ if(child.tagName=="LI" && child.className!="res_reaction") resList.push({ li: child }); else if(child.tagName=="LI") resList[resList.length-1]["reaction"] = child; } for(const res of resList){ const li = res.li; const reaction = res.reaction; const name = li.getElementsByClassName("bbs_name")[0]; const date = li.getElementsByClassName("bbs_resInfo_resTime")[0]; const id = li.querySelector("p[class=at-List_Date] > span > id"); const text = li.getElementsByClassName("at-List_Text")[0]; if(ngList.indexOf(id.textContent)!=-1){ hide(name, "textContent", "NGしました"); hide(date, "textContent", "NGしました"); hide(text, "innerHTML", "NGしました"); hide(reaction, "innerHTML", ""); } else{ hide(name, "textContent"); hide(date, "textContent"); hide(text, "innerHTML"); hide(reaction, "innerHTML"); } } }; getBBS(){ return document.getElementsByClassName("sw-Article_List")[0]; }; doNG(){ console.log("doNG mobile"); const ngList=this.NGdiv.NGList.value.split('\n').filter(function(el) {return el.length !== 0;}); const bbs = this.getBBS(); this.doNGImpl(bbs, ngList); }; addNGButton(NGList){ const dts = document.getElementsByClassName("at-List_Date"); const regex=/ID: (.*)/; dts.forEach(function(e){ e.innerHTML=e.innerHTML.replace(regex, "ID: <id title='NGする' style='cursor: pointer;'>$1</id>"); const id=e.querySelectorAll('id')[0]; id.onmouseover = function() { id.style.color="red"; id.style.textDecoration = "underline"; }; id.onmouseleave = function() { id.style.color="grey"; id.style.textDecoration = "none"; }; }); const ids=document.querySelectorAll('p[class=at-List_Date] > span > id'); ids.forEach((e)=>{ e.onclick=()=>{ const ID=e.textContent; if(NGList.value.indexOf(ID)==-1){ NGList.addNGID(ID); } else{ NGList.removeNGID(ID); } this.doNG(NGList); e.onmouseleave(); }; }); }; } function main(){ const engine = url.indexOf("dic.nicovideo.jp/t")!==-1 ? new NGMobile() : new NGPC(); //autopagerize support document.body.addEventListener('AutoPagerize_DOMNodeInserted',function(evt){ engine.doNG(); }, false); engine.doNG(); }; if(url.indexOf("dic.nicovideo.jp/a")===-1)//notes page { try{ document.getElementsByTagName("html")[0].style.visibility="hidden"; }catch(e){ console.warn(e); } } const greasemonkeyInterval = setInterval(greasemonkey, 100); function greasemonkey(){ if(document.readyState!=="loading"){ clearInterval(greasemonkeyInterval); try{ main(); } finally{ document.getElementsByTagName("html")[0].style.visibility=""; } } }