コンテンツにスキップ

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

利用者:Triglav/Triwiki/Translation.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 syTitle0 = "Wikipedia:翻訳依頼";
	var syTitle1 = "Template:翻訳完了項目";
	var syTitle2 = "Wikipedia:翻訳依頼/古い依頼";
	var sySet = "Translation";

//現在日時
var	syNdate = new Date();

//出力ファイル名(フルパス)、置換用メタ
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;
}

//出力フォーム
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";

var tmFooter =
"\n#pages ------------------------------------------\n" +
"#page#\n";

//出力ファイル初期化(unicode生成)とヘッダの出力
var FS0 = WScript.CreateObject("Scripting.FileSystemObject").CreateTextFile(syFile,1,1);
FS0.Write(tmHeader);
FS0.Write(tmSetings.replace("#summary#","bot: 掲載期限切れの依頼の除去"));
FS0.Write("//" + syNdate + "\n\n");
//節題のゴミを除去(奥、前、後)
FS0.Write("a,====[  \\t]+\\n,====\\n\n");
FS0.Write("a,\\n====([^ ]),\\n==== $1\n");
FS0.Write("a,([^ ])====\\n,$1 ====\\n\n");
FS0.Write("a,\\n====[  \\t][  \\t]+,\\n==== \n");
FS0.Write("a,[  \\t][  \\t]+====\\n, ====\\n\n");
FS0.Write("a,\\n====[ \\t],\\n==== \n");
FS0.Write("a,[ \\t]====\\n, ====\\n\n");

//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 = syTitle0;
	RE0.section = "";
	iewrite(RE0.read(), 0);
}

//Lv5見出しを検出した場合は強制終了
if (RE0.rtn == 0) {
	rgexp = new RegExp("=====", "i");
	if (rgexp.test(RE0.text) == 1) {
		RE0.rtn = 801;
		FS0.Write("//err801:Lv5見出しを検出\n");
	}
}

//テキストを調整
if (RE0.rtn == 0) {
	//コメントアウト部分の除去
	var wsText = RE0.text.replace(/<!--[\s\S]*?-->/g,"");

	//節題を整形する
	wsText = wsText.replace(/====[  \t]*\n/g,"====\n");
	wsText = wsText.replace(/\n====([^ ])/g,"\n==== $1");
	wsText = wsText.replace(/([^ ])====\n/g,"$1 ====\n");
	wsText = wsText.replace(/\n====[  \t]*/g,"\n==== ");
	wsText = wsText.replace(/[  \t]*====\n/g," ====\n");
}

