User:Bluedeck/serve/ar-admin.js
注意:保存之后,你必须清除浏览器缓存才能看到做出的更改。Google Chrome、Firefox、Microsoft Edge及Safari:按住⇧ Shift键并单击工具栏的“刷新”按钮。参阅Help:绕过浏览器缓存以获取更多帮助。
// Author: Bluedeck <bluedeck@outlook.com> Licence: CC-BY-SA 3.0, 4.0, 随你便
// 如何使用:importScript这个页面,在侧边栏中可见 Article rescue 链接,(效果:i.imgur.com/BHxGuFW.png)
// 点击后再小框内输入 Wikipedia:test,即可找回[[Wikipedia:test]]的已删除版本,
// 找回成功后,会有弹窗提示版本,这个就是找回页面的入口版本。
//
// 警告:这个功能采用sync xhr通信,因此会把你的浏览器冻住!冻住一些秒之后解冻:)
// 请使用 /serve/ar-admin-2.js,这是个async版本,不会冻住你的浏览器!
(function(ele, txt, time, condition){
if(!condition) return;
ele.innerHTML = "";
(function(ele, txt, time){
txt = txt.split("");
var len = txt.length, rate = time/len;
for(var i=0; i<len; i++) setTimeout(function(){ele.innerHTML += txt.shift();}, i*rate);
})(ele, txt, time);
})(document.getElementById("ar_admin"), "2017.10.4 / iv21-abs,sem0-1,pat0", 400, document.getElementById("8c23b4144bd58c689e192c6ab912a3b75c76f6849977518b8bedefd5e347d67f"));
window.article_rescue = (function(){
"use strict";
var glb={};
glb.url = mw.config.values.wgServer;
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 replaceString(a,b,c)
{
return a.split(b).join(c);
}
function replaceString_regulateWikitext(a)
{
return replaceString(replaceString(replaceString(replaceString(replaceString(a,"<","<"),"{{","<nowiki>{{</nowiki>"),"~~","~<!---->~"),"[[","[[:"),"[[::","[[:");
}
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){}
var eur=encodeURIComponent;
var requests=new Array();
preparePageData();
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);
}
function loadTokenSilently()
{
var f=function(){
if(this.readyState===4){
try {
glb.t=JSON.parse(this.responseText).query.tokens.csrftoken;
} catch (e) {
glb.t = 'undefined'
return;
}
}
};
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 edit(a,b,c,d,f)
{
ding("Requesting page edit for: "+a+" Summary: "+c,1);
if(!f){f=function(){if(this.readyState===4){ding("Following page edited: "+a+" Detail: "+this.responseText)}};}
if(!d){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);
}
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_sync_old_articlerescue(pagename) // shikata nai~
{
var HISTORY_STORAGE_PAGE = "Wikipedia:已删除内容查询/查询/" + pagename;
var INDEX_STORAGE_PAGE = "Wikipedia:已删除内容查询/查询/" + pagename;
var PLACEHOLDER = "{" + "{CSD placeholder}}";
var FINAL_PLACEHOLDER = false;
var log_line = function(){console.log("------------------------------");};
console.log("starting sync artres procedure on " + pagename);
log_line();
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.");
log_line();
var indexpagerevlist=[];
var indexpagecontentlist=[];
syncedit(HISTORY_STORAGE_PAGE,PLACEHOLDER,"-");
for(var i=0;i<revlist.length;i++)
{
indexpagerevlist[i]=JSON.parse(syncedit(HISTORY_STORAGE_PAGE,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]);
}
log_line();
syncedit(HISTORY_STORAGE_PAGE,PLACEHOLDER,"-");
console.log("Please wait while the index page is being created...");
syncedit(INDEX_STORAGE_PAGE,PLACEHOLDER,"-");
log_line();
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(INDEX_STORAGE_PAGE,"页面[[:"+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+"]]");
FINAL_PLACEHOLDER ? syncedit(INDEX_STORAGE_PAGE,PLACEHOLDER,"-") : void null;
console.log("All done: "+JSON.parse(finalrev).edit.newrevid);
log_line();
return JSON.parse(finalrev).edit.newrevid;
}
var article_rescue = function()
{
var page = prompt("Page name: ", mw.config.values.wgPageName), rev = "";
if(page)
{
try
{
rev = app_sync_old_articlerescue(page).toString();
}
catch(e)
{
alert("Failed. Specified page does not have deleted revisions.");
return;
}
alert("Done: " + rev);
}
};
var ar_link = "<li><a href='javascript:article_rescue()'>Article rescue</a></li>";
try {
document.getElementById("p-tb-label").nextElementSibling.firstElementChild.lastElementChild.insertAdjacentHTML("afterend", ar_link);
} catch ( e ) {
// TypeError: null is not an object (evaluating 'document.getElementById("p-tb-label").nextElementSibling')
}
return article_rescue;
})();