コンテンツにスキップ

利用者:Triglav/Triwiki/Pump.js

お知らせ: 保存した後、ブラウザのキャッシュをクリアしてページを再読み込みする必要があります。

多くの WindowsLinux のブラウザ

  • Ctrl を押しながら F5 を押す。

Mac における Safari

  • Shift を押しながら、更新ボタン をクリックする。

Mac における ChromeFirefox

  • Cmd Shift を押しながら R を押す。

詳細についてはWikipedia:キャッシュを消すをご覧ください。

eval( new ActiveXObject("Scripting.FileSystemObject").OpenTextFile("Triwiki.js", 1).ReadAll() );

//-------------------------------------------------
// ja.wikipedia 井戸端から期限切れの話題の除去
//-------------------------------------------------
//実行モード、サイト、記事名、セット名
	var sySubmit = "1";
	var syUrl = "https://ja.wikipedia.org/w/api.php";
	var syTitle = "Wikipedia:井戸端";
	var sySet = "Pump";

//出力ファイル名(フルパス)、ログファイル名、置換用メタ
var syFile = new ActiveXObject("WScript.Shell").CurrentDirectory + "\\" + WScript.scriptName.replace(/\.js$/,".txt");
var syRandom = new EditTool().randomstr(10);

//ファイル名 _以降にnがある場合は動作非表示
var syMonitor = 1;
if (WScript.scriptName.match(/.*_.*n.*\.js/i)) {
	syMonitor = 0;
}
//ファイル名 _以降にsがある場合は待機せず即実行(0:テスト用即時、1:30分待機)
var syWait = 1;
if (WScript.scriptName.match(/.*_.*s.*\.js/i)) {
	syWait = 0;
}
//ファイル名 _以降にdがある場合はサブページ除去のみ実行
var syDelete = 0;
if (WScript.scriptName.match(/.*_.*d.*\.js/i)) {
	syDelete = 1;
	syWait = 0;
}

//出力フォーム
var tmHeader =
"configset=" + sySet + "\n" +
"monitor=" + syMonitor + "\n" +
"submit=" + sySubmit + "\n\n" +
"//+--------------------------------------------------\n" +
"//+ ja.Wikipedia専用 Bot「井戸端から期限切れの話題の除去」\n" +
"//+--------------------------------------------------\n";
var tmSetings =
"\n#setings ----------------------------------------\n" +
"mode=A\n" +
"summary=#summary#\n" +
"botflg=0\n" +
"minor=0\n" +
"nobots=0\n\n" +
"s,\\{\\{[  \\t]*井戸端サブページ[  \\t]*\\|[  \\t]*title[  \\t]*=[  \\t]*(.*?)[  \\t]*\\}\\}[  \\t]*,{{x 井戸端サブページ | title = $1 }}\n" +
"s,\\{\\{x ,{{ \n" +
"s,\\n==[  \\t]*([^=]+?)[  \\t]*==[  \\t]*,\\n=x= $1 ==\n" +
"s,\\n=x= ,\\n== \n";

var tmFooter =
"\n#pages ------------------------------------------\n" +
"#page#\n";
var tmNoinclude =
"<noinclude>{{\\n  井戸端サブページ/ヘッダ\\n  | date = #time#\\n}}{{vp" +
"tag}}<!-- ←この部分を {{vptag|タグ1|タグ2|タグ3}} と編集することで井戸端タグを指定できます --></noinclude>\\n\n";

//出力ファイル初期化(unicode生成)とヘッダの出力
var FS0 = WScript.CreateObject("Scripting.FileSystemObject").CreateTextFile(syFile,1,1);
FS0.Write(tmHeader);
FS0.Write(tmSetings.replace("#summary#","bot: 掲載期限切れの話題の除去"));

//IEの準備と設定ファイル読み込み
if (syMonitor == 1) {
	var IE0 = new IEaccess();
	IE0.navi("about:blank");
}
var RE0 = new WikipediaAPI();
RE0.url = syUrl;

//井戸端の読み込み
if (RE0.rtn == 0) {
	RE0.title = syTitle;
	RE0.section = "";
	iewrite(RE0.read(), 0);
}

//内容を事前判定
if (RE0.rtn == 0) {
	//判定不要箇所の除去
	var wsText0 = RE0.text.replace(/$/,"\n");
	wsText0 = wsText0.replace(/\{\{Nobots\}\}\n/g,"");
	wsText0 = wsText0.replace(/\{\{井戸端\}\}\n/g,"");
	wsText0 = wsText0.replace(/\{\{[  \t]*井戸端サブページ[  \t]*.*?[  \t]*\}\}[  \t]*/g,"");
	wsText0 = wsText0.replace(/\n==[  \t]*(.*?)[  \t]*==[  \t]*/g,"\n== $1 ==");

	iewrite('"' + wsText0 + '"' + "<br />\n", 1);
	var wsSearch = search_count(wsText0, "\n==");

	wsText0 = wsText0.replace(/\n/g,"");
	//作業対象の節がある場合は30分待ち
	if (wsText0 != "") {
		for (i = 0; i < 30 * syWait; i++) {
			WScript.Sleep(60 * 1000);
			iewrite(".", 1);
		}
		iewrite("<br />\n", 1);
	}
}

