View difference between Paste ID: B6jrkb0i and aZcyeCCN
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
})();