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