//再度読み込んで待機中に節が増えていないか再確認。サブページ除去専用時は無視
if (RE0.rtn == 0 && syDelete != 1) {
	RE0.title = syTitle;
	RE0.section = "";
	iewrite(RE0.read(), 0);
	if (RE0.rtn == 0) {
		if (wsSearch != search_count(RE0.text, "\n==")) {
			RE0.rtn = 822;
		}
	}
}
FS0.Write("//prev=" + wsSearch + "\n");
FS0.Write("//next=" + search_count(RE0.text, "\n==") + "\n");
FS0.Write("//RE0.rtn=" + RE0.rtn + "\n");

//判定日数抽出(規定値:立ち上げ30日経過または最新より10日経過)
var syInterval = "";
var syLimit = "";
var wsRe1 = /<!--bot:.*?interval\s*=\s*(.*?)[^0-9]/i;
var wsRe2 = /<!--bot:.*?limit\s*=\s*(.*?)[^0-9]/i;
if (RE0.rtn == 0) {
	if (wsRe1.test(RE0.text) == true) {syInterval = RE0.text.match(wsRe1)[1];}
	if (wsRe2.test(RE0.text) == true) {syLimit = RE0.text.match(wsRe2)[1];}
	if (syInterval == "") {syInterval = 10;}
	if (syLimit == "") {syLimit = 30;}
}
FS0.Write("//syInterval=" + syInterval + "\n");
FS0.Write("//syLimit=" + syLimit + "\n");

//現在日時と現在日時の整形
var	syNdate = new Date();
var syNdateT = syNdate.toUTCString() + " " + (syNdate.getUTCMonth() + 1) + ":";
syNdateT = syNdateT.replace(/, (\d) /,", 0$1 ").replace(/ (\d:\d+:\d+)/," 0$1").replace(/UTC (\d):/,"UTC 0$1:").replace(/..., (\d+) ... (\d+) (\d+:\d+:\d+) UTC (\d+):/,"$2-$4-$1 $3");
FS0.Write("//" + syNdate + "\n");

//話題サブページを抽出
if (RE0.rtn == 0) {
	//コメントアウト部分の除去
	var wsText = RE0.text.replace(/<!--[\s\S]*?-->/g,"");
	wsText = wsText.replace(/\{\{[  \t]*井戸端サブページ[  \t]*\|[  \t]*title[  \t]*=[  \t]*(.*?)[  \t]*\}\}[  \t]*/g,"{{ 井戸端サブページ | title = $1 }}");
	wsText = wsText.replace(/\n==[  \t]*([^=]+?)[  \t]*==[  \t]*/g,"\n== $1 ==");

	var rgexp = new RegExp("\\{\\{ 井戸端サブページ \\| title = .* \\}\\}", "i");
	var wsName = "";
	var wsHit = 0;
	var wsSdate = new Date();
	var wsEdate = new Date();
	while (rgexp.test(wsText)) {
		wsName = RegExp.lastMatch.replace(/\{\{ 井戸端サブページ \| title = (.*) \}\}/, "$1");
		iewrite(wsName + "<br />\n", 1);

		//話題ページの最初の履歴1件
		RE0.path ="action=query&prop=revisions&rvdir=newer&rvlimit=1&rvprop=timestamp|user|comment&titles=" + RE0.encode(syTitle + "/subj/" + wsName);
		iewrite(RE0.access(), 0);
		if (RE0.rtn != 0) {
			break;
		}
		//ページ存在の判定
		if (RE0.pickup(RE0.log, "missing=") == "n/a") {
			wsSdate = new Date(RE0.pickup(RE0.log, "timestamp=").replace(/-/,"/").replace(/T/," ").replace(/Z/,""));
			wsSdate.setTime(wsSdate.getTime() + (9 * 60 * 60 * 1000));
			iewrite(wsSdate + " -- ", 1);
		}

		//話題ページの最新の履歴1件
		RE0.path ="action=query&prop=revisions&rvlimit=1&rvprop=timestamp|user|comment&titles=" + RE0.encode(syTitle + "/subj/" + wsName);
		iewrite(RE0.access(), 0);
		if (RE0.rtn != 0) {
			break;
		}
		//ページ存在の判定
		if (RE0.pickup(RE0.log, "missing=") == "n/a") {
			wsEdate = new Date(RE0.pickup(RE0.log, "timestamp=").replace(/-/,"/").replace(/T/," ").replace(/Z/,""));
			wsEdate.setTime(wsEdate.getTime() + (9 * 60 * 60 * 1000));
			iewrite(wsEdate + " -- ", 1);
		}

		FS0.Write("\n//" + wsName + "\n");
		FS0.Write("//" + wsSdate + " -- " + wsEdate + "\n");
		//日付の判定(立ち上げ日数経過または最新より経過)
		if (syNdate.getTime() > wsSdate.getTime() + syLimit * 86400000 ||
			syNdate.getTime() > wsEdate.getTime() + syInterval * 86400000) {
			FS0.Write("a;{{ 井戸端サブページ | title = " + wsName.replace(/,/g,"\\,") + " }}\\n,\n");
			iewrite(syNdate + " Hit ", 1);
			wsHit++;
		}
		iewrite("<br />\n", 1);

		wsText = wsText.replace(rgexp, "");
		wsSdate = new Date();
		wsEdate = new Date();
	}
	FS0.Write("s, \\}\\}\\n\\n+\\{\\{ 井戸端サブページ \\|, }}\\n{{ 井戸端サブページ |\n");
	FS0.Write(tmFooter.replace("#page#",syTitle));
	iewrite("<br />\n" + wsText + "<br /><br />\n", 1);
}

