User:PerfektesChaos/js/autoBackup/r.js
/// User:PerfektesChaos/js/autoBackup/r.js
/// 2019-07-01 PerfektesChaos@de.wikipedia
/// Fingerprint:#0#2860E0F5#
/// @license:CC-by-sa/4.0
///
(function(mw,$){
"use strict";
var VERSION=2.3,BAK="autoBackup";
if(typeof mw.libs[BAK]!=="object"||!mw.libs[BAK]){
mw.libs[BAK]={};}
mw.libs[BAK].type=BAK;
BAK=mw.libs[BAK];
BAK.doc="w:en:User:PerfektesChaos/js/"+BAK+"";
BAK.vsn=VERSION;
BAK.cnf={maxAge:72,maxHist:5,maxPages:10,maxRev:3,mid:5,msec:300000};
BAK.disk={self:"AutoBackupPerfectChaos",stick:"newest|subject"};
BAK.gui={};
BAK.util={};
if(!typeof BAK.opt||typeof BAK.opt!=="object"){
BAK.opt={};}
BAK.cnf.text={
"BAKself":{"en":"AutoBackup",
"de":"AutoBackup"},
"IntJSONparse":{"en":"Internal ERROR -- JSON.parse",
"de":"Interner FEHLER -- JSON.parse"},
"NoLSavail":{"en":"No localStorage available",
"de":"Kein localStorage zugreifbar"},
"otherPages":{"en":"Other Pages",
"de":"Andere Seiten"},
"pending":{"en":"Recover from pending abort?",
"de":"Wiederherstellung nach Abbruch?"},
"setItemExcept":{"en":"ERROR setting localStorage",
"de":"FEHLER beim Setzen im localStorage"},
"thisPage":{"en":"this page",
"de":"diese Seite"},
"VanishedLS":{"en":"ERROR: localStorage vanished",
"de":"FEHLER: localStorage verschwunden"},
"WriteCrash":{"en":"Crash on localStorage write attempt",
"de":"Schreibversuch auf localStorage versagt"}
};
BAK.cnf.translang={
"de":"de",
"de-at":"de",
"de-ch":"de",
"de-formal":"de",
"als":"de",
"bar":"de",
"dsb":"de",
"frr":"de",
"gsw":"de",
"hsb":"de",
"ksh":"de",
"lb":"de",
"nds":"de",
"pdc":"de",
"pdt":"de",
"pfl":"de",
"sli":"de",
"stq":"de",
"vmf":"de"
};
BAK.cnf.favorite=function(){
var s;
if(!this.slang){
s=mw.config.get("wgUserLanguage").toLowerCase();
s=this.translang[s];
if(s){
this.slang=s;
}else{
this.slang="en";}}
};
BAK.cnf.feature=function(apply){
var e,r;
if(!this.slang){
this.favorite();}
e=this.text[apply];
if(e){
r=e[this.slang];
if(!r){
r=e.en;
if(!r){
r="???"+apply+"???";}}
}else{
r="***"+apply+"***";}
return r;
};
BAK.cnf.fetch=function(){
if(!this.load){
if(typeof BAK.opt==="object"){
if(typeof BAK.opt.maxAge==="number"){
if(BAK.opt.maxAge>=0){
this.maxAge=Math.floor(BAK.opt.maxAge);}}
if(typeof BAK.opt.maxHist==="number"){
if(BAK.opt.maxHist>=1){
this.maxHist=Math.ceil(BAK.opt.maxHist);}}
if(typeof BAK.opt.maxPages==="number"){
if(BAK.opt.maxPages>=1){
this.maxPages=Math.ceil(BAK.opt.maxPages);}}
if(typeof BAK.opt.maxRev==="number"){
if(BAK.opt.maxRev>=1){
this.maxRev=Math.ceil(BAK.opt.maxRev);}}
if(BAK.learn){
if(typeof BAK.opt.mid==="number"){
if(BAK.opt.mid>0){
this.mid=BAK.opt.mid;
}else{
this.mid=false;}}
if(this.mid){
this.msec=this.mid*60000;
}else{
this.msec=false;}
if(BAK.opt.portlet){
BAK.gui.facility();}}}
this.load=true;}
};
BAK.disk.fetch=function(){
var s;
BAK.pages=false;
if(typeof window.localStorage==="object"){
BAK.family();
s=window.localStorage.getItem(this.storage);
if(s){
try{
BAK.pages=JSON.parse(s);
}catch(e){
BAK.gui.flag("IntJSONparse",false);
window.localStorage.setItem(this.storage,"");}}
}else{
BAK.gui.flag("NoLSavail",false);
this.lock=true;}
};
BAK.disk.flush=function(){
var store=false,s;
if(typeof BAK.pages==="object"){
for(s in BAK.pages){
store=true;
break;}}
if(!store){
this.pages=false;}
if(typeof window.localStorage==="object"){
if(BAK.pages){
store=JSON.stringify(BAK.pages);
if(store==="{}"){
store="";}
}else{
store="";}
try{
window.localStorage.setItem(this.storage,store);
s=window.localStorage.getItem(this.storage);
if(s!==store){
BAK.gui.flag("WriteCrash",false);}
}catch(e){
BAK.gui.flag("setItemExcept",false);}
window.localStorage.setItem(this.storage,store);
}else{
BAK.gui.flag("VanishedLS",false);}
};
BAK.gui.face=function(apply){
var s;
if(!this.$div){
mw.util.addCSS(".cn-fundraiser-banner,#mw-js-message,#siteNotice,#fundraising\n{display: none ! important;}");
this.$div=$("
");if(!this.$top){
this.$top=$("#mw-content-text");
if(this.$top.length){
this.$top.prepend(this.$div);
}else{
this.$top=$("#bodyContent");
if(!this.$top.length){
this.$top=$("#article");
if(!this.$top.length){
this.$top=$("#content");
if(!this.$top.length){
this.$top=BAK.$page;}}}
this.$top.before(this.$div);}}}
if(apply){
if(this.$msg){
this.$msg.empty();
}else{
this.$msg=$("
");this.$div.prepend(this.$msg);}
if(this.$msg){
s="display: block;font-size: 120%;";
this.$msg.attr("style",s);
this.$msg.append(apply);}
}else{
if(this.$msg){
this.$msg.attr("style","display: none;");}}
};
BAK.gui.facility=function(){
var portlet,$portlet;
if(!BAK.cnf.self){
BAK.cnf.self=BAK.cnf.feature("BAKself");}
portlet=mw.util.addPortletLink("p-cactions","#",BAK.cnf.self,"ca-"+BAK.type);
$portlet=$(portlet);
$portlet.click(BAK.fresh);
$portlet.attr({title:BAK.type+" "+BAK.vsn});
};
BAK.gui.feed=function(){
var r=false,$form,$ta;
if(this.leading){
this.leading=false;
this.$editform=false;
this.$textarea=false;
$form=BAK.$page.find("#editform");
if($form){
$ta=BAK.$page.find("#wpTextbox2");
if($ta.length){
r=$ta.val();}
$ta=$form.find("#wpTextbox1");
if($ta.length){
if(!$ta.attr("readonly")){
this.$editform=$form;
this.$textarea=$ta;}}}}
if(this.$textarea&&!r){
if(window.wikEd&&typeof window.wikEd==="object"&&!window.wikEd.disabled&&window.wikEd.turnedOn&&window.wikEd.useWikEd&&window.wikEd.UpdateTextarea){
window.wikEd.UpdateTextarea();}
r=this.$textarea.val();}
return r;
};
BAK.gui.fence=function(apply){
this.$div.attr("style",(apply?"border: solid 1px #606060; border-bottom: solid 5px #606060; padding: 0.5em; margin-bottom: 2em;":null));
};
BAK.gui.fiat=function(action,add){
var r;
switch(action){
case "ALL":
case "SHOW":
r="*";
break;
case "DELETE":
r="X";
break;
default:
r="";}
if(r){
r="\n \n";}
return r;
};
BAK.gui.fill=function(){
var page=BAK.pages[BAK.pageID],revs=false,i,n,s;
BAK.gui.$msg.find("#autoBackupALL").remove();
if(BAK.gui.$box){
BAK.gui.$box.remove();}
if(page){
BAK.gui.$box=$("
");BAK.gui.$msg.after(BAK.gui.$box);
if(!BAK.revID){
BAK.revID=mw.config.get("wgCurRevisionId");}
for(i in page){
if(BAK.disk.stick.indexOf(i)<0){
s=page[i].newest+" "+i;
if(revs){
revs.push(s);
}else{
revs=[s];}}}
n=revs.length;
revs.sort();
for(i=revs.length-1;i>=0;i--){
BAK.gui.folder(revs[i],page);}
BAK.gui.fence(true);
}else{
BAK.gui.face(false);}
};
BAK.gui.finish=function(access){
var $btn=this.$editform.find("#"+access);
if($btn.length){
$btn.click(BAK.fresh);}
};
BAK.gui.flag=function(apply,action){
var s;
if(!BAK.cnf.self){
BAK.cnf.self=BAK.cnf.feature("BAKself");}
s=BAK.cnf.feature(apply);
s="
this.face(s);
if(action){
this.form(action,"");}
};
BAK.gui.folder=function(access,album){
var e=access.split(" "),k=e[1],s="autoBackupR"+k,i,w,$div,$textarea;
this.$box.append("
");$div=this.$box.find("#"+s);
if(parseInt(k,10)===BAK.revID){
s=k+" ("+BAK.cnf.feature("thisPage")+")";
}else{
s=mw.config.get("wgArticlePath");
s=""+k+"";}
s="
oldid="+s+"
";s=s+this.fiat("DELETE",k);
$div.append(s);
this.form("DELETE",k);
e=album[k].history;
for(i=0;i k=e[i]; w=k[1]; s=" "+w.length+" bytes"+BAK.util.focus(k[0])+"
$div.append(s);
$textarea=$("");
$textarea.val(w);
$div.append($textarea);}
this.full();
};
BAK.gui.form=function(action,add){
var fun=false,sign,$btn;
switch(action){
case "ALL":
fun=this.fill;
break;
case "DELETE":
sign="DELETE"+add;
fun=function(){BAK.fixed(add);};
BAK[sign]=fun;
break;
case "SHOW":
break;}
if(fun){
$btn=this.$top.find("#autoBackup"+action+add);
if($btn.length){
$btn.click(fun);}}
};
BAK.gui.full=function(){
var e,g,i,p,s,u,$x;
if(BAK.pages){
g=false;
s=""+BAK.pageID;
for(i in BAK.pages){
if(i!==s){
p=BAK.pages[i];
if(p.subject){
if(!this.reSpace){
this.reSpace=new RegExp(" +","g");}
e=" "+p.subject.replace(this.reSpace,"_");
}else{
e="";}
e=p.newest+" "+i+e;
if(g){
g.push(e);
}else{
g=[e];}}}
if(g){
s="
"+BAK.cnf.feature("otherPages")+"
\nthis.$div.append(s);
$x=this.$div.find("#autoBackupPageList");
u=""+s+" ";
}else{
s="curid="+u+"curid="+s+"'>"+s+" ";
if(p[2]){
s=s+"("+p[2].replace(/_/g," ")
.replace(/
s="
$x.append(s);}}
this.fence(true);}
};
BAK.gui.further=function(){
if(this.$editform){
this.finish("wpDiff");
this.finish("wpPreview");
this.finish("wpSave");
this.$editform.find(".mw-summary").focusin(BAK.fresh);}
};
BAK.util.figure=function(ask){
return(/^[0-9]+$/).test(ask);
};
BAK.util.flat=function(album,amount,arrange){
var e,i,k,s;
if(arrange){
k=arrange.length-amount;
if(k>0){
arrange.sort();
for(i=0;i<=k;i++){
e=arrange[i];
s=e.split(" ");
delete album[s[1]];}}}
};
BAK.util.focus=function(appoint){
var r=appoint+" UTC",s=typeof BAK.cnf.justify,g;
if(s!=="boolean"&&s!=="number"){
BAK.cnf.justify=false;
if(typeof mw.user==="object"){
if(mw.user.options){
s=mw.user.options.get("timecorrection");
if(s){
g=/\|?([0-9]+)$/.exec(s);
if(g){
BAK.cnf.justify=parseInt(g[1],10);}}}}}
if(BAK.cnf.justify===0){
r=appoint;
}else if(typeof BAK.cnf.justify==="number"){
g=/^([0-9]+)-([01][0-9])-([0-3][0-9])T([0-2][0-9]):([0-6][0-9]):([0-6][0-9])$/.exec(appoint);
if(g){
r=Date.UTC(parseInt(g[1],10),parseInt(g[2],10)-1,parseInt(g[3],10),parseInt(g[4],10),parseInt(g[5],10)+BAK.cnf.justify,parseInt(g[6],10));
r=this.format(new Date(r));}}
return r;
};
BAK.util.format=function(appoint){
var r=appoint.getUTCFullYear()+"-",i=appoint.getUTCMonth()+1;
if(i<10){
i="0"+i;}
r=r+i+"-";
i=appoint.getUTCDate();
if(i<10){
i="0"+i;}
r=r+i+"T";
i=appoint.getUTCHours();
if(i<10){
i="0"+i;}
r=r+i+":";
i=appoint.getUTCMinutes();
if(i<10){
i="0"+i;}
r=r+i+":";
i=appoint.getUTCSeconds();
if(i<10){
i="0"+i;}
return r+i;
};
BAK.family=function(){
var env;
if(!this.pageID){
env=mw.config.get(["wgArticleId","wgPageName"]);
this.pageID=env.wgArticleId;
this.pageName=env.wgPageName;
if(this.pageID===0){
this.pageID="0_"+this.pageName.replace(/~/,"%7E");}}
};
BAK.fast=function(){
var r=true,s=window.sessionStorage.getItem(this.disk.storage),q;
if(s){
r=(s.length>1);
if(r){
if(!this.pageID){
this.pageID=mw.config.get("wgArticleId");}
r=(s.indexOf("~"+this.pageID+"~")>=0);
if(!r){
if(s.indexOf("~0_")>=0){
if(!BAK.pageName){
BAK.pageName=mw.config.get("wgPageName");}
q="0_"+BAK.pageName.replace(/~/,"%7E");
if(s.indexOf("~"+q+"~")>=0){
r=true;
this.later=true;}}}}}
return r;
};
BAK.filter=function(){
var lazy=true,store="~",hist,page,pid,revs,rid,sift,stamp;
this.cnf.fetch();
if(this.cnf.maxAge){
if(!this.now){
this.now=new Date();}
sift=Date.UTC(this.now.getUTCFullYear(),this.now.getUTCMonth(),this.now.getUTCDate(),this.now.getUTCHours()-this.cnf.maxAge,0,0);
sift=this.util.format(new Date(sift));
}else{
sift="1970-01-01T00:00:00";}
for(pid in this.pages){
page=this.pages[pid];
if(page.newest delete this.pages[pid]; }else{ revs=false; for(rid in page){ if(this.disk.stick.indexOf(rid)<0){ stamp=page[rid].newest; if(stamp>sift){ stamp=stamp+" "+rid; if(revs){ revs.push(stamp); }else{ revs=[stamp];} }else{ delete page[rid];}}} if(revs){ page=page.newest+" "+pid; if(hist){ hist.push(page); }else{ hist=[page];} this.util.flat(page,this.cnf.maxRev,revs); store=store+pid+"~"; lazy=false; }else{ delete this.pages[pid];}}} this.util.flat(this.pages,this.cnf.maxPages,hist); window.sessionStorage.setItem(this.disk.storage,store); if(lazy&&this.gui.$div){ this.gui.fence();} }; BAK.finalize=function(already,add){ var k=add.length,r=add,i; for(i=k;i>0;i--){ if(add.charCodeAt(i-1)>32){ break;}} if(i>1){ if(i r=add.substr(0,i);} if(already){ if(i===already.length){ if(r===already){ r=false;}}} }else{ r=false;} return r; }; BAK.find=function(){ var q=new mw.Api(),w={action:"query", "continue":"", pageids:this.pageID,prop:"revisions",rvlimit:3,rvuser:mw.util.wikiUrlencode(mw.config.get("wgUserName")) }; if(this.later){ delete w.pageids; w.titles=this.pageName; q.get(w).done(this.founder); }else{ q.get(w).done(this.found);} }; BAK.first=function(){ this.$editform=false; this.disk.fetch(); if(this.pages){ if(this.pages[this.pageID]){ this.find();}} if(typeof mw.user==="object"){ if(mw.user.options&&mw.user.options.get("uselivepreview")){ this.livePreview=true; $(mw).bind("LivePreviewDone",this.fresh);}} this.gui.leading=true; mw.hook("wikipage.content").add(this.fresh); }; BAK.fixed=function(apply){ var p; this.gui.$top.find("#autoBackupR"+apply).remove(); if(this.pages){ p=this.pages[BAK.pageID]; if(p){ if(p[apply]){ delete p[apply]; this.disk.launch=true; this.flush(); if(!this.pages){ this.gui.fence(false); }else if(!this.pages[BAK.pageID]){ this.gui.face(false);}}}} }; BAK.flush=function(){ if(this.disk.launch){ if(this.pages){ this.filter();} this.disk.flush();} }; BAK.folder=function(){ BAK.gui.face(); if(!BAK.gui.$msg){ if(!BAK.cnf.self){ BAK.cnf.self=BAK.cnf.feature("BAKself");} BAK.gui.$div.prepend(" BAK.gui.fill(); BAK.gui.filter(); BAK.gui.full(); }; BAK.follow=function(){ var h,i,p; this.disk.fetch(); if(this.later){ this.find(); }else if(this.pages){ p=this.pages[this.pageID]; if(p){ this.revID=mw.config.get("wgCurRevisionId"); for(h in p){ i=parseInt(h,10); if(i){ if(this.revID>i){ this.find(); break; }else if(this.revID===i){ this.gui.flag("pending","ALL"); break;}}}}} }; BAK.found=function(arrived){ var query=(typeof arrived==="object"),learnt=false,i; if(query){ query=arrived.query; if(query){ query=query.pages[BAK.pageID]; if(query){ query=query.revisions; if(query){ for(i=0;i if(query[i].revid===BAK.revID){ learnt=true; delete BAK.pages[BAK.pageID]; BAK.disk.launch=true; break;}}}}}} BAK.flush(); if(!learnt){ BAK.gui.flag("pending","ALL");} }; BAK.founder=function(arrived){ var query=(typeof arrived==="object"),learnt=false; if(query){ query=arrived.query; if(query){ query=query.pages[BAK.pageID]; if(query){ BAK.pageID="0_"+BAK.pageName.replace(/~/,"%7E"); delete BAK.pages[BAK.pageID]; BAK.disk.launch=true; learnt=true;}}} BAK.flush(); if(!learnt){ BAK.gui.flag("pending","ALL");} }; BAK.fresh=function(){ var shot=BAK.gui.feed(),page,revs,stamp; if(shot){ BAK.family(); BAK.revID=mw.config.get("wgCurRevisionId"); if(!BAK.pages){ BAK.disk.fetch();} if(!BAK.pages){ BAK.pages={};} if(!BAK.pages[BAK.pageID]){ BAK.pages[BAK.pageID]={};} page=BAK.pages[BAK.pageID]; if(!page[BAK.revID]){ page[BAK.revID]={};} revs=page[BAK.revID].history; if(revs){ shot=BAK.finalize(revs[0][1],shot); if(shot){ BAK.now=new Date(); stamp=BAK.util.format(BAK.now); BAK.cnf.fetch(); if(revs.length>=BAK.cnf.maxHist-1){ revs.pop();} revs.unshift([stamp,shot]);} }else{ shot=BAK.finalize(false,shot); if(shot){ BAK.now=new Date(); stamp=BAK.util.format(BAK.now); revs=stamp,shot;}} if(shot){ page[BAK.revID].history=revs; page[BAK.revID].newest=stamp; page.newest=stamp; page.subject=BAK.pageName; BAK.pages[BAK.pageID]=page; BAK.disk.launch=true; BAK.flush();} if(BAK.cnf.msec){ if(BAK.timeoutID){ window.clearTimeout(BAK.timeoutID);} BAK.timeoutID=window.setTimeout(BAK.fresh,BAK.cnf.msec);}} }; BAK.further=function(){ if(!this.learnt){ this.learnt=true; if(this.gui.$editform){ this.gui.further(); this.cnf.fetch(); if(this.cnf.msec){ window.setTimeout(this.fresh,this.cnf.msec);}}} }; BAK.fire=function(){ var env=mw.config.get(["wgAction","wgIsArticle","wgUserName"]); BAK.disk.storage=BAK.disk.self+" "+env.wgUserName; if(env.wgIsArticle){ if(env.wgAction==="view"&&BAK.fast()){ BAK.follow();} }else{ BAK.start=mw.util.getParamValue("action"); if(BAK.start){ BAK.learn=true; if("|edit|submit|".indexOf(BAK.start)>0){ mw.hook("wikipage.content").add(BAK.firing);}}} }; BAK.firing=function($all){ BAK.$page=$all; switch(BAK.start){ case "submit": BAK.gui.leading=true; BAK.fresh(); BAK.further(); break; case "edit": BAK.first(); BAK.further();} }; function first(){ var signature="ext.gadget."+BAK.type,rls; if(mw.loader.getState(signature)!=="ready"){ rls={}; rls[signature]="ready"; mw.loader.state(rls); if(mw.config.get("wgNamespaceNumber")>=0){ mw.loader.using(["user","mediawiki.api","mediawiki.user","mediawiki.util"],BAK.fire);}}} first(); }(window.mediaWiki,window.jQuery)); /// EOFautoBackup/r.js"+BAK.cnf.self+"
");}