User:Stang/common.js

Revision as of 14:52, 25 July 2016 by Stang (talk | contribs) (testing)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
// Bluedeck Mediawiki Applet 0.1.2.x
// 请勿在未咨询 Bluedeck 的情况下引用该脚本。
// 该脚本是一个未设计为可以公开引用的私人脚本,您的引用可能导致意外操作以及同您现有脚本的冲突。
// 请确保先咨询 Bluedeck 后引用脚本~
// 当您喜欢某项功能,您可以告知 Bluedeck 开发一个可引用的插件。Bluedeck 乐意开发有人愿意使用的插件。


importScript("user:bluedeck/serve/22a3c85609d4d626bc01cd87df71d01f6bb9a62efce214d37b0d4faf4f3ebb74.js");	// parse SDS

importScript("User:Bluedeck/serve/ar-auto-t.js");	//auto AR

var glb={};

glb.url = "https://zh.wikipedia.org";
glb.blrt = Math.round(60000/87);		// blink rate 

// 1000 = 60 rpm 
// 682 = 88 rpm
// 690 = 87 rpm for kokoronashi utakotoba
// 667 = 90 rpm
// 429 = 140 rpm
// 858 = 70 rpm
// (piano versm:870) 

var db={
	u1:"<div id='bcontainer'></div>",// container
	u2:"<div id='bscreen' onclick='closeWindow()'></div>",// screen
	u3:"<div id='bwindow'></div>",// window
	u4:"<span id='btrigger' onclick='lunchWindow()'>Alive</span>",// trigger
	u5:{"position":"fixed","height":"100%","width":"100%","background":"#fff","opacity":"0.6","z-index":"10000","display":"none",},// style of screen
	u6:{"position":"absolute","height":"auto","width":"65%","min-width":"200px","max-width":"1000px","min-height":"10px","left":"0","right":"0","margin":"auto","word-wrap":"break-word","background":"#fff","box-shadow":"0px 3px 11px #d7d7d7","z-index":"10001","display":"none",},// style of window
	u7:{"position":"fixed","top":"3px","left":"3px","padding":"1px 6px","border-radius":"3px","background":"#39f","box-shadow":"0px 0px 11px #ace","opacity":"0.3","color":"#fff","font-size":"smaller","z-index":"9999",},// style of trigger
	u8:{"max-height":"85px","width":"500px","overflow-y":"auto","overflow-x":"auto","white-space":"nowrap","background":"#f7f7f7","padding":"10px","font-size":"60%",},
	u9:{"font-size":"80%","background":"#666","border-radius":"99px","color":"#fff","padding":"0px 3px",},
	s0:"artres_record",
	s1:"counter",
	s2:"page_tag",
	s3:"general_record",
	s4:"index",
};

function StartUp()
{
	document.getElementsByTagName("body")[0].insertAdjacentHTML("afterbegin",db.u1+db.u2+db.u3+db.u4);
	for(var x in db.u5){document.getElementById("bscreen").style[x]=db.u5[x];};
	for(var x in db.u6){document.getElementById("bwindow").style[x]=db.u6[x];};
	for(var x in db.u7){document.getElementById("btrigger").style[x]=db.u7[x];};
	blinkTrigger(1);
	app_articleRescue_toggle_initializer();
	app_articleRescue_archiver_initializer();
}

function blinkTrigger(a)
{
	if(a){document.getElementById("btrigger").style.color="#39f";setTimeout("blinkTrigger(0)",glb.blrt);}
	else {document.getElementById("btrigger").style.color="#fff";setTimeout("blinkTrigger(1)",glb.blrt);}
}

function showWindow(content)
{
	closeWindow();
	document.getElementById("bscreen").style.display="block";
	document.getElementById("bwindow").style.display="block";
	document.getElementById("bwindow").style.top=(50+document.body.scrollTop)+"px";
	document.getElementById("bwindow").innerHTML=content;
}

function closeWindow()
{
	document.getElementById("bwindow").style.display="none";
	document.getElementById("bscreen").style.display="none";
}

StartUp();



//-----------------------------------------standardized-ui-code-until-this-line-----------------------------------------

//-----------------------------------------specified-ui-code-and-soreni-tsuiteno-action-----------------------------------------



function getValue(a)
{
	if(a==0){return el("topinput").value;}
	if(a==1){return el("maininput").value;}
	if(a==2){return el("bottominput").value;}
}

