Skip to content

Instantly share code, notes, and snippets.

@awn-git
Last active October 29, 2016 15:37
Show Gist options
  • Save awn-git/18dc001485e87d552ae724c9c44e2589 to your computer and use it in GitHub Desktop.
Save awn-git/18dc001485e87d552ae724c9c44e2589 to your computer and use it in GitHub Desktop.
おーぷん2ちゃんねるのスレで動くコンソールツール
//////////////////////////////////////////////////////////////////////////
//
//@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