利用者:Triglav/Triwiki/Translation.js
表示
< 利用者:Triglav | Triwiki
お知らせ: 保存した後、ブラウザのキャッシュをクリアしてページを再読み込みする必要があります。
多くの Windows や Linux のブラウザ
- Ctrl を押しながら F5 を押す。
Mac における Safari
Mac における Chrome や Firefox
- ⌘ 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);
}
}
}