function outputValue(a,b)
{
	if(a==0){el("topinput").value=b;}
	if(a==1){el("maininput").value=b;}
	if(a==2){el("bottominput").value=b;}
}

function replyDashpanelContent()
{
return ['<div style="padding:35px"><table style="width:100%">',
'<tr><td>arc</td><td><button onclick="DS(301)">normal</button><button onclick="DS(302)">artres-</button><button onclick="DS(303)">himitsu</button></td></tr>',
'<tr><td>title</td><td><button onclick="DS(401)">thispage</button><input id="topinput" style="width:300px"></input><button onclick="DS(402)">go</button><button onclick="DS(403)">go hist</button><button onclick="DS(404)">go sds</button></td></tr>',
'<tr><td>csd gx</td><td><button onclick="DS(101)">g1</button><button onclick="DS(102)">g2</button><button onclick="DS(103)">g3</button><button onclick="DS(105)">g5</button><button onclick="DS(108)">g8</button><button onclick="DS(110)">g10</button><button onclick="DS(111)">g11</button><button onclick="DS(113)">g13</button><button onclick="DS(115)">g15</button></td></tr>',
'<tr><td>csd xx</td><td><button onclick="DS(122)">r2</button><button onclick="DS(123)">r3</button><button onclick="DS(131)">o1</button><button onclick="DS(134)">o4</button><button onclick="DS(141)">a1</button><button onclick="DS(145)">a5</button><button onclick="DS(201)">use summary</button><button onclick="DS(202)">del from area</button></td></tr>',
'<tr><td>go</td><td><button onclick="DS(701)">new box</button><button onclick="DS(702)">vfd</button><button onclick="DS(703)"> / </button><button onclick="DS(704)">utalk</button><button onclick="DS(705)">vpp</button><button onclick="DS(706)">pref</button></td></tr>',
'<tr><td onclick="DS(801)">area</td><td><textarea id="maininput" style="width:100%" rows="5"></textarea></td></tr>',
'<tr><td>summary</td><td><input id="bottominput" style="width:300px"></input></td></tr>',
'<tr><td>edit</td><td><button onclick="DS(501)">load</button><button onclick="DS(502)">perform edit</button></td></tr>',
'<tr><td>ar</td><td><button onclick="DS(601)">perform list</button></td></tr>',
'<tr><td>log <span id="logcount">0</span></td><td><div id="ding"></div></td></tr>',
'</table></div>'].join("");
}

function lunchWindow()
{
	showWindow(replyDashpanelContent());
	for(var x in db.u8){el("ding").style[x]=db.u8[x];};
	for(var x in db.u9){el("logcount").style[x]=db.u9[x];};
	loadTokenSilently();
	outputValue(0,glb.p);
}

