SHOW:
|
|
- or go back to the newest paste.
| 1 | ////////////////////////////////////////////////////////////////////////// | |
| 2 | // | |
| 3 | //@title おーぷん2ちゃんねるツール | |
| 4 | //@include http://*.open2ch.net | |
| 5 | //@private | |
| 6 | // | |
| 7 | //作った人: Awn(@Awn_tw) | |
| 8 | // | |
| 9 | //改定履歴 | |
| 10 | //-20161021(ver 1.0.0): とりあえず作ってみた。 | |
| 11 | //-20161024(ver 1.1.0): isSurenusiを追加。 | |
| 12 | //-20161025(ver 1.2.0): _getNameを追加。モジュールパターンっぽくしてみた。isSurenusi -> _isSurenusiに変更。 | |
| 13 | //-20161025(ver 1.3.0): _getName -> _getResNameに変更。_getResRawと_getResTimeと_getResIDを追加。 | |
| 14 | //-20161025(ver 1.4.0): _isBrokenと_getValidNumを追加。 | |
| 15 | //-20161025(ver 1.4.1): モジュールパターンではあるが、より正確に言えばリビーリングモジュールパターンっぽい。 | |
| 16 | //-20161025(ver 1.4.2): URLの末尾に半角ハイフンを含む場合も"[全部]のURLに移動します。"のケースに含める。 | |
| 17 | //-20161027(ver 1.4.3): (面倒なので)canonicalなURLで無い時はcanonicalなURLに飛ばす。kari_compの取得方法を変更(splitを減らし正規表現で取得) | |
| 18 | //-20161029(ver 1.5.0): _getValidNumを廃止 -> _gvnに変更。_getDTを追加。jQueryっぽいものをquerySelectorAllやDOM APIに変更。とても速くなった(当社比)。 | |
| 19 | // | |
| 20 | //諸注意 | |
| 21 | //-ご利用は自己責任でお願いします。 | |
| 22 | //-スクリプトは予告なく修正または廃止されることがあります。 | |
| 23 | //-コンソールでしか動かない、と思います。 | |
| 24 | //-悪用は厳禁です。 | |
| 25 | //-改造改良改悪はご自由にどうぞ。 | |
| 26 | // | |
| 27 | ////////////////////////////////////////////////////////////////////////// | |
| 28 | ||
| 29 | var Op2ools = (function(){
| |
| 30 | ||
| 31 | - | var _VERSION = "1.4.3"; |
| 31 | + | |
| 32 | var _VERSION = "1.5.0"; | |
| 33 | var _BBSNAME = ""; | |
| 34 | var _SURETAI = ""; | |
| 35 | var _isInitSuccess = false; | |
| 36 | ||
| 37 | ||
| 38 | /* private initializer */ | |
| 39 | _init(); | |
| 40 | ||
| 41 | ||
| 42 | /* private method */ | |
| 43 | function _init(){
| |
| 44 | /* | |
| 45 | ------------------ | |
| 46 | _init : 初期化メソッド。失敗したらOp2oolsをundefinedにする | |
| 47 | ------------------ | |
| 48 | */ | |
| 49 | var _hostname = location.hostname; | |
| 50 | var _url = location.href; | |
| 51 | var _urlcanonical = document.querySelector("link[rel='canonical']").href;
| |
| 52 | ||
| 53 | //init failure | |
| 54 | if( _hostname.indexOf("open2ch") === -1 ){
| |
| 55 | _failureMessage("このツールはおーぷん2ちゃんねる(http://*.open2ch.net)での動作しか保証しておりません。");
| |
| 56 | return _isInitSuccess; | |
| 57 | - | if( _url !== $("link[rel='canonical']").attr("href") ){
|
| 57 | + | |
| 58 | ||
| 59 | - | location.href = $("link[rel='canonical']").attr("href");
|
| 59 | + | |
| 60 | _failureMessage("特定のスレを開いてください。");
| |
| 61 | return _isInitSuccess; | |
| 62 | } | |
| 63 | ||
| 64 | if( _url !== _urlcanonical ){
| |
| 65 | _failureMessage("[全部]のURLに移動します。\n再度、Op2oolsを実行してください。");
| |
| 66 | location.href = _urlcanonical; | |
| 67 | return _isInitSuccess; | |
| 68 | } | |
| 69 | - | if( _isBroken() ){
|
| 69 | + | |
| 70 | - | console.warn("Op2ools: but this thread is broken..."); }
|
| 70 | + | |
| 71 | - | else{
|
| 71 | + | |
| 72 | - | console.log("Op2ools: and this thread may be not broken!");
|
| 72 | + | |
| 73 | _isInitSuccess = true; | |
| 74 | ||
| 75 | console.log("Op2ools: init success!");
| |
| 76 | return _isInitSuccess; | |
| 77 | } | |
| 78 | ||
| 79 | function _failureMessage(mes){
| |
| 80 | /* | |
| 81 | ------------------ | |
| 82 | _failureMessage : エラーメッセージを書き出したりalertしたりする | |
| 83 | ------------------ | |
| 84 | - | //return ( $("dl.hide:last > dd > ares").attr("num") || $("dl:last > dd > ares").attr("num") ) - 0;
|
| 84 | + | */ |
| 85 | - | return ( $("dl:last > dd > ares").attr("num") ) - 0;
|
| 85 | + | |
| 86 | alert(mes); | |
| 87 | console.log("Op2ools: init failure!");
| |
| 88 | } | |
| 89 | - | num = _getValidNum(num); |
| 89 | + | |
| 90 | - | var rtn = $("dl:eq(" + (num-1) + ") > dd").text().replace(/\n/g,"").replace(/ [0-9]*件/g,"").replace(/>>[0-9]*/g,"");
|
| 90 | + | |
| 91 | - | if( rtn !== "" ){ return rtn; }else{ return undefined; }
|
| 91 | + | /* |
| 92 | ------------------ | |
| 93 | _getLastResNum : 最終レス番号を返す | |
| 94 | - | function _getResRaw(num){
|
| 94 | + | ------------------ |
| 95 | - | num = _getValidNum(num); |
| 95 | + | */ |
| 96 | - | var rtn = $("dl:eq(" + (num-1) + ") > dd").text().replace(/ [0-9]*件/g,"");
|
| 96 | + | var d = document.querySelectorAll("dt");
|
| 97 | - | if( rtn !== ""){ return rtn; }else{ return undefined; }
|
| 97 | + | var dnum = d[d.length-1].getElementsByClassName("num")[0];
|
| 98 | var rtn = dnum !== undefined ? dnum.innerText -0 : d[d.length-2].getElementsByClassName("num")[0].innerText - 0;
| |
| 99 | return rtn; | |
| 100 | } | |
| 101 | - | num = _getValidNum(num); |
| 101 | + | |
| 102 | - | if( num === undefined ){
|
| 102 | + | |
| 103 | - | return undefined; |
| 103 | + | /* |
| 104 | ------------------ | |
| 105 | - | var rtn = ($("dl:eq(" + (num-1) + ")> dt").text().split(":"))[1];
|
| 105 | + | _getRes : レス番号に対応する書き込みメッセージを"改行コード付きで"返す |
| 106 | - | if( rtn !== "" && rtn !== undefined ){ return rtn.substr(rtn.length - 1) === " " ? rtn.substr(0,rtn.length - 1) : rtn ; }else{ return undefined; }
|
| 106 | + | ------------------ |
| 107 | */ | |
| 108 | num = _gvn(num); | |
| 109 | var rtn; | |
| 110 | - | num = _getValidNum(num); |
| 110 | + | if( num !== undefined ){
|
| 111 | - | if( num === undefined ){
|
| 111 | + | rtn = document.querySelectorAll("dd")[num].innerText;
|
| 112 | - | return undefined; |
| 112 | + | return rtn; |
| 113 | }else{
| |
| 114 | - | var rtn = $("dl:eq(" + (num-1) + ")> dt");
|
| 114 | + | return rtn; |
| 115 | - | rtn.length > 0 ? rtn = rtn.text().split(":")[2].split(" ")[0] : undefined
|
| 115 | + | |
| 116 | - | if( rtn !== "" && rtn !== undefined){return rtn; }else{ return undefined; }
|
| 116 | + | |
| 117 | ||
| 118 | function _getResName(num){
| |
| 119 | /* | |
| 120 | - | num = _getValidNum(num); |
| 120 | + | ------------------ |
| 121 | - | if( num === undefined ){
|
| 121 | + | _getResName : レス番号に対応する名前欄を返す |
| 122 | - | return undefined; |
| 122 | + | ------------------ |
| 123 | */ | |
| 124 | - | var rtn = $("dl:eq(" + (num-1) + ")> dt");
|
| 124 | + | num = _gvn(num); |
| 125 | - | rtn.length > 0 ? rtn = rtn.text().split(":")[2].split(" ")[1].split(":")[1] : undefined
|
| 125 | + | var dt; |
| 126 | - | if( rtn !== "" && rtn !== undefined){return rtn; }else{ return undefined; }
|
| 126 | + | var rtn; |
| 127 | if( num !== undefined){
| |
| 128 | dt = _getDT(num); | |
| 129 | rtn = dt.split(":")[1];
| |
| 130 | - | num = _getValidNum(num); |
| 130 | + | rtn = rtn.substr(rtn.length -1) === " " ? rtn.substr(0,rtn.length-1) : rtn; |
| 131 | - | if( $("dl:eq(" + (num-1) + ") > dt > font > font").attr("color") === "red" || $("dl:eq(" + (num-1) + ") > dt > span > font > font").attr("color") === "red" ){ return true }else{ return false };
|
| 131 | + | return rtn; |
| 132 | }else{
| |
| 133 | return rtn; | |
| 134 | - | function _isBroken(){
|
| 134 | + | |
| 135 | - | var lastresnum = _getLastResNum(); |
| 135 | + | |
| 136 | - | if( lastresnum === $("dl").length ){ return false; }else{ return true;}
|
| 136 | + | |
| 137 | function _getResTime(num){
| |
| 138 | /* | |
| 139 | - | function _getValidNum(kari){
|
| 139 | + | ------------------ |
| 140 | - | if( typeof(kari) !== "number" ){
|
| 140 | + | _getResTime : レス番号に対応する書き込み時間を返す |
| 141 | - | return undefined; |
| 141 | + | ------------------ |
| 142 | */ | |
| 143 | - | if( kari > 1006 || kari < 0){
|
| 143 | + | num = _gvn(num); |
| 144 | - | return undefined; |
| 144 | + | var dt; |
| 145 | var rtn; | |
| 146 | - | var kari_comp = 1; |
| 146 | + | if( num !== undefined){
|
| 147 | dt = _getDT(num); | |
| 148 | - | var inc = 1; |
| 148 | + | rtn = dt.split(":")[2].split(" ")[0];
|
| 149 | return rtn; | |
| 150 | }else{
| |
| 151 | - | //try{ kari_comp = ($("dl:eq(" + (kari - 1) + ")> dt").text().split(":"))[0].split("\n")[1].split(" ")[0] - 0 }catch(e){
|
| 151 | + | return rtn; |
| 152 | - | try{ kari_comp = $("dl:eq(" + (kari - 1) + ")> dt").text().split(":")[0].match(/[0-9]+/)[0] - 0 }catch(e){
|
| 152 | + | |
| 153 | - | kari_comp = 1; |
| 153 | + | |
| 154 | ||
| 155 | - | if( kari === kari_comp){
|
| 155 | + | |
| 156 | - | return kari; |
| 156 | + | /* |
| 157 | ------------------ | |
| 158 | - | while(kariBreakFlag){
|
| 158 | + | _getResID : レス番号に対応するIDを返す |
| 159 | - | if( inc % 2 === 0 ){ inc_computed = (-1) * (inc/2); }else{ inc_computed = (inc+1)/2; };
|
| 159 | + | ------------------ |
| 160 | */ | |
| 161 | - | //try{ kari_comp = ($("dl:eq(" + (kari - 1 + inc_computed ) + ")> dt").text().split(":"))[0].split("\n")[1].split(" ")[0] - 0}catch(e){
|
| 161 | + | num = _gvn(num); |
| 162 | - | try{ kari_comp = $("dl:eq(" + (kari - 1 + inc_computed ) + ")> dt").text().split(":")[0].match(/[0-9]+/)[0] - 0 }catch(e){
|
| 162 | + | var dt; |
| 163 | - | kari_comp = 1005; |
| 163 | + | var rtn; |
| 164 | if( num !== undefined){
| |
| 165 | dt = _getDT(num); | |
| 166 | - | if( kari === kari_comp ){
|
| 166 | + | rtn = dt.split(":")[2].split(" ")[1].split(":")[1];
|
| 167 | - | kari = kari + inc_computed; |
| 167 | + | return rtn; |
| 168 | }else{
| |
| 169 | return rtn; | |
| 170 | } | |
| 171 | - | if( inc > 501 ){ kariBreakFlag = false; kari = undefined; return kari; };
|
| 171 | + | |
| 172 | - | inc++; |
| 172 | + | |
| 173 | - | } |
| 173 | + | |
| 174 | - | return kari; |
| 174 | + | /* |
| 175 | ------------------ | |
| 176 | _isSurenusi : スレ主かどうかチェックし、trueかfalseで返す | |
| 177 | ------------------ | |
| 178 | */ | |
| 179 | num = _gvn(num); | |
| 180 | var dt; | |
| 181 | var rtn = false; | |
| 182 | if( num !== undefined ){
| |
| 183 | dt = _getDT(num); | |
| 184 | rtn = dt.split(":")[2].indexOf("主") > -1 ? true : false;
| |
| 185 | return rtn; | |
| 186 | }else{
| |
| 187 | return rtn; | |
| 188 | - | getResRaw : _getResRaw, |
| 188 | + | |
| 189 | } | |
| 190 | ||
| 191 | function _getDT(num){
| |
| 192 | /* | |
| 193 | - | isSurenusi : _isSurenusi, |
| 193 | + | ------------------ |
| 194 | - | isBroken : _isBroken, |
| 194 | + | _getDT : dt[num]のinnerTextを返す |
| 195 | num : _gvn済みのnum | |
| 196 | - | getValidNum : _getValidNum |
| 196 | + | ------------------ |
| 197 | */ | |
| 198 | var rtn = document.querySelectorAll("dt")[num].innerText;
| |
| 199 | return rtn; | |
| 200 | } | |
| 201 | ||
| 202 | function _gvn(kari){
| |
| 203 | /* | |
| 204 | ------------------ | |
| 205 | _gvn : 入力したレス番号が存在するかチェックすると共に補正する関数(_gvnは_getValidNumberの改良版)。該当するレス番号が無い場合はundefinedを返す | |
| 206 | kari : 入力したレス番号 | |
| 207 | ------------------ | |
| 208 | */ | |
| 209 | //変数 | |
| 210 | var rtn; | |
| 211 | var isTypeOK = false; | |
| 212 | var isRangeOK = false; | |
| 213 | var kariBreakFlag = true; | |
| 214 | var inc = 0; | |
| 215 | var inc_computed = 0; | |
| 216 | var d; | |
| 217 | var d_temp; | |
| 218 | ||
| 219 | //形式チェック | |
| 220 | isTypeOK = typeof(kari) === "number" ? true : false; | |
| 221 | isRangeOK = kari > 0 && kari < 1006 ? true : false; | |
| 222 | ||
| 223 | //論理チェック | |
| 224 | if(isTypeOK && isRangeOK){
| |
| 225 | //dtタグのノードリストを取得 | |
| 226 | d = document.querySelectorAll("dt");
| |
| 227 | ||
| 228 | do{
| |
| 229 | inc_computed = inc % 2 === 0 ? (-1) * (inc/2) : (inc+1)/2;//inc_computed := {-0,+1,-1,+2,-2,...}
| |
| 230 | rtn = kari - 1 + inc_computed;//添字の補正 | |
| 231 | d_temp = d[ rtn ];//d[ rtn ] is Object if exists unless undefined | |
| 232 | d_temp = d_temp !== undefined ? d_temp.getElementsByClassName("num")[0] : undefined;
| |
| 233 | d_temp = d_temp !== undefined ? d_temp.innerText - 0 : undefined; | |
| 234 | ||
| 235 | if( d_temp === kari ){
| |
| 236 | kariBreakFlag = false; | |
| 237 | }else{
| |
| 238 | inc++; | |
| 239 | //incが1000を超えていた場合、探索打ち切り | |
| 240 | kariBreakFlag = inc > 1000 ? false : true; | |
| 241 | rtn = inc > 1000 ? undefined : rtn; | |
| 242 | } | |
| 243 | }while(kariBreakFlag); | |
| 244 | return rtn; | |
| 245 | }else{
| |
| 246 | return rtn; | |
| 247 | } | |
| 248 | } | |
| 249 | ||
| 250 | /* public API */ | |
| 251 | if(_isInitSuccess){
| |
| 252 | return{
| |
| 253 | VERSION : _VERSION, | |
| 254 | BBSNAME : _BBSNAME, | |
| 255 | SURETAI : _SURETAI, | |
| 256 | ||
| 257 | getLastResNum : _getLastResNum, | |
| 258 | getRes : _getRes, | |
| 259 | getResName : _getResName, | |
| 260 | getResTime : _getResTime, | |
| 261 | getResID : _getResID, | |
| 262 | ||
| 263 | isSurenusi : _isSurenusi | |
| 264 | }; | |
| 265 | }else{
| |
| 266 | return undefined; | |
| 267 | } | |
| 268 | })(); |