//依頼節を抽出
if (RE0.rtn == 0) {

	rgexp = new RegExp("\\n==== .* ====\\n[\\s\\S]*?==", "i");
	var wsName = "";
	var wsRequest = "";
	var wsHit = 0;
	//依頼日、更新日、完了日、ワーク、古い依頼用テキスト、テンプレ用テキスト
	var wsSdate = new Date();
	var wsMdate = new Date();
	var wsEdate = new Date();
	var wsWdate = new Date();
	var wsStext = "";
	var wsEtext = "";

	//日付テキスト、翻訳元
	var wsSdateT = "";
	var wsSorigin = "";

	while (rgexp.test(wsText)) {
		wsRequest = RegExp.lastMatch;
		wsName = wsRequest.replace(/\n==== (.*) ====[\s\S]*?==/, "$1");
		wsSdate = new Date();
		wsMdate = new Date("1901/01/01 00:00:00");
		wsEdate = syNdate;
		wsWdate = new Date();
		iewrite(wsName + "<br />\n", 1);
		iewrite(wsRequest + "<br />\n", 1);

		//完了日付の検出
		rgexp2 = new RegExp("'''翻訳完了'''.*?\\d\\d\\d\\d年\\d+月\\d+日 \\(.\\) \\d+:\\d+ \\(...\\)", "i");
		if (rgexp2.test(wsRequest) == 1) {
			wsEdate = new Date(RegExp.lastMatch.replace(/.*?(\d+年)(\d+月)(\d+日) \(.\) (\d+:\d+).*/,"$10$20$3 $4:00").replace(/[年月日]/g,"/").replace(/\/\d(\d\d)\//g,"/$1/").replace(/\/ /," "));
			wsEdate.setTime(wsEdate.getTime() + (9 * 60 * 60 * 1000));
			wsRequest = wsRequest.replace(rgexp2, "");
		}

		//依頼日付の検出
		rgexp3 = new RegExp("\\d\\d\\d\\d年\\d+月\\d+日 \\(.\\) \\d+:\\d+ \\(...\\)", "i");
		while (rgexp3.test(wsRequest)) {
			wsWdate = new Date(RegExp.lastMatch.replace(/(\d+年)(\d+月)(\d+日) \(.\) (\d+:\d+).*/,"$10$20$3 $4:00").replace(/[年月日]/g,"/").replace(/\/\d(\d\d)\//g,"/$1/").replace(/\/ /," "));
			wsWdate.setTime(wsWdate.getTime() + (9 * 60 * 60 * 1000));
			if (wsWdate > wsMdate) {
				wsMdate = wsWdate;
			}
			if (wsWdate < wsSdate) {
				wsSdate = wsWdate;
			}
			wsRequest = wsRequest.replace(rgexp3, "");
		}

		//出力対象
		FS0.Write("\n//「T」" + wsName + "\n");
		FS0.Write("//" + wsMdate + " -- " + wsEdate + "\n");
		if (wsMdate > new Date("2001/01/01 00:00:00")) {
			//完了より1週間
			if (syNdate > wsEdate.getTime() + (7 * 24 * 60 * 60 * 1000)) {
				FS0.Write("a,==== " + wsName.replace(/([\{\[\(\|\.\*\?\)\]\}\\])/g,"\\$1") + " ====[\\S\\s]*?\\n==,==\n");
				wsHit++;
				wsEtext = wsEtext + "a;" + wsName + "," + syRandom + "\n";
			}
			else {
				//(完了を検出しない状態で)最終更新より93日
				if (syNdate == wsEdate &&
					syNdate > wsMdate.getTime() + (93 * 24 * 60 * 60 * 1000)) {
					FS0.Write("a,==== " + wsName.replace(/([\{\[\(\|\.\*\?\)\]\}\\])/g,"\\$1") + " ====[\\S\\s]*?\\n==,==\n");
					wsHit++;

					//日付テキスト生成
					wsSdateT = (wsSdate.toUTCString() + " " + (wsSdate.getUTCMonth() + 1) + ":").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日 (#day#) $3 (UTC)").replace(/0(\d)([月日])/g,"$1$2").replace("#day#","日月火水木金土".charAt(wsSdate.getUTCDay()));

					//翻訳元記事名
					wsSorigin = wsRequest.replace(/^[\S\s]*?翻訳元となる記事'''[  \t]*-[  \t]*(.*)[  \t]*\n[\S\s]*$/,"$1");
					if (wsSorigin.charAt(0) != "[") {
						//検出不能の場合は強制終了となります
						wsSorigin = "";
						RE0.rtn = 901;
					}

					//分野名の抽出
					m = wsText.replace(wsName,"#Tname#").replace(/==== #Tname#[\S\s]*$/,"").replace(/^[\S\s]*\n==(.*?)==[\S\s]*?$/,"$1").replace(/^[  \t]*(.*?)[  \t]*$/,"$1").replace(/^(.*?)[  \t]*(.*)$/,"$1");

					//命令文のセット
					wsStext = wsStext + "a,(===[  \\t]*?)(" + m + "[  \\t]*?===[\\S\\s]*?)(\\n+==),$1" + syRandom + "$2" + "\\n*" + wsSorigin + " -> " + wsName + " --" + wsSdateT + "$3\n" + "a," + syRandom + ",\n";
				}
			}
		}

		//次へ
		wsText = wsText.replace(rgexp, "\n==");
	}
}

//実行ファイルフッタ生成
if (RE0.rtn == 0) {
	FS0.Write("\na,\\n\\n\\n+,\\n\\n\n");
	FS0.Write(tmFooter.replace("#page#",syTitle0));

	//完了項目あり
	if (wsEtext != "") {
		FS0.Write(tmSetings.replace("#summary#","bot: 翻訳完了項目の除去"));
		FS0.Write(wsEtext);
		FS0.Write("a,\\*.*?" + syRandom + "\\n,\n");

		//7日前から15日前までの強制除去
		d = new Date();
		for (i = 7; i <= 15; i++) {
			d.setTime(syNdate.getTime() - (i * 24 * 60 * 60 * 1000));
			FS0.Write((d.toUTCString() + " " + (d.getUTCMonth() + 1) + ":").replace(/, (\d) /,", 0$1 ").replace(/ (\d:\d+:\d+)/," 0$1").replace(/UTC (\d):/,"UTC 0$1:").replace(/..., (\d+) ... (\d+) (\d+:\d+):\d+ UTC (\d+):/,"a,\\* \\[\\[$4月$1日\\]\\].*\\n,\n").replace(/0(\d)([月日])/g,"$1$2"));
		}

		FS0.Write(tmFooter.replace("#page#",syTitle1));
	}

	//古い依頼送りの項目あり
	if (wsStext != "") {
		FS0.Write(tmSetings.replace("#summary#","bot: [[" + syTitle0 + "]]より項目移転"));
		FS0.Write(wsStext);
		FS0.Write(tmFooter.replace("#page#",syTitle2));
	}
}

//フッタの出力、出力ファイルクローズ
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 iewrite(intext, inmode, inmode2) {
	if (IE0) {
		return(IE0.write(intext, inmode, inmode2));
	}
	else {
		if (inmode == 1) {
			return(intext);
		}
	}
}