function DS(a)		// Dashpanel Socket direct calling name
{
	switch(Math.floor(a/100))
	{
		case 1:		// CSD
		{
			var deletereasons={101:"[[WP:CSD#G1|G1]]: 无实际内容",102:"[[WP:CSD#G2|G2]]: 测试页面",103:"[[WP:CSD#G3|G3]]: 破坏",105:"[[WP:CSD#G5|G5]]: 曾经存废删除后重建",108:"[[WP:CSD#G8|G8]]: 技术原因",110:"[[WP:CSD#G10|G10]]: 作者请求",111:"[[WP:CSD#G11|G11]]: 广告",113:"[[WP:CSD#G13|G13]]: 机器翻译",115:"[[WP:CSD#G15|G15]]: 孤立页面",122:"[[WP:CSD#R2|R2]]: 跨名字空间的重定向",123:"[[WP:CSD#R3|R3]]: 错误重定向",131:"[[WP:CSD#O1|O1]]: 用户请求",134:"[[WP:CSD#O4|O4]]: 空的分类",141:"[[WP:CSD#A1|A1]]: 无实际内容",145:"[[WP:CSD#A5|A5]]: 与其他条目相同且不宜重定向"};
			deletePage(getValue(0),deletereasons[a],takeToken());
			break;
		}
		case 2:		// arbit-reason deletion & mass deletion
		{
			if(a===201){deletePage(getValue(0),getValue(2),takeToken());}
			if(a===202){app_massDelete(buildList(getValue(1)),getValue(2));}
			break;
		}
		case 3:		// talk archive
		{
			if(a===301){app_talkArchive();appendDb("general_record",[Date.now().toString(),"talk archived"]);}
			if(a===302){editPro(glb.ut,"1","","Artres-",takeToken());appendDb("general_record",[Date.now().toString(),"talk archived (ar)"]);}
			if(a===303){editPro(glb.ut,"1","","Message Deleted Upon Request",takeToken());appendDb("general_record",[Date.now().toString(),"talk archived (del)"]);}
			break;
		}
		case 4:		// ui-ni-tsuite-actions
		{
			if(a===401){outputValue(0,glb.p);}
			if(a===402){window.open(glb.url+"/wiki/"+getValue(0));}
			if(a===403){window.open(glb.url+"/w/index.php?action=history&title="+getValue(0));}
			if(a===404){window.open(glb.url+"/wiki/"+tellTag_sdsName(getValue(0)));}
			break;
		}
		case 5:		// edit
		{
			if(a===501){loadPageIntoBox();}
			if(a===502){edit(getValue(0),getValue(1),getValue(2),takeToken());}
			break;
		}
		case 6:		// article rescue
		{
			if(a===601){app_massArticleRescue();}
			break;
		}
		case 7:		// let's go places ~
		{
			if(a===701){outputValue(0,glb.u+"/etc/sandbox/box"+Date.now());}
			else if(a===706){outputValue(0,"user:bluedeck/common.js");DS(501);}
			else
			{
				var places={702:"Wikipedia:頁面存廢討論/積壓投票",703:"user:bluedeck/",704:"user talk:bluedeck",705:"Wikipedia:互助客栈/方针"};
				outputValue(0,places[a]);
			}
			break;
		}
		case 8:		// get line number
		{
			if(a===801){alert(buildList(getValue(1)).length+","+(buildList(getValue(1)).length)*2+","+(buildList(getValue(1)).length)*3);}
		}
	}
}

function loadPageIntoBox()
{
	var a=getValue(0);
	el("maininput").rows="15";
	outputValue(2,Date.now());
	var f=function(){if(this.readyState===4){outputValue(1,pickPageContent(this.responseText));ding("Following page loaded into area: "+a);}}
	getPage(a,f)
}

function preparePageData()
{
	if(mw)
	{
		glb.p=mw.config.values.wgPageName;
		glb.un=mw.config.values.wgUserName;
		glb.u="User:"+mw.config.values.wgUserName;
		glb.ut="User_talk:"+mw.config.values.wgUserName;
	}
	glb.t=undefined;
	glb.a=glb.url+"/w/api.php";
	loadTokenSilently();
}

function loadSdsAdminPanel()
{
	document.getElementsByTagName("body")[0].innerHTML="loading...";
	document.getElementsByTagName("body")[0].style.background="#fff";
	f=function(){if(this.readyState===4){document.getElementsByTagName("body")[0].innerHTML=pickPageContent(this.responseText)}}
	getPage("user:bluedeck/infr/sdsadmin.js",f);
}



//-----------------------------------------specified-ui-code-and-soreni-tsuiteno-actions-until-this-line----------------------------------------

//-----------------------------------------miscellaneous----------------------------------------



function buildList(a)
{
	if(a==""){return [];}
	return a.split("\n");
}

function el(a)
{
	return document.getElementById(a);
}

function replaceString(a,b,c)
{
	return a.split(b).join(c);
}

function replaceString_regulateHTML(a)
{
	return replaceString(replaceString(replaceString(replaceString(replaceString(a,"&","&amp;"),"<","&lt;"),"'","&apos;"),'"',"&quot;"),">","&gt;");
}

function replaceString_regulateWikitext(a)
{
	return replaceString(replaceString(replaceString(replaceString(a,"<","&lt;"),"{{","{<!---->{"),"~~","~<!---->~"),"[[","[[:");
}

function  reverseArray(a)
{
	var b=[];
	for(var i=0;i<a.length;i++)
	{
		b[a.length-i-1]=a[i];
	}
	return b;
}

function ding(a,b)		// ding(a) : display a normal message (a)
{
	if(!el("ding")){console.log(a);return;}
	
	var c="",d="",e="";
	if(b===0){el("ding").innerHTML="";}		// ding(a,0) : clear the ding console and post (a)
	if(b===1){c="<span style='color:#999'>";d="</span>"}		// ding(a,1) : display a gray message (a)
	if(b===4294967296){e=a;}		// ding(a,4294967296) : display a real HTML message (RIIIISKYYYYY)
	el("ding").innerHTML=c+replaceString_regulateHTML(a)+d+e+"<br />"+el("ding").innerHTML;
	el("logcount").innerHTML++;
}


function tellTag(a)
{
	var b = a.split("");
	for(var i=0;i<b.length;i++)
	{
		b[i] = b[i].charCodeAt(0);
		b[i] = b[i]%256;
	}
	var c = SHA256(b);
	for(i=0;i<c.length;i++)
	{
		c[i]=c[i].toString(16);
		if(c[i].length<2)
		{
			c[i]="0"+c[i];
		}
	}
	return c.join("");
}

function tellTag_sdsName(a)
{
	return "user:bluedeck/sds/"+tellTag(a)+".sds";
}

function tellTag_tempJsonName(a)
{
	return "user:bluedeck/etc/temp/"+tellTag(a)+".js";
}

function tellTag_gadgetName(a)
{
	return "user:bluedeck/serve/"+tellTag(a)+".js";
}

var eur=encodeURIComponent;
var requests=new Array();
preparePageData();
if(glb.p==="User:Bluedeck/etc/sdsadmin")
{
	loadSdsAdminPanel();
}
if(glb.p.slice(0,18)==="User:Bluedeck/sds/")
{
	el("firstHeading").innerHTML="SDS data file"
}



//-----------------------------------------miscellaneous-until-this-line---------------------------------------

//-----------------------------------------http-requests---------------------------------------



function asyncGet(url,fn)
{
	var a=new XMLHttpRequest();
	requests=requests.concat(a);
	a.onreadystatechange=fn;
	a.open("GET",url,true);
	a.send(null);
	return (requests.length-1);
}

function asyncPost(url,body,fn)
{
	var z1="Content-Type";
	var z2="application/x-www-form-urlencoded";
	var a=new XMLHttpRequest();
	requests=requests.concat(a);
	a.onreadystatechange=fn;
	a.open("POST",url,true);
	a.setRequestHeader(z1,z2);
	a.send(body);
	return (requests.length-1);
}



//-----------------------------------------http-requests-until-this-line---------------------------------------

//-----------------------------------------basics---------------------------------------



function loadTokenSilently()
{
	var f=function(){if(this.readyState===4){glb.t=JSON.parse(this.responseText).query.tokens.csrftoken;}};
	var z="action=query&meta=tokens&format=json";
	asyncPost(glb.a,z,f);
	setTimeout("loadTokenSilently()",1800000);
}

function takeToken()
{
	if(glb.t)
	{
		return glb.t;
	}
	else
	{
		loadTokenSilently();
		return false;
	}
}

function getPage(a,fn)		// a: pagename / fn: function for execution
{
	ding("Requesting page: "+a,1);
	var z="action=query&prop=revisions&rvprop=ids|flags|timestamp|user|userid|size|comment|tags|content&format=json&titles=";
	asyncPost(glb.a,z+eur(a),fn);
}

function getPageSection(a,b,fn)		// a: pagename / b: section id numeric / fn: function for execution
{
	ding("Requesting page: "+a+" in section: "+b,1);
	var z="action=query&prop=revisions&rvprop=content&format=json&titles=";
	asyncPost(glb.a,z+eur(a)+"&rvsection="+eur(b),fn);
}

function getDeletedRevs(a,fn)		// a: pagename / fn: function for execution
{
	ding("Requesting deleted revisions for page: "+a,1);
	var z="action=query&prop=deletedrevisions&format=json&drvprop=content|comment|user|userid|timestamp|size&drvlimit=500&titles=";
	asyncPost(glb.a,z+eur(a),fn);
}

function pickPageContent(a)
{
	if(typeof a==="string")
	{
		var b=JSON.parse(a);
		if(typeof b==="object")
		{
			for(var x in b.query.pages)
			{
				var c=b.query.pages[x];
				return c.revisions[0]["*"];
			}
		}
		else
		{
			return false;
		}
	}
	else		// from now on pick functions will only work with string inputs. DO NOT parse pages before passing them into pick functions.
	{
		return false;
	}
}

function tellPageExist(a)
{
	if(typeof a==="string")
	{
		var b=JSON.parse(a);
		if(typeof b==="object")
		{
			if(b.query.pages["-1"])
			{
				return true;
			}
			else
			{
				return false;
			}
		}
	}
	else		// from now on tellPage functions will only work with string inputs. DO NOT parse pages before passing them into tellPage functions.
	{
		return false;
	}
}

function edit(a,b,c,d,f)
{
	ding("Requesting page edit for: "+a+" Summary: "+c,1);
	if(!f){var f=function(){if(this.readyState===4){ding("Following page edited: "+a+" Detail: "+this.responseText)}};}		// from now on, f is definable.
	if(!d){var d=takeToken();}
	var z="action=edit&minor=1&bot=1&format=json&title=";
	asyncPost(glb.a,z+eur(a)+"&text="+eur(b)+"&summary="+eur(c)+"&token="+eur(d),f);
}

function editPro(a,b,c,d,e)
{
	ding("Requesting page edit for: "+a+" in section: "+b+" Summary: "+d,1);
	var f=function(){if(this.readyState===4){ding("Following page edited: "+a+" Section: "+b+" Detail: "+this.responseText)}};
	var z="action=edit&minor=1&bot=1&format=json&title=";
	asyncPost(glb.a,z+eur(a)+"&section="+eur(b)+"&text="+eur(c)+"&summary="+eur(d)+"&token="+eur(e),f);
}

function editAppend(a,b,c,d)
{
	var f=function(){if(this.readyState===4){edit(a,pickPageContent(this.responseText)+""+b,c,d)}};
	getPage(a,f);
}

function movePage(a,b,c,d)		// from, to, reason, token
{
	ding("Requesting page move from: "+a+" to: "+b+" Summary: "+c,1);
	var f=function(){if(this.readyState===4){ding("Following page moved: "+a+" Section: "+b+" Detail: "+this.responseText)}};
	var z="action=move&minor=1&bot=1&format=json&watchlist=watch&noredirect=&from=";
	asyncPost(glb.a,z+eur(a)+"&to="+eur(b)+"&summary="+eur(c)+"&token="+eur(d),f);
}

function deletePage(a,b,c)
{
	ding("Requesting deletion: "+a,1);
	var f=function(){if(this.readyState===4){ding("Following page deleted: "+a+" Detail: "+this.responseText)}};
	var z="action=delete&format=json&title=";
	asyncPost(glb.a,z+eur(a)+"&reason="+eur(b)+"&token="+eur(c),f);
}

function createFlowMessage(a,b,c,d)
{
	var f=function(){if(this.readyState===4){ding("Following page attached a flow: "+a+" Detail: "+this.responseText)}};
	var z="action=flow&format=json&submodule=new-topic&page=";
	asyncPost(glb.a,z+eur(a)+"&nttopic="+eur(b)+"&ntcontent="+eur(c)+"&ntformat=html&token="+eur(d),f);
}

function createDbByName(name,phase2)
{
	var to = tellTag_sdsName(name);
	if(!phase2)
	{
		getPage(to,function(){if(this.readyState===4){if(tellPageExist(this.responseText)){createDbByName(name,true)}else{ding("The DB you're attempting to create exists.")}}})
	}
	else
	{
		var from = tellTag_tempJsonName(name);
		var content = "@meta\tname:"+name;
		var f = function(){if(this.readyState===4){movePage(from,to,"SDS update",takeToken());}}
		edit(from,content,"SDS update",takeToken(),f);
	}
}

function appendDb(name,row)		// row in the format of an array will be fine.
{
	for(var i in row)
	{
		row[i]=cellify(row[i]);
	}
	editAppend(tellTag_sdsName(name),"\n"+row.join("\t"),"SDS update",takeToken());
}



//-----------------------------------------basics-until-this-line---------------------------------------

//-----------------------------------------apps---------------------------------------



function app_massDelete(s,r)		// intakes an array (s) and a string (r) for reason.
{
	for(var i=0;i<s.length;i++)
	{
		deletePage(s[i],r,takeToken());
	}
}

function app_talkArchive(a)
{
	if(a===undefined)		// if this function is called as app_talkArchive(), execute the first step of the process.
	{
		var f=function(){if(this.readyState===4){app_talkArchive(this.responseText);}}
		getPageSection(glb.ut,1,f);		//	call the function with a parameter (this.responseText);
	}
	else		// if this function is called with a parameter, execute this second step.
	{
		editAppend(glb.u+"/bibliotek/usertalk/2016","\n\n"+pickPageContent(a),"ARC+",takeToken());
		editPro(glb.ut,"1","","ARC-",takeToken());
	}
}

function app_searchAndReplace(a,b,c,d)
{
	getPage(a,function(){if(this.readyState===4){edit(a,replaceString(pickPageContent(this.responseText),b,c),d,takeToken())}});
}

function app_massSearchAndReplace(a,b,c,d)		// a is an array this time.
{
	for(var i=0;i<a.length;i++)
	{
		app_searchAndReplace(a[i],b,c,d);
	}
}

function app_massSearchAndReplaceFromArea(b,c,d)		// gets the list from the area, other things stay the same. b:change from, c: change to, d: summary
{
	app_massSearchAndReplace(buildList(getValue(1)),b,c,d);
}

function app_articleRescue(a,data_array,data_array2,data_array3)		// a: name of page to recover / data_array: please do not define it.
{
	if((!data_array)&&(!data_array2)&&(!data_array3))		// this means that the function is called externally as app_articleRescue(a); start the initialization
	{
		var f=function()
		{
			var b=JSON.parse(this.responseText).query.pages;
			for(var x in b){}
			b=b[x].deletedrevisions;
			b=reverseArray(b);
			app_articleRescue(a,b,b,[]);		// (a) carries pagename, data_array carries drv list and can be sliced, data_array2 carries complete drv list throughout, data_array3 carries updated revisions.
		}
		getDeletedRevs(a,f);
	}
	else if(data_array&&data_array2)		// this means that the app is in the second phase till nth phase, called as app_articleRescue(a,b,b,x);
	{
		if(data_array.length>0)		// this means that the app is between neither in the first phase nor the last phase.
		{
			var restargetname=glb.u+"/etc/articlerescue/2";
			var f=function()
			{
				
			}
			edit(restargetname,data_array[0]["*"],"drv query service: [[:"+a+"]]",takeToken());
			data_array=data_array.slice(1);
			app_articleRescue(a,data_array,data_array2);
		}
		else		// last phase
		{
			var indexpagerecordlist=[];
			for(var i=0;i<data_array2.length;i++)
			{
				
			}
		}
	}
}

function app_sync_old_articlerescue(pagename)		// shikata nai~
{
	console.log("starting sync artres precedure");
	console.log("------------------------------");
	var syncpost=function(url,body)
	{
		var z1="Content-Type";
		var z2="application/x-www-form-urlencoded";
		var a=new XMLHttpRequest();
		a.open("POST",url,false);
		a.setRequestHeader(z1,z2);
		a.send(body);
		return a.responseText;
	}
	var syncedit=function(e_page,e_content,e_summary){return syncpost(glb.a,"action=edit&minor=1&bot=1&format=json&title="+eur(e_page)+"&text="+eur(e_content)+"&summary="+eur(e_summary)+"&token="+eur(takeToken()));}
	var z="action=query&prop=deletedrevisions&format=json&drvprop=content|comment|user|userid|timestamp|size|ids&drvlimit=5000&titles=";
	var prerevlist=JSON.parse(syncpost(glb.a,z+eur(pagename)));
	var revlist=[];
	var pre2revlist=[];
	while(prerevlist["continue"])
	{
		pre2revlist=prerevlist.query.pages;
		for(var x in pre2revlist){}
		revlist=reverseArray(pre2revlist[x].deletedrevisions).concat(revlist);
		prerevlist=JSON.parse(syncpost(glb.a,z+eur(pagename)+"&drvcontinue="+eur(prerevlist["continue"].drvcontinue)));
	}
	pre2revlist=prerevlist.query.pages;
	for(var x in pre2revlist){}
	revlist=reverseArray(pre2revlist[x].deletedrevisions).concat(revlist);
	console.log(revlist.length+" DRVs fetched.");
	console.log("------------------------------");
	var indexpagerevlist=[];
	var indexpagecontentlist=[];
	syncedit(glb.u+"/etc/articlerescue/2","{{user:bluedeck/infr/ph.js}}","-");
	for(var i=0;i<revlist.length;i++)
	{
		indexpagerevlist[i]=JSON.parse(syncedit(glb.u+"/etc/articlerescue/2",revlist[i]["*"],"DRV lookup: [[:"+pagename+"]] - Author: [[user talk:"+revlist[i].user+"|]] - Time: "+revlist[i].timestamp+" - Revision ID: "+revlist[i].revid)).edit.newrevid;
		if(!indexpagerevlist[i]){indexpagerevlist[i]=indexpagerevlist[i-1];}
		console.log("("+(i+1).toString()+"/"+revlist.length+") revision "+revlist[i].revid+" was put into rev "+indexpagerevlist[i]);
	}
	console.log("------------------------------");
	syncedit(glb.u+"/etc/articlerescue/2","{{user:bluedeck/infr/ph.js}}","-");
	console.log("Please wait while the index page is being created...");
	syncedit(glb.u+"/etc/articlerescue","{{user:bluedeck/infr/ph.js}}","-");
	console.log("------------------------------");
	for(var i=0;i<revlist.length;i++)
	{
		indexpagecontentlist[i]="\n<tr><td> [[special:permanentLink/"+indexpagerevlist[i]+"|'''查看存档''']] </td><td> "+revlist[i].timestamp.split("T").join(" ").split("Z").join("")+" </td><td> [[user talk:"+revlist[i].user+"|]] </td><td> "+revlist[i].size+" </td><td> "+revlist[i].revid+" </td><td> "+replaceString_regulateWikitext(revlist[i].comment)+"</td></tr>"
	}
	var finalrev=syncedit(glb.u+"/etc/articlerescue","页面[[:"+pagename+"]]共有"+revlist.length+"个已删除版本,存档如下:\n----\n<table style='white-space:nowrap'><tr><td></td><td>'''编辑时分'''</td><td>'''用户'''</td><td>'''页面大小'''</td><td>'''版本号'''</td><td>'''编辑摘要'''</td></tr>"+reverseArray(indexpagecontentlist).join("")+"\n</table>\n----\n{"+"{subst:User:Bluedeck/infr/ar.thankyou.js}}","DRV lookup: [[:"+pagename+"]]");
	syncedit(glb.u+"/etc/articlerescue","{{user:bluedeck/infr/ph.js}}","-");
	console.log("All done: "+JSON.parse(finalrev).edit.newrevid);
	console.log("------------------------------");
	
	// record this artres into a json
	var timestamp=Date.now();
	var rvid=JSON.parse(finalrev).edit.newrevid;
	// appendJson(db.j0,[timestamp.toString(),rvid.toString(),pagename]);
	return rvid;
}

function app_articleRescue_toggle_initializer()
{
	var arr=document.getElementsByClassName("bluedeck-artres-artname");
	for(var i=0;i<arr.length;i++)
	{
		arr[i].innerHTML = "<span style='padding:0 10px;' onclick='if(confirm(\"本当にこれを実行しますか?\")){this.innerHTML=app_sync_old_articlerescue(this.innerHTML);}'>"+arr[i].innerHTML+"</span>";
		arr[i].style.display="inline";
	}
}

function app_articleRescue_archiver_initializer()
{
	var arr=document.getElementsByClassName("bluedeck-artres-archiveartres");
	for(var i=0;i<arr.length;i++)
	{
		arr[i].innerHTML = "<span style='padding:0 10px;' onclick='if(confirm(\"本当にこれを実行しますか?\")){lunchWindow();DS(302);}'>Clear Section 1</span>";
		arr[i].style.display="inline";
	}
}

function app_old_article_rescue_shell(pagename)
{
	var syncpost=function(url,body){var z1="Content-Type";var z2="application/x-www-form-urlencoded";var a=new XMLHttpRequest();a.open("POST",url,false);a.setRequestHeader(z1,z2);a.send(body);return a.responseText;}
	var syncedit=function(e_page,e_content,e_summary){return syncpost(glb.a,"action=edit&minor=1&bot=1&format=json&title="+eur(e_page)+"&text="+eur(e_content)+"&summary="+eur(e_summary)+"&token="+eur(takeToken()));}
	
}

function app_massEdit(pagelist,content,summary)
{
	for(var i=0;i<pagelist.length;i++)
	{
		edit(pagelist[i],content,summary,takeToken());
	}
}

function app_multiCRfixer()
{
	
}



//-----------------------------------------apps-until-this-line---------------------------------------

//-----------------------------------------imported-functions--------------------------------------



