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