Last active
October 29, 2016 15:37
-
-
Save awn-git/18dc001485e87d552ae724c9c44e2589 to your computer and use it in GitHub Desktop.
おーぷん2ちゃんねるのスレで動くコンソールツール
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
////////////////////////////////////////////////////////////////////////// | |
// | |
//@title Op2ools.js | |
//@description おーぷん2ちゃんねるのスレで動くコンソールツール | |
//@include http://*.open2ch.net | |
//@private | |
// | |
//作った人: Awn(@Awn_tw) | |
// | |
//改定履歴 | |
//-20161021(ver 1.0.0): とりあえず作ってみた。 | |
//-20161024(ver 1.1.0): isSurenusiを追加。 | |
//-20161025(ver 1.2.0): _getNameを追加。モジュールパターンっぽくしてみた。isSurenusi -> _isSurenusiに変更。 | |
//-20161025(ver 1.3.0): _getName -> _getResNameに変更。_getResRawと_getResTimeと_getResIDを追加。 | |
//-20161025(ver 1.4.0): _isBrokenと_getValidNumを追加。 | |
//-20161025(ver 1.4.1): モジュールパターンではあるが、より正確に言えばリビーリングモジュールパターンっぽい。 | |
//-20161025(ver 1.4.2): URLの末尾に半角ハイフンを含む場合も"[全部]のURLに移動します。"のケースに含める。 | |
//-20161027(ver 1.4.3): (面倒なので)canonicalなURLで無い時はcanonicalなURLに飛ばす。kari_compの取得方法を変更(splitを減らし正規表現で取得) | |
//-20161029(ver 1.5.0): _getValidNumを廃止 -> _gvnに変更。_getDTを追加。jQueryっぽいものをquerySelectorAllやDOM APIに変更。とても速くなった(当社比)。 | |
//-20161029(ver 1.5.1): あらかじめ読み込んだdlタグのリストの長さより大きいレス番号が呼び出された場合のみ、dlタグを再度読み込む。ちょっとだけ速くなった(当社比)。 | |
// | |
//諸注意 | |
//-ご利用は自己責任でお願いします。 | |
//-スクリプトは予告なく修正または廃止されることがあります。 | |
//-コンソールでしか動かない、と思います。 | |
//-悪用は厳禁です。 | |
//-改造改良改悪はご自由にどうぞ。 | |
// | |
////////////////////////////////////////////////////////////////////////// | |
var Op2ools = (function(){ | |
/* private member */ | |
var _VERSION = "1.5.1"; | |
var _BBSNAME = ""; | |
var _SURETAI = ""; | |
var _isInitSuccess = false; | |
var _dl_old = { | |
len : 0, | |
dd : [], | |
dt : [] | |
}; | |
/* private initializer */ | |
_init(); | |
/* private method */ | |
function _init(){ | |
/* | |
------------------ | |
_init : 初期化メソッド。失敗したらOp2oolsをundefinedにする | |
------------------ | |
*/ | |
var _hostname = location.hostname; | |
var _url = location.href; | |
var _urlcanonical = document.querySelector("link[rel='canonical']").href; | |
//init failure | |
if( _hostname.indexOf("open2ch") === -1 ){ | |
_failureMessage("このツールはおーぷん2ちゃんねる(http://*.open2ch.net)での動作しか保証しておりません。"); | |
return _isInitSuccess; | |
} | |
if( _url.indexOf("read.cgi") === -1 ){ | |
_failureMessage("特定のスレを開いてください。"); | |
return _isInitSuccess; | |
} | |
if( _url !== _urlcanonical ){ | |
_failureMessage("[全部]のURLに移動します。\n再度、Op2oolsを実行してください。"); | |
location.href = _urlcanonical; | |
return _isInitSuccess; | |
} | |
//init success | |
_BBSNAME = _url.split("/")[5]; | |
_SURETAI = document.title; | |
_isInitSuccess = true; | |
_getDL(); | |
console.log("Op2ools: init success!"); | |
return _isInitSuccess; | |
} | |
function _failureMessage(mes){ | |
/* | |
------------------ | |
_failureMessage : エラーメッセージを書き出したりalertしたりする | |
------------------ | |
*/ | |
console.warn(mes); | |
alert(mes); | |
console.log("Op2ools: init failure!"); | |
} | |
function _getLastResNum(){ | |
/* | |
------------------ | |
_getLastResNum : 最終レス番号を返す | |
------------------ | |
*/ | |
_getDL(); | |
var len = _dl_old["len"]; | |
var dnum = _dl_old["dt"][ len-1 ].getElementsByClassName("num")[0]; | |
var rtn = dnum !== undefined ? dnum.innerText -0 : _dl_old["dt"][ len-2 ].getElementsByClassName("num")[0].innerText - 0; | |
return rtn; | |
} | |
function _getRes(num){ | |
/* | |
------------------ | |
_getRes : レス番号に対応する書き込みメッセージを"改行コード付きで"返す | |
------------------ | |
*/ | |
num = _gvn(num); | |
var rtn; | |
if( num !== undefined ){ | |
rtn = document.querySelectorAll("dd")[num].innerText; | |
return rtn; | |
}else{ | |
return rtn; | |
} | |
} | |
function _getResName(num){ | |
/* | |
------------------ | |
_getResName : レス番号に対応する名前欄を返す | |
------------------ | |
*/ | |
num = _gvn(num); | |
var dt; | |
var rtn; | |
if( num !== undefined){ | |
dt = _getDT(num); | |
rtn = dt.split(":")[1]; | |
rtn = rtn.substr(rtn.length -1) === " " ? rtn.substr(0,rtn.length-1) : rtn; | |
return rtn; | |
}else{ | |
return rtn; | |
} | |
} | |
function _getResTime(num){ | |
/* | |
------------------ | |
_getResTime : レス番号に対応する書き込み時間を返す | |
------------------ | |
*/ | |
num = _gvn(num); | |
var dt; | |
var rtn; | |
if( num !== undefined){ | |
dt = _getDT(num); | |
rtn = dt.split(":")[2].split(" ")[0]; | |
return rtn; | |
}else{ | |
return rtn; | |
} | |
} | |
function _getResID(num){ | |
/* | |
------------------ | |
_getResID : レス番号に対応するIDを返す | |
------------------ | |
*/ | |
num = _gvn(num); | |
var dt; | |
var rtn; | |
if( num !== undefined){ | |
dt = _getDT(num); | |
rtn = dt.split(":")[2].split(" ")[1].split(":")[1]; | |
return rtn; | |
}else{ | |
return rtn; | |
} | |
} | |
function _isSurenusi(num){ | |
/* | |
------------------ | |
_isSurenusi : スレ主かどうかチェックし、trueかfalseで返す | |
------------------ | |
*/ | |
num = _gvn(num); | |
var dt; | |
var rtn = false; | |
if( num !== undefined ){ | |
dt = _getDT(num); | |
rtn = dt.split(":")[2].indexOf("主") > -1 ? true : false; | |
return rtn; | |
}else{ | |
return rtn; | |
} | |
} | |
function _getDT(num){ | |
/* | |
------------------ | |
_getDT : _dl_old["dt"]のinnerTextを返す | |
num : _gvn済みのnum | |
------------------ | |
*/ | |
var rtn = _dl_old["dt"][num].innerText; | |
return rtn; | |
} | |
function _gvn(kari){ | |
/* | |
------------------ | |
_gvn : 入力したレス番号が存在するかチェックすると共に補正する関数(_gvnは_getValidNumberの改良版)。 | |
該当するレス番号が無い場合はundefinedを返す | |
kari : 入力したレス番号 | |
------------------ | |
*/ | |
//変数 | |
var rtn; | |
var isTypeOK = false; | |
var isRangeOK = false; | |
var kariBreakFlag = true; | |
var inc = 0; | |
var inc_computed = 0; | |
var d_temp; | |
//形式チェック | |
isTypeOK = typeof(kari) === "number" ? true : false; | |
isRangeOK = kari > 0 && kari < 1006 ? true : false; | |
//論理チェック | |
if(isTypeOK && isRangeOK){ | |
kari < _dl_old["len"] || _getDL();//_getDL()するのは kari >= _dl_old["len"]の時 | |
do{ | |
inc_computed = inc % 2 === 0 ? (-1) * (inc/2) : (inc+1)/2;//inc_computed := {-0,+1,-1,+2,-2,...} | |
rtn = kari - 1 + inc_computed;//添字の補正 | |
d_temp = _dl_old["dt"][ rtn ]; | |
d_temp = d_temp !== undefined ? d_temp.getElementsByClassName("num")[0] : undefined; | |
d_temp = d_temp !== undefined ? d_temp.innerText - 0 : undefined; | |
if( d_temp === kari ){ | |
kariBreakFlag = false; | |
}else{ | |
inc++; | |
//incが1000を超えていた場合、探索打ち切り | |
kariBreakFlag = inc > 1000 ? false : true; | |
rtn = inc > 1000 ? undefined : rtn; | |
} | |
}while(kariBreakFlag); | |
return rtn; | |
}else{ | |
return rtn; | |
} | |
} | |
function _getDL(){ | |
/* | |
------------------ | |
_getDL : document.querySelectorAll("dl")してdd要素とdt要素のリストに分割。_dl_oldに格納する。 | |
関数実行のタイミング: | |
1)_init()時 | |
2) kari >= _dl_old["len"]の時 | |
3)_getLastResNum()する時 | |
------------------ | |
*/ | |
//dl要素のリストを取得 | |
var dl_new = document.querySelectorAll("dl"); | |
var dl_newlen = dl_new.length; | |
//_dl_oldオブジェクトの更新 | |
_dl_old["len"] === 0 || _initDLold();//_dl_oldが初期値ではない場合のみ_initDLold()する | |
_dl_old["len"] = dl_newlen; | |
for(var ix = 0; ix < dl_newlen; ix++){ | |
_dl_old["dd"].push( dl_new[ix].getElementsByTagName("dd")[0] ); | |
_dl_old["dt"].push( dl_new[ix].getElementsByTagName("dt")[0] ); | |
} | |
return; | |
} | |
function _initDLold(){ | |
/* | |
------------------ | |
_initDLold : _dl_oldを初期化する | |
------------------ | |
*/ | |
_dl_old["len"] = 0; | |
_dl_old["dd"] = []; | |
_dl_old["dt"] = []; | |
return; | |
} | |
/* public API */ | |
if(_isInitSuccess){ | |
return{ | |
VERSION : _VERSION, | |
BBSNAME : _BBSNAME, | |
SURETAI : _SURETAI, | |
getLastResNum : _getLastResNum, | |
getRes : _getRes, | |
getResName : _getResName, | |
getResTime : _getResTime, | |
getResID : _getResID, | |
isSurenusi : _isSurenusi | |
}; | |
}else{ | |
return undefined; | |
} | |
})(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment