User:Bluedeck/serve/ar-admin.js

维基百科,自由的百科全书

注意:保存之后,你必须清除浏览器缓存才能看到做出的更改。Google ChromeFirefoxMicrosoft EdgeSafari:按住⇧ Shift键并单击工具栏的“刷新”按钮。参阅Help:绕过浏览器缓存以获取更多帮助。

// Author: Bluedeck <[email protected]> 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,"<","&lt;"),"{{","<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;

})();