コンテンツにスキップ

英文维基 | 中文维基 | 日文维基 | 草榴社区

利用者:Triglav/Triwiki/Teian.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-two.iwiki.icu/w/api.php";
	var syTitle = "";
	var sySet = "Teian";

//テンプレート名、1:実体or0:転送テンプレート、除去可能月数
var tbKey = new Array("加筆,1,3", "加筆依頼,0,3", "Expand,0,3", "修正,1,3", "修正2,1,3", "統合提案,1,6", "統合,0,6", "Merge,0,6", "Mergefrom,1,6", "統合先,0,6", "Mergeto,1,6", "統合元,0,6", "分割提案,1,6", "分割,0,6", "一部転記,1,6", "改名提案,1,6", "改名,0,6");

//検索文を生成
var rgexpText = "\\{\\{([  \\t]*Template[  \\t]*:[  \\t]*)?[  \\t]*(";
for (var x in tbKey) {
	rgexpText += tbKey[x].split(",")[0] + "|";
}
rgexpText = rgexpText.replace(/\|$/, "") + ")[  \\t]*(\\}\\}|\\|[\\s\\S]*?\\}\\})[  \\t]*\\n*";
var rgexp = new RegExp(rgexpText, "i");

//ログファイル、出力ファイル名(フルパス)
var syLog = new ActiveXObject("WScript.Shell").CurrentDirectory + "\\" + WScript.scriptName.replace(/\.js$/,"_log.htm");
var syFile = new ActiveXObject("WScript.Shell").CurrentDirectory + "\\" + WScript.scriptName.replace(/\.js$/,".txt");

//ファイル名末尾が_nの場合は動作非表示
var syMonitor = 1;
if (WScript.scriptName.match(/.*_n\.js/i)) {
	syMonitor = 0;
}

//出力フォーム
var tmHeader = 
"configset=" + sySet + "\n" +
"monitor=" + syMonitor + "\n" +
"submit=" + sySubmit + "\n\n" +
"//+--------------------------------------------------\n" +
"//+ ja.Wikipedia Bot「提案系タグ除去」\n" +
"//+--------------------------------------------------\n";

var tmSetings =
"#setings --------------------------------------------\n" +
"mode=A\n" +
"summary=bot: 「依頼・提案テンプレート」期限切れ除去。[[Wikipedia:依頼と提案]]\n" +
"minor=1\n";

//タグ除去の対象となる記事名とタグ内容
var tbPage = new Array();
var tbText = new Array();

//本日の通算月数
var syDate = new Date();
//var syDate = "2014/06/01";
var teMonths = new Date(syDate).getYear() * 12 + new Date(syDate).getMonth();
//WScript.Echo("設定年月:" + syDate + " 通算月数:" + teMonths);

//ログファイル初期化unicode指定
var FS0 = WScript.CreateObject("Scripting.FileSystemObject").CreateTextFile(syLog,1,1);
FS0.Write("<html><br />\n提案系テンプレートメンテナンス " + new Date() + "<br />\n対象テンプレートデータ抽出<br />\n" + "<br />\n<br />\n");

//IEの準備
if (syMonitor == 1) {
	var IE0 = new IEaccess();
	IE0.navi("about:blank");
}
var RE0 = new WikipediaAPI();
RE0.url = syUrl;

if (RE0.rtn == 0) {
	//調査対象テンプレートのループ
	var tbTitle = new Array();
	var tbNamespace = new Array();
	var m = 0;
	var teText = "";
	var n = 0;
	for (var i in tbKey) {

		//転送テンプレートは処理しない
		if (tbKey[i].split(",")[1] != 1) {
			continue;
		}

		//テンプレート呼び出し元を取得
		RE0.path ="action=query&list=embeddedin&eilimit=500&eititle=Template:" + RE0.encode(tbKey[i].split(",")[0]);
		FS0.Write(iewrite("■" + tbKey[i].split(",")[0] + "<br />\n", 1));
		iewrite(RE0.access(), 1);

		//呼出し元ごとのループ
		j = 0;
		tbTitle = RE0.pickup2(RE0.log, "title=").slice(0);
		tbNamespace = RE0.pickup2(RE0.log, "ns=").slice(0);
		for (var j in tbTitle) {
			FS0.Write(iewrite("□" + tbTitle[j] + "<br />\n", 1));

			//ページテキストの取得
			RE0.title = tbTitle[j];
			iewrite(RE0.read(), 0);

			//使用テンプレートを検出
			m = 0;
			while (rgexp.test(RE0.text.substr(m))) {
				teText = RegExp.lastMatch;
				FS0.Write(iewrite(teText + "' " + m + " ", 1));
				m += RegExp.lastIndex;

				//除去判定
				var teResult = data_chk(tbKey[i].split(",")[0], tbTitle[j], tbNamespace[j], teText);

				switch (teResult) {
				case "":
					break;
				case "対象":
					teText = teText.replace(/,/g,"\\,");
					teText = teText.replace(/\n/g,"\\n");

					//対象を格納
					n = 0;
					while (n in tbPage) {
						if (tbPage[n] == RE0.title) {
							break;
						}
						n++;
					}
					teResult = "<font color=green>対象項目</font>";
					if (n > tbPage.length - 1) {
						tbPage[n] = RE0.title;
						tbText[n] = "";
					}
					else {
						teResult += "[d]"
					}
					tbText[n] += "a;" + teText + ",\n";
					break;
				case "調査外":
					teResult = "<font color=orange>調査外</font>";
					break;
				default:
					teResult = "<font color=red>エラー:" + teResult + "</font>";
					break;
				}

				//リスト開始の出力
				FS0.Write(iewrite(teResult + "<br />\n", 1));

			}
		}
		FS0.Write(iewrite("<br />\n", 1));
	}
}

//replaceファイルのまとめ出力unicode指定
var FS1 = WScript.CreateObject("Scripting.FileSystemObject").CreateTextFile(syFile,1,1);
FS1.Write(tmHeader);
i = 0;
while (i in tbPage) {
	FS1.Write(tmSetings + tbText[i] + "#pages\n" + tbPage[i] + "\n\n");
	i++;
}

//フッタの出力とクローズ
FS0.Write(iewrite("<br />\n<br />\n" + new Date(), 1));
FS0.Write(" end<br />\n</html>\n");
FS0.Close();
FS1.Close();

//更新処理の起動
if (RE0.rtn == 0) {
	WScript.CreateObject("WScript.Shell").run("Trireplace.js " + syFile);
}

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

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

//除去対象判定
function data_chk(intemp, inname, innamespace, intext) {
	//判定テキスト(""対象外、"対象"、"調査外"、以外:エラー)
	var outtext = "";

	//調査外名前空間を除外(除外対象 Wikipedia:,Wikipedia‐ノート:,Portal:,Portal‐ノート:,利用者:,利用者‐会話:,Template:,Template‐ノート:,MediaWiki:,MediaWiki‐ノート:,ノート:)
	if (":4:5:100:101:2:3:10:11:8:9:1:".indexOf(":" + innamespace + ":") != -1) {
		outtext = "調査外";
		return(outtext);
	}

	//テンプレート種別判定
	for (var y in tbKey) {
		//検索文を生成
		var rgexp2 = new RegExp("\\{\\{([  \\t]*Template[  \\t]*:[  \\t]*)?[  \\t]*" + tbKey[y].split(",")[0] + "[  \\t]*(\\}\\}|\\|[\\s\\S]*?\\}\\})", "i");
		if (rgexp2.test(intext)) {
//			iewrite(tbKey[y].split(",")[0] + " ", 1);
			break;
		}
	}
	if (y >= tbKey.length) {
		outtext = "検査テンプレート外";
		return(outtext);
	}

	//date引数存在判定
	if (!intext.match(/\|[  \t]*date[  \t]*=[  \t]*(\d\d\d\d).(\d+)/i)) {
		outtext = "date設定";
		return(outtext);
	}

	//貼付月数算出と未来月判定
	var months = (RegExp.$1 - 0) * 12 + (RegExp.$2 - 0) - 1;
//	iewrite(months + "=" + teMonths + " ", 1);
	if (months > teMonths) {
		outtext = "未来月";
		return(outtext);
	}

	//経過月数判定
	if (months + (tbKey[y].split(",")[2] - 0) < teMonths) {
		outtext = "対象";
	}
	return(outtext);
}