您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
ニコニコ大百科のBBSの拡張
当前为
// ==UserScript== // @name NicoDicBBSViewer // @description ニコニコ大百科のBBSの拡張 // @namespace http://threeaster.net // @include http://dic.nicovideo.jp/a/* // @include http://dic.nicovideo.jp/b/* // @include http://dic.nicovideo.jp/l/* // @include http://dic.nicovideo.jp/v/* // @include http://dic.nicovideo.jp/i/* // @include http://dic.nicovideo.jp/u/* // @require http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js // @grant GM_getValue // @grant GM_setValue // @version 0.0.1.20140609045517 // ==/UserScript== $.noConflict(); (function($){ var removeUselessLines = function(s){ if(!s){ return; } var lines = s.split("\n"); var storage = {}; for(var i = 0; i < lines.length;){ if(!lines[i] || lines[i] in storage){ lines.splice(i, 1); }else{ storage[lines[i]] = 0; i++; } } return lines.join("\n"); }; var getBBSURLs = function(pager){ var urls = pager.find("a").not(".navi").map(function(){return this.href}).get(); var bbsURLs = []; if(urls.length){ var lastURLParts = urls[urls.length - 1].split("/"); var lastNumber = lastURLParts[lastURLParts.length - 1].replace("-", ""); if(document.URL.indexOf("http://dic.nicovideo.jp/b/") !== -1){ var nowURLParts = document.URL.split("#")[0].split("/"); var nowNumber = nowURLParts[nowURLParts.length - 1].replace("-", ""); lastNumber = (lastNumber - 0 >= nowNumber - 0) ? lastNumber : nowNumber; } lastURLParts.pop(); var basicURL = lastURLParts.join("/") + "/"; for(var i = lastNumber; i > 0; i -= 30){ bbsURLs.unshift(basicURL + i + "-"); } }else{ var url = document.URL; if(url.indexOf("#") !== -1){ url = url.substring(0, url.indexOf("#")); if(url.indexOf("-") === -1){ url = url + "-"; } } bbsURLs.push(url); } return bbsURLs; }; var setContextMenu = function(a){ var dl = a ? a : $("#bbsmain"); dl.find(".ID, .IDMulti, .IDMany").unbind("click").click(function(e){ $(this).parent(".reshead").append($("#contextMenu").css({left : e.pageX, top : e.pageY}).show()); e.stopPropagation(); }); $("html").unbind("click").click(function(){ $("#contextMenu").hide(); }); }; function Res(reshead, resbody){ this.reshead = reshead; var a = this.reshead.find("a").eq(0); //a.attr("id", "r" + a.attr("name")).attr("href", "#" + a.attr("id")); if(GM_getValue("loadAll") && document.URL.indexOf("http://dic.nicovideo.jp/b/") !== -1){ a.html(a.attr("name")); var t = reshead.html(); var before = t.substring(0, t.indexOf("</a>")); var after = t.substring(t.indexOf("</a>")).replace(a.attr("name"), ""); reshead.html(before + after); } this.resbody = resbody; }; Res.prototype.backupRes = function(){ this.trueReshead = this.reshead.clone(true); this.trueResbody = this.resbody.clone(true); } var makeIDDiv = function(a){ var dl = a ? a : $("#bbsmain"); dl.find(".reshead").each(function(){ var s = $(this).html().split(":"); s[s.length - 2] = s[s.length - 2].replace("ID", "<div class='ID'>ID</div>"); $(this).html(s.join(":")); }); }; Res.prototype.makeIDDivReflectingSameID = function(){ var addOrdinalAndTotal = function(res, sameIDRes){ if(GM_getValue("classificationID")){ return "[" + (sameIDRes.indexOf(res) + 1) + "/" + sameIDRes.length + "]" }else{ return ""; } } var sameIDRes = responds.resByID[this.reshead.attr("data-id")]; if(GM_getValue("classificationID")){ var addIDMulti = "IDMulti"; var addIDMany = "IDMany"; }else{ var addIDMulti = "ID"; var addIDMany = "ID"; } if(this.reshead.find(".ID, .IDMulti, .IDMany").size() === 0){ var s = this.reshead.html().split(":"); if(sameIDRes.length == 1){ s[s.length - 2] = s[s.length - 2].replace("ID", "<div class='ID'>ID</div>"); }else if(sameIDRes.length < 5){ s[s.length - 2] = s[s.length - 2].replace("ID", "<div class='" + addIDMulti + "'>ID</div>"); s[s.length - 1] += addOrdinalAndTotal(this, sameIDRes); }else{ s[s.length - 2] = s[s.length - 2].replace("ID", "<div class='" + addIDMany + "'>ID</div>"); s[s.length - 1] += addOrdinalAndTotal(this, sameIDRes); } this.reshead.html(s.join(":")); }else if(this.reshead.find(".ID").size() !== 0){ if(sameIDRes.length == 1){ }else if(sameIDRes.length < 5){ this.reshead.find(".ID, .IDMulti, .IDMany").removeClass("ID IDMulti IDMany").addClass(addIDMulti); var s = this.reshead.html().split(":"); s[s.length - 1] += addOrdinalAndTotal(this, sameIDRes); this.reshead.html(s.join(":")); }else{ this.reshead.find(".ID, .IDMulti, .IDMany").removeClass("ID IDMulti IDMany").addClass(addIDMany); var s = this.reshead.html().split(":"); s[s.length - 1] += addOrdinalAndTotal(this, sameIDRes); this.reshead.html(s.join(":")); } }else{ if(sameIDRes.length < 5){ this.reshead.find(".ID, .IDMulti, .IDMany").removeClass("ID IDMulti IDMany").addClass(addIDMulti); var s = this.reshead.html().split("["); s[s.length - 1] = addOrdinalAndTotal(this, sameIDRes); this.reshead.html(s.join("")); }else{ this.reshead.find(".ID, .IDMulti, .IDMany").removeClass("ID IDMulti IDMany").addClass(addIDMany); var s = this.reshead.html().split("["); s[s.length - 1] = addOrdinalAndTotal(this, sameIDRes); this.reshead.html(s.join("")); } } } Res.prototype.makeNumberDiv = function(){ this.linkedResponds = []; var myNumber = this.reshead.attr("data-number") - 0; for(var i = 0; i < responds.res.length; i++){ var numberAnchorsWrapset = responds.res[i].resbody.find("a.dic"); numberAnchors = []; if(numberAnchorsWrapset.size() !== 0){ numberAnchorsWrapset.each(function(){ numberAnchors.push($(this).html().split(">").join("")); }); }else{ continue; } for(var j = 0; j < numberAnchors.length; j++){ var num = numberAnchors[j]; if(num.indexOf("-") === -1 && myNumber == num){ this.linkedResponds.push(responds.res[i]); break; }else if(num.indexOf("-") !== -1){ num = num.split("-"); if(num[0] <= myNumber && myNumber <= num[1]){ this.linkedResponds.push(responds.res[i]); break; } } } } this.reshead.find("div.Number, div.NumberMulti, div.NumberMany").contents().unwrap(); if(this.linkedResponds.length === 0){ }else if(!GM_getValue("classificationResNumber") || this.linkedResponds.length === 1){ this.reshead.html(this.reshead.html().replace(/a>([0-9]+)/, "a><div class='Number'>$1</div>")); }else if(this.linkedResponds.length <= 3){ this.reshead.html(this.reshead.html().replace(/a>([0-9]+)/, "a><div class='NumberMulti'>$1</div>")); }else{ this.reshead.html(this.reshead.html().replace(/a>([0-9]+)/, "a><div class='NumberMany'>$1</div>")); } } Res.prototype.makeIDTooltip = function(){ var sameIDRes = responds.resByID[this.reshead.attr("data-id")]; var divID = this.reshead.find("div[class^='ID']"); divID.unbind("mouseenter").unbind("mouseleave").hover(function(){ var tooltip = $("<div></div>").click(function(e){e.stopPropagation();}); for(var i = 0; i < sameIDRes.length; i++){ tooltip.append(sameIDRes[i].reshead.clone().find("a").removeAttr("id").end()); tooltip.append(sameIDRes[i].resbody.clone().find("a").removeAttr("id").end()); } divID.append(tooltip); divID.focus(); controlTooltip(tooltip); tooltip.scroll(tooltip.find(".iframe"), function(e){ e.data.each(recover); }); tooltip.find(".iframe").each(recover); }, function(){ divID.find("div").remove(); }); }; Res.prototype.makeNumTooltip = function(){ this.resbody.find("a.dic").filter(function(){return $(this).html().indexOf(">>") !== -1}).each(function(){ var self = $(this); var num = self.html().split(">").join("").split("-"); //self.attr("href", "#r" + num[0]); self.attr("href", "#" + num[0]); self.removeAttr("target"); self.wrap("<span class='numTooltip'></span>").parent().unbind("mouseenter").unbind("mouseleave").hover(function(){ var self = $(this); var tooltip = $("<div></div>"); if(num.length == 1 || !num[1]){ tooltip.append(getResByNumber(num[0]).reshead.clone().find("a").removeAttr("id").end()); tooltip.append(getResByNumber(num[0]).resbody.clone().find("a").removeAttr("id").end()); }else{ for(var i = num[0]; i <= num[1]; i++){ tooltip.append(getResByNumber(i).reshead.clone().find("a").removeAttr("id").end()); tooltip.append(getResByNumber(i).resbody.clone().find("a").removeAttr("id").end()); } } self.append(tooltip); self.focus(); controlTooltip(tooltip); tooltip.scroll(tooltip.find(".iframe"), function(e){ e.data.each(recover); }); tooltip.find(".iframe").each(recover); }, function(){ $(this).find("div").remove(); }); }); }; Res.prototype.makeLinkedNumberTooltip = function(){ var divNumber = this.reshead.find("div[class^='Number']"); var linkedResponds = this.linkedResponds; divNumber.unbind("mouseenter").unbind("mouseleave").hover(function(){ var tooltip = $("<div></div>").click(function(e){e.stopPropagation();}); for(var i = 0; i < linkedResponds.length; i++){ tooltip.append(linkedResponds[i].reshead.clone().find("a").removeAttr("id").end()); tooltip.append(linkedResponds[i].resbody.clone().find("a").removeAttr("id").end()); } divNumber.append(tooltip); divNumber.focus(); controlTooltip(tooltip); tooltip.scroll(tooltip.find(".iframe"), function(e){ e.data.each(recover); }); tooltip.find(".iframe").each(recover); }, function(){ divNumber.find("div").remove(); }); } Res.prototype.makeNumberHandleTooltip = function(){ var nameSpan = this.reshead.find(".name"); var name = nameSpan.html(); var transformedName = name.replace(/[0123456789]/g, function(c){return "0123456789".indexOf(c);}); if(/^[0-9]+$/.test(transformedName)){ nameSpan.wrap("<span class='NumberHandle'></span>").parent().unbind("mouseenter").unbind("mouseleave").hover(function(){ var self = $(this); var tooltip = $("<div></div>"); tooltip.append(getResByNumber(transformedName).reshead.clone().find("a").removeAttr("id").end()); tooltip.append(getResByNumber(transformedName).resbody.clone().find("a").removeAttr("id").end()); self.append(tooltip); self.focus(); controlTooltip(tooltip); tooltip.scroll(tooltip.find(".iframe"), function(e){ e.data.each(recover); }); tooltip.find(".iframe").each(recover); }, function(){ $(this).find("div").remove(); }); } } var getResByNumber = function(number){ for(var i = 0; i < responds.res.length; i++){ if(responds.res[i].reshead.attr("data-number") == number){ return responds.res[i]; } } }; var controlTooltip = function(tooltip){ var a = $("html").scrollTop() + $("#topline").height(); var b = tooltip.offset().top; var c = $(window).height() - $("#topline").height(); var d = tooltip.height(); if(a < b && b < a + c && a < b + d && b + d < a + c){ }else if(d < c){ if(b > a){ tooltip.offset({top : (a + c - d) }); }else{ tooltip.offset({top : a}); } }else{ tooltip.offset({top : a}); tooltip.height(c - $("#topline").height()); } }; var getOtherBBS = function(urls){ var index = 0; parent.find("dl").eq(0).append("<p style='text-align:center'>now loading...<br/>全てのレスを読み込んでいます。レス数によっては、あるいはサーバーの調子によっては数分間かかることもあります。</p>"); var dl = $("<dl></dl>"); function getURL(url){ $.get(url, function(r){ dl.append($(r).find("#bbs").find("dl").unwrap()); index++; if(index < urls.length){ getURL(urls[index]); }else{ parent.find("dl").eq(0).empty(); delayiframe(dl); createRes(dl); createResById(); makeTooltips(); showres(responds.res); setContextMenu(); bindMenu(); for(var i = 0; i < responds.res.length; i++){ responds.res[i].backupRes(); } applyNG(); } }); }; getURL(urls[0]); }; var delayiframe = function(dl){ dl.find("iframe").wrap("<div class='iframe'>"); dl.find(".iframe").each(function(){ $(this).html("<!--" + $(this).html() + "-->"); }); $(window).bind("scroll.iframe", dl.find(".iframe"), function(e){ e.data.each(recover); }); } var createRes = function(dl){ dl.find("dt").each(function(){ var self = $(this); self.attr("data-number", self.find("a").eq(0).attr("name")); self.attr("data-name", self.find("span").text()); var id = self.text().split(":"); id = id[id.length - 1].split("["); id = id[0]; self.attr("data-id", $.trim(id)); }); var resheads = dl.find("dt"); var resbodies = dl.find("dd"); responds.res = new Array(resheads.size()); for(var i = 0; i < resheads.size(); i++){ responds.res[i] = new Res(resheads.eq(i), resbodies.eq(i)); } }; var createResById = function(){ responds.resByID = {}; for(var i = 0; i < responds.res.length; i++){ if(!responds.resByID[$(responds.res[i].reshead).attr("data-id")]){ responds.resByID[$(responds.res[i].reshead).attr("data-id")] = []; } responds.resByID[$(responds.res[i].reshead).attr("data-id")].push(responds.res[i]); } }; var makeTooltips = function(){ for(var i = 0; i < responds.res.length; i++){ responds.res[i].makeIDDivReflectingSameID(); responds.res[i].makeNumberDiv(); if(GM_getValue("showIDTooltip")){ responds.res[i].makeIDTooltip(); } if(GM_getValue("showResAnchorTooltip")){ responds.res[i].makeNumTooltip(); } if(GM_getValue("showResNumberTooltip")){ responds.res[i].makeLinkedNumberTooltip(); } if(GM_getValue("showResHandleTooltip")){ responds.res[i].makeNumberHandleTooltip(); } } }; var bindMenu = function(){ $("#ngidMenu").click(function(){ $("#contextMenu").hide(); if($(this).parents(".reshead").hasClass(".deleted")){ return false; } var id = $(this).parents(".reshead").attr("data-id"); var ngidText = GM_getValue("ngid") + "\n" + id; ngidText = removeUselessLines(ngidText); $("#ngidTextarea").val(ngidText); GM_setValue("ngid", ngidText); initNG(); applyNG(); }); $("#ngnameMenu").click(function(){ $("#contextMenu").hide(); if($(this).parents(".reshead").hasClass(".deleted")){ return false; } var name = $(this).parents(".reshead").attr("data-name"); var ngnameText = GM_getValue("ngname") + "\n" + name; ngnameText = removeUselessLines(ngnameText); $("#ngnameTextarea").val(ngnameText); GM_setValue("ngname", ngnameText); initNG(); applyNG(); }); $("#ngresMenu").click(function(){ $("#contextMenu").hide(); if($(this).parents(".reshead").hasClass(".deleted")){ return false; } var number = $(this).parents(".reshead").attr("data-number"); var URL = document.URL.split("/"); URL.pop(); URL = URL.join("/"); var ngresText = GM_getValue("ngres") + "\n" + URL + ":" + number; ngresText = removeUselessLines(ngresText); $("#ngresTextarea").val(ngresText); GM_setValue("ngres", ngresText); initNG(); applyNG(); }); }; var recover = function(){ var self = $(this); var tooltip = self.parents(".ID>div, .IDMulti>div, .IDMany>div, .numTooltip>div, .Number>div, .NumberMulti>div, .NumberMany>div"); if(tooltip.size() === 0){ var windowhi = $("html").scrollTop(); var windowlow = $("html").scrollTop() + $(window).height(); }else{ var windowhi = tooltip.scrollTop(); var windowlow = tooltip.scrollTop() + tooltip.height(); } var iframehi = self.position().top; var iframelow = self.position().top + self.height(); if(((windowhi < iframehi) && (iframehi < windowlow)) || ((windowhi < iframelow) && (iframelow < windowlow))){ self.html(self.html().replace(/<!--|-->/g, "")); self.replaceWith(self.contents()); } }; var showres = function(responds){ var dl = parent.find("dl"); for(var i = 0; i < responds.length; i++){ dl.append(responds[i].reshead); dl.append(responds[i].resbody); } dl.find(".iframe").each(recover); }; var ajustSideMenu = function(){ if($("html").scrollTop() < $("#bbs, #ng").offset().top){ $("#sidemenu").css({position : "absolute", top : $("#bbs, #ng").offset().top + 100 + "px"}); }else{ $("#sidemenu").css({position : "fixed", top : "100px"}); } }; var getCheckbox = function(id){ console.log(id); return '<input id="' + id + 'Checkbox" type="checkbox" ' + (GM_getValue(id) ? "checked = 'checked'" : "") + '/>'; } var setMenu = function(){ if(GM_getValue("switcherInTopMenu")){ $("#topbarLogoutMenu").after('<li>NicoDicBBSViewer</li><li id="bbsLi" class="selected"><a href="#">掲示板を表示する</a></li><li id="ngLi"><a href="#">設定画面を表示する</a></li>'); }else{ $("body").prepend('<ul id="sidemenu" style="top:100px; float:left; position:fixed; list-style-type:none; padding:0px"><li id="bbsLi" class="selected">掲示板</li><li id="ngLi">設定</li></ul>'); } $("#bbs").after('<div id="ng"><div style="float:left; width:24%"><p>改行で区切ってNGIDを入力or削除してください。</p><textarea id="ngidTextarea" cols="20" rows="10" placeholder="NGIDを改行で区切って入力してください。">' + (nglist.ngidText ? nglist.ngidText : "") + '</textarea></div><div style="float:left; width:24%"><p>改行で区切ってNGNameを入力or削除してください。</p><textarea id="ngnameTextarea" cols="20" rows="10" placeholder="NGNameを改行で区切って入力してください。">' + (nglist.ngnameText ? nglist.ngnameText : "" ) + '</textarea></div><div style="float:left; width:24%"><p>改行で区切ってNGワードを入力or削除してください。</p><textarea id="ngwordTextarea" cols="20" rows="10" placeholder="NGワードを改行で区切って入力してください。">' + (nglist.ngwordText ? nglist.ngwordText : "") + '</textarea></div><div style="float:left; width:24%"><p>改行で区切って(BBSのURL:レス番号)の書式でNGレスを入力or削除してください。</p><textarea id="ngresTextarea" cols="20" rows="10" placeholder="NGレスを(BBSのURL:レス番号)の書式で改行で区切って入力してください。">' + (nglist.ngresText ? nglist.ngresText : "") + '</textarea></div><div style="clear:left;"><form><ul style="list-style-type: none;"><li>' + getCheckbox("autoLoad") + '下までスクロールした時に次のページを読み込む</li><li>NG機能<ul style="list-style-type: none; margin-left:5px;"><li>' + getCheckbox("useNG") + 'NG機能を使用する</li><li>' + getCheckbox("seethroughNG") + 'NGが適用されたレスを表示しない</li></ul></li><li>' + getCheckbox("tooltipOnDicPage") +'記事ページでもID、番号の色分けやツールチップを表示する</li><li>ツールチップ(更新時有効)<ul style="list-style-type: none; margin-left:5px;"><li>' + getCheckbox("showIDTooltip") +'ID(<span style="text-decoration:underline;">ID</span>)ツールチップを表示する</li><li>' + getCheckbox("showResAnchorTooltip") +'レスアンカー(<span style="color: rgb(0, 102, 204);">>>1</span>)ツールチップを表示する</li><li>' + getCheckbox("showResNumberTooltip") + 'レス番(<span style="text-decoration:underline;">1</span>)ツールチップを表示する</li><li>' + getCheckbox("showResHandleTooltip") + 'レス番ハンドル(<span style="color: rgb(0, 136, 0); font-weight: bold;">1</span>)ツールチップを表示する</li></ul></li><li>色分け(更新時有効)<ul style="list-style-type: none; margin-left:5px;"><li>' + getCheckbox("classificationID") + 'IDを色分けし、そのIDのレスの回数を表示する</li><li>' + getCheckbox("classificationResNumber") +'参照されているレス番を色分けする</li></ul></li><ul><li>UI<ul><li>' + getCheckbox("switcherInTopMenu") + '掲示板/設定画面切り替えボタンを上のメニュー内に入れる(更新時有効)</li></ul></li></ul></ul></form><button id="decideNG">保存</button> <button id="cancelNG">キャンセル</button> <button id="backToBbsButton">掲示板に戻る</button></div></div> <ul id="contextMenu"><li id="ngidMenu">NGIDに追加</li><li id="ngnameMenu">NGNameに追加</li><li id="ngresMenu">このレスを削除</li></ul>'); var contents = $("#bbs, #ng"); $(window).scroll(ajustSideMenu); ajustSideMenu(); var backBBS = function(){ if($(".selected").attr("id") === "bbsLi"){ bbsScroll = $("html").scrollTop(); } $(".selected").removeClass("selected"); $("#bbsLi").addClass("selected"); contents.not("#bbs").css("display", "none"); $("#bbs").css("display", "block"); $("html").scrollTop(bbsScroll); return false; }; $("#bbsLi").click(backBBS); $("#backToBbsButton").click(backBBS); $("#ngLi").click(function(){ if($(".selected").attr("id") === "bbsLi"){ bbsScroll = $("html").scrollTop(); } $(".selected").removeClass("selected"); $(this).addClass("selected"); contents.not("#ngid").css("display", "none"); $("#ng").css("display", "block"); $("html").scrollTop($("#ng").offset().top - $("#topline").height()); return false; }); var setcbConfig = function(id){ GM_setValue(id, $("#" + id + "Checkbox").is(":checked")); } var checkcbConfig = function(id){ if(GM_getValue(id)){ $("#" + id + "Checkbox").attr("checked", true); }else{ $("#" + id + "Checkbox").attr("checked", false); } } $("#decideNG").click(function(){ GM_setValue("ngid", $("#ngidTextarea").val()); GM_setValue("ngname", $("#ngnameTextarea").val()); GM_setValue("ngword", $("#ngwordTextarea").val()); GM_setValue("ngres", $("#ngresTextarea").val()); setcbConfig("seethroughNG"); setcbConfig("loadAll"); setcbConfig("autoLoad"); setcbConfig("useNG"); setcbConfig("tooltipOnDicPage"); setcbConfig("showIDTooltip"); setcbConfig("showResAnchorTooltip"); setcbConfig("showResNumberTooltip"); setcbConfig("showResHandleTooltip"); setcbConfig("classificationID"); setcbConfig("classificationResNumber"); setcbConfig("switcherInTopMenu"); initNG(); applyNG(); }); $("#cancelNG").click(function(){ $("#ngidTextarea").val(nglist.ngidText ? nglist.ngidText : ""); $("#ngnameTextarea").val(nglist.ngnameText ? nglist.ngnameText : ""); $("#ngwordTextarea").val(nglist.ngwordText ? nglist.ngwordText : ""); $("#ngresTextarea").val(nglist.ngresText ? nglist.ngresText : ""); checkcbConfig("seethroughNG"); checkcbConfig("loadAll"); checkcbConfig("autoLoad"); checkcbConfig("useNG"); checkcbConfig("tooltipOnDicPage"); checkcbConfig("showIDTooltip"); checkcbConfig("showResAnchorTooltip"); checkcbConfig("showResNumberTooltip"); checkcbConfig("showResHandleTooltip"); checkcbConfig("classificationID"); checkcbConfig("classificationResNumber"); checkcbConfig("switcherInTopMenu"); }); }; var initNG = function(){ nglist.ngidText = removeUselessLines(GM_getValue("ngid")); if(nglist.ngidText){ nglist.ngid = nglist.ngidText.split("\n"); for(var i = 0; i < nglist.ngid.length; i++){ nglist.ngid[i] = $.trim(nglist.ngid[i]); } }else{ nglist.ngid = []; } nglist.ngnameText = removeUselessLines(GM_getValue("ngname")); if(nglist.ngnameText){ nglist.ngname = nglist.ngnameText.split("\n"); for(var i = 0; i < nglist.ngname.length; i++){ nglist.ngname[i] = $.trim(nglist.ngname[i]); } }else{ nglist.ngname = []; } nglist.ngwordText = removeUselessLines(GM_getValue("ngword")); if(nglist.ngwordText){ nglist.ngword = nglist.ngwordText.split("\n"); for(var i = 0; i < nglist.ngword.length; i++){ nglist.ngword[i] = $.trim(nglist.ngword[i]); } }else{ nglist.ngword = []; } nglist.ngresText = removeUselessLines(GM_getValue("ngres")); if(nglist.ngresText){ nglist.ngres = nglist.ngresText.split("\n"); for(var i = 0; i < nglist.ngres.length; i++){ nglist.ngres[i] = $.trim(nglist.ngres[i]); } }else{ nglist.ngres = []; } }; var applyNG = function(){ for(var i = 0; i < responds.res.length; i++){ var r = responds.res[i]; var applied = false; if(GM_getValue("useNG")){ var id = r.trueReshead.attr("data-id"); var name = r.trueReshead.attr("data-name"); for(var j = 0; !applied && j < nglist.ngid.length; j++){ if(nglist.ngid[j] === id){ applied = true; } } for(var j = 0; !applied && j < nglist.ngname.length; j++){ if(name.indexOf(nglist.ngname[j]) !== -1){ applied = true; } } for(var j = 0; !applied && j < nglist.ngword.length; j++){ if(r.trueResbody.text().indexOf(nglist.ngword[j]) !== -1){ applied = true; } } for(var j = 0; !applied && j < nglist.ngres.length; j++){ var ngres = nglist.ngres[j].split(":"); var number = ngres.pop(); var URL = ngres.join(":"); if(document.URL.indexOf(URL) !== -1 && r.reshead.attr("data-number") == number){ applied = true; } } } if(applied){ $("#contextMenu").insertAfter("#ng"); r.reshead.find(".name").html("削除しました"); r.reshead.find(".trip").remove(); r.reshead.addClass("deleted"); r.resbody.html("削除しました").addClass("deleted"); }else if(r.reshead.hasClass("deleted")){ r.reshead.removeClass("deleted").find(".name").html(r.trueReshead.attr("data-name"));//ここで.nameと.tripが一緒になる。.tripを個別に処理する場合は修正すること r.resbody.html("").append(r.trueResbody.clone(true).contents()).removeClass("deleted"); } var css = $("#nicoDicBBSViewerCSS"); if(GM_getValue("seethroughNG")){ if(css.html().indexOf("deleted") === -1){ css.html(css.html() + ".deleted{display:none}"); } }else{ if(css.html().indexOf("deleted") !== -1){ css.html(css.html().replace(".deleted{display:none}", "")); } } } $(window).unbind("scroll.iframe").bind("scroll.iframe", $(".iframe"), function(e){ e.data.each(recover); }); }; var revivalAllRes = function(){ for(var i = 0; i < responds.res.length; i++){ if(responds.res[i].reshead.hasClass("deleted")){ responds.res[i].reshead.removeClass("deleted").find(".name").html(responds.res[i].trueReshead.attr("data-name"));//ここで.nameと.tripが一緒になる。.tripを個別に処理する場合は修正すること responds.res[i].resbody.html("").append(responds.res[i].trueResbody.clone(true).contents()).removeClass("deleted"); } } } function ManagerToReadBbs(urls){ this.bbsUrls = urls; if(document.URL.indexOf("#") === -1){ this.startIndex = urls.indexOf(document.URL); }else{ var mainurl = document.URL.substring(0, document.URL.indexOf("#")); if(mainurl.indexOf("-") === -1){ mainurl = mainurl + "-"; } this.startIndex = urls.indexOf(mainurl); } this.endIndex = this.startIndex; }; var readPreviousBbs = function(){ if(manager.isNowLoading || manager.startIndex <= 0){ return; } manager.isNowLoading = true; manager.startIndex--; $.get(manager.bbsUrls[manager.startIndex], function(r){ prependBbs($(r).find("dl")); }); if(manager.startIndex === 0){ $("#loadPreviousPageLinks").remove(); } $("#bbsmain").prepend("<p id='loading'>now loading...</p>") return false; }; var prependBbs = function(dl){ revivalAllRes(); parent.find("dl").prepend(dl.contents()); createRes(parent.find("dl")); createResById(); makeTooltips(); setContextMenu(); for(var i = 0; i < responds.res.length; i++){ responds.res[i].backupRes(); } applyNG(); $("#loading").remove(); manager.isNowLoading = false; }; var readNextBbs = function(){ if(manager.isNowLoading || manager.endIndex >= manager.bbsUrls.length - 1){ return; } manager.isNowLoading = true; manager.endIndex++; $.get(manager.bbsUrls[manager.endIndex], function(r){ nextBbs($(r).find("dl")); }); if(manager.endIndex === manager.bbsUrls.length - 1){ $("#loadNextPageLinks").remove(); } $("#bbsmain").append("<p id='loading'>now loading...</p>"); return false; }; var nextBbs = function(dl){ revivalAllRes(); parent.find("dl").append(dl.contents()); createRes(parent.find("dl")); createResById(); makeTooltips(); setContextMenu(); for(var i = 0; i < responds.res.length; i++){ responds.res[i].backupRes(); } applyNG(); $("#loading").remove(); manager.isNowLoading = false; }; var initSmallBbs = function(){ createRes(parent.find("dl")); if(document.URL.indexOf("http://dic.nicovideo.jp/b/") !== -1 || GM_getValue("tooltipOnDicPage")){ createResById(); makeTooltips(); }else{ makeIDDiv(); } for(var i = 0; i < responds.res.length; i++){ responds.res[i].backupRes(); } setMenu(); setContextMenu(); bindMenu(); initNG(); applyNG(); }; var initPagerForThirtyBbs = function(){ pager.eq(0).find("a:not(:first), .current, span").remove(); if(manager.startIndex > 0){ pager.eq(0).append("<a id='loadPreviousPageLinks' href='#'>前へ</a>"); pager.find("#loadPreviousPageLinks").click(readPreviousBbs); } pager.eq(1).find("a:not(:first), .current, span").remove(); if(manager.endIndex < manager.bbsUrls.length - 1){ pager.eq(1).append("<a id='loadNextPageLinks' href='#'>次へ</a>"); pager.find("#loadNextPageLinks").click(readNextBbs); } } var initConfig = function(ids){ for(var i = 0; i < ids.length; i++){ if(GM_getValue(ids[i]) === undefined){ GM_setValue(ids[i], true); } } } //以下main //var configIDs = ["useNG", "autoLoad", "tooltipOnDicPage", "showIDTooltip", "showResAnchorTooltip", "showResNumberTooltip", "showResHandleTooltip", "classificationID", "classificationResNumber"]; //initConfig(configIDs); initConfig(["useNG", "autoLoad", "tooltipOnDicPage", "showIDTooltip", "showResAnchorTooltip", "showResNumberTooltip", "showResHandleTooltip", "classificationID", "classificationResNumber"]); /* if(GM_getValue("useNG") === undefined){ GM_setValue("useNG", true); } */ $("link").eq(1).after($("<style id='nicoDicBBSViewerCSS' type='text/css'>.ID{text-decoration:underline; color:black; display:inline;} .IDMulti{text-decoration:underline; color:blue; display:inline;} .IDMany{text-decoration:underline; color:red; display:inline;} .Number{text-decoration: underline; display:inline;} .NumberMulti{text-decoration: underline; display:inline; color:blue;} .NumberMany{text-decoration: underline; display:inline; color:red;} .dic{display:inline;} .ID:hover, .IDMulti:hover, .IDMany:hover, .dic:hover{text-decoration:none;} .ID>div, .IDMulti>div, .IDMany>div, .dic>div, .Number>div, .NumberMulti>div, .NumberMany>div, .NumberHandle>div{display:none;} .ID:hover>div, .IDMulti:hover>div, .IDMany:hover>div, .numTooltip:hover>div, .Number:hover>div, .NumberMulti:hover>div, .NumberMany:hover>div, .NumberHandle:hover>div{color:black; display:inline; position:absolute; background:#f5f5b5; border:solid black 1px; padding;5px; font-size:8pt; overflow:auto; box-shadow:1px 1px; z-index:10000;} div.left-box{border: groove 1px gray; border-radius: 5px; background-image:none;} #ng{display:none;} #topbarRightMenu #bbsLi.selected,#topbarRightMenu #ngLi.selected{display:none;} ul#sidemenu li{border:solid 1px; width:100px;} ul#sidemenu li.selected{color:red;} #contextMenu{background : #d4d0c8;color : #000000;display : none;position : absolute;list-style : none; padding-left : 0px;box-shadow : 1px 1px;}#contextMenu li{padding : 3px;}#contextMenu li:hover{background : #0a246a;color : #ffffff;}</style>")); var parent = $("#bbs"); parent.find("dl").attr("id", "bbsmain"); var bbsScroll = 0; var pager = parent.find(".pager"); var nglist = {};//ngid,ngname,ngresたちのまとめ。 initNG(); var responds = {};//Resオブジェクトの配列"res"、ResオブジェクトのIDによる連想配列"resByID"が格納。 $(".border").remove(); /* if(GM_getValue("loadAll")){ if(document.URL.indexOf("http://dic.nicovideo.jp/b/") === -1){ pager.html("<a href = " + pager.find("a:not(.navi)").eq(0).attr("href") + ">掲示板へ</a>"); initSmallBbs(); }else{ $(document).bind("AutoPagerize_DOMNodeInserted", function(){ $("[class^='autopagerize'] , dl:not(#bbsmain)").remove(); }); var bbsURLs = getBBSURLs(pager.eq(0)); setMenu(); var back = pager.find("a").eq(0); pager.html("").append(back); parent.find("dl").html(""); getOtherBBS(bbsURLs); } }else{*/ if(document.URL.indexOf("http://dic.nicovideo.jp/b/") === -1){ pager.find(".navi").remove(); initSmallBbs(); }else{ var manager = new ManagerToReadBbs(getBBSURLs(pager.eq(0))); $(document).bind("AutoPagerize_DOMNodeInserted", function(){ $("[class^='autopagerize'] , dl:not(#bbsmain) , #autopagerize_message_bar").remove(); }); var reserved = false; setInterval(function(){ if(reserved){ reserved = false; readNextBbs(); } }, 1000); initPagerForThirtyBbs(); initSmallBbs(); $(window).scroll(function(){ if($(".selected").attr("id") === "bbsLi" && GM_getValue("autoLoad") && $("html").scrollTop() + $(window).height() > $("#bbsmain").position().top + $("#bbsmain").height()){ reserved = true; } }); } //} })(jQuery);