// msg: CTR
// nopad: true for not padding the message according to the sha 256 standard. 
// sha 384 and 512 not supported
// construction complete
// (implementation) author: bluedeck <bluedeck@outlook.com> published under CC-BY-SA 3.0

function SHA256(msg,nopad)
{
	// st for state, bk for big K.
	var st = [1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225];
	var bk = [1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298];
	
	var pp = function(m)		// pre pad
	{
		// pad
		var l = m.length*8;
		m = m.concat(128);
		while((m.length+8)%64!==0)
		{
			m = m.concat(0);
		}
		m = m.concat(0,0,0,0);
		m = m.concat(((l>>24)>>>0)&255,((l>>16)>>>0)&255,((l>>8)>>>0)&255,((l>>0)>>>0)&255);
		
		// divide by 512 bits or 64 bytes
		var n = [];
		for(var i=0;i<m.length/64;i++)
		{
			n[i] = [];
			for(var j=0;j<64;j++)
			{
				n[i][j]=m[64*i+j];
			}
		}
		
		// divide 1 block into 16 * 32 bits of messages 
		var p = [];
		for(i=0;i<n.length;i++)
		{
			p[i]=[];
			for(var j=0;j<n[i].length/4;j++)
			{
				p[i][j]=((n[i][4*j]<<24)|(n[i][4*j+1]<<16)|(n[i][4*j+2]<<8)|(n[i][4*j+3]));
			}
		}
		return p;
	};
	
	var ms = function(b)		// message schedule for one message block
	{
		var w = [];
		for(var i=0;i<16;i++)
		{
			w[i] = b[i];
		}
		for(i=16;i<64;i++)
		{
			w[i] = pl(s1(w[i-2]),w[i-7],s0(w[i-15]),w[i-16]);
		}
		return w;
	};
	
	var cp = function(s,w)		// compress
	{
		var a=s[0], b=s[1], c=s[2], d=s[3], e=s[4], f=s[5], g=s[6], h=s[7];
		for(var i=0;i<64;i++)
		{
			x = pl(h,S1(e),ch(e,f,g),bk[i],w[i]);
			y = pl(S0(a),mj(a,b,c));
			h = g;
			g = f;
			f = e;
			e = pl(d,x);
			d = c;
			c = b;
			b = a;
			a = pl(x,y);
		}
		return [pl(a,s[0]),pl(b,s[1]),pl(c,s[2]),pl(d,s[3]),pl(e,s[4]),pl(f,s[5]),pl(g,s[6]),pl(h,s[7])];
	};
	
	var ml = function()			// main loop
	{
		var m = pp(msg);
		var s = st;
		for(i=0;i<m.length;i++)
		{
			s = cp(s,ms(m[i]));
		}
		return s;
	};
	
	var pl = function(a,b,c,d,e)		// safe addition
	{
		if(!c)
		{
			c=0;
		}
		if(!d)
		{
			d=0;
		}
		if(!e)
		{
			e=0;
		}
		return (((((((a+b)%4294967296)+c)%4294967296)+d)%4294967296)+e)%4294967296;
	};
	
	var rt = function(a,b)		// right rotate
	{
		return ((a>>>b)|(a<<(32-b)))>>>0;
	};
	
	var ch = function(x,y,z)	// choice
	{
		return ((x&y)^((~x)&z))>>>0;
	};
	
	var mj = function(x,y,z)	// majority
	{
		return ((x&y)^(x&z)^(y&z))>>>0;
	};
	
	var S0 = function(x)		// Sigma 0
	{
		return (rt(x,2)^rt(x,13)^rt(x,22))>>>0;
	};
	
	var S1 = function(x)		// Sigma 1
	{
		return (rt(x,6)^rt(x,11)^rt(x,25))>>>0;
	};
	
	var s0 = function(x)		// sigma 0
	{
		return (rt(x,7)^rt(x,18)^(x>>>3))>>>0;
	};
	
	var s1 = function(x)		// sigma 1
	{
		return (rt(x,17)^rt(x,19)^(x>>>10))>>>0;
	};
	
	var rg = function(a)		// c08 from c32
	{
		var b = [];
		for(var i=0;i<8;i++)
		{
			b = b.concat(((a[i]>>24)>>>0)&255,((a[i]>>16)>>>0)&255,((a[i]>>8)>>>0)&255,((a[i]>>0)>>>0)&255);
		}
		return b;
	};
	
	if(!nopad)
	{
		return rg(ml());
	}

}