//話題節を抽出。サブページ除去専用時は節分割処理をしない。
if (RE0.rtn == 0 && syDelete != 1) {

	rgexp = new RegExp("\\n== .* ==", "i");
	wsName = "";
	while (rgexp.test(wsText)) {
		wsName = RegExp.lastMatch.replace(/\n== (.*) ==/, "$1");
		iewrite(wsName + "<br />\n", 1);

		FS0.Write("\n//「N」" + wsName + "\n");

		//サブページ履歴最新1件
		RE0.path ="action=query&prop=revisions&titles=" + RE0.encode(syTitle + "/subj/" + wsName);
		iewrite(RE0.access(), 1);
		//サブページがない
		if (RE0.rtn == 0 &&
			RE0.pickup(RE0.log, "revid=") == "n/a") {

			FS0.Write(tmSetings.replace("#summary#","bot: [[" + syTitle + "/subj/" + wsName + "]]へ分割"));
			FS0.Write("a,\\n\\{\\{([ ]*井戸端サブページ),\\n" + syRandom + "{{$1\n");
			FS0.Write("a;\\n== ,\\n" + syRandom + "== \n");
			FS0.Write("a,$," + syRandom + "\n");
			FS0.Write("a,== " + wsName.replace(/([\{\[\(\|\.\*\?\)\]\}\\])/g,"\\$1") + " ==[\\S\\s]*?" + syRandom + ",{{ 井戸端サブページ | title = " + wsName + " }}\\n\n");
			FS0.Write("c,0,1\n");
			FS0.Write("a;" + syRandom + ",\n");
			FS0.Write("s, \\}\\}\\n\\n+\\{\\{ 井戸端サブページ \\|, }}\\n{{ 井戸端サブページ |\n");
			FS0.Write(tmFooter.replace("#page#",syTitle));

			FS0.Write(tmSetings.replace("#summary#","bot: [[" + syTitle + "]]から分割"));
			FS0.Write("a,^," + tmNoinclude.replace("#time#",syNdateT));
			FS0.Write("a,$,\\1\n");
			FS0.Write("a;" + syRandom + ",\n");
			FS0.Write(tmFooter.replace("#page#",syTitle + "/subj/" + wsName));

			wsHit++;
			//タイトル超過と要約欄超過と禁則文字の判定(すべての更新中止)
			if (RE0.pickup(RE0.log, "invalid=") == "" ||
				wsName.length > 70 ||
				wsName.match(/\\|\{|\}|\[|\]|\||\#| |\t/)) {
				FS0.Write("//「E」" + wsName + "\n");
				wsHit = -999;
			}
		}

		wsText = wsText.replace(rgexp, "");
	}
}

//ログ要約欄用ダミーセット
if (RE0.rtn == 0) {
	FS0.Write(tmSetings.replace("#summary#","bot: [[" + syTitle + "]]掲載期限切れ除去・サブページ分割").replace("mode=A","mode=C"));
	FS0.Write("a,$," + syRandom + "\n");
	FS0.Write(tmFooter.replace("#page#",syTitle));
}

//フッタの出力、出力ファイルクローズ
iewrite("end RE0.rtn=" + RE0.rtn + " wsHit=" + wsHit + "<br />\n", 1);
FS0.Write("\n//rtn=" + RE0.rtn + " hit=" + wsHit + "\n");
FS0.Close();

//次処理の起動(作業対象があった場合)
if (RE0.rtn == 0 && wsHit > 0) {
	WScript.CreateObject("WScript.Shell").run("Trireplace.js " + syFile);
}

//WScript.Echo( "作業完了" );
if (IE0) {
	IE0.quit();
}
WScript.Quit();

//キーワードの検出を数える
function search_count(text, search) {
  return (text+"").split(search).length - 1;
}

//モニタ出力
function iewrite(intext, inmode, inmode2) {
	if (IE0) {
		return(IE0.write(intext, inmode, inmode2));
	}
	else {
		if (inmode == 1) {
			return(intext);
		}
	}
}