User:Triadian/monobook.js
Appearance
Code that you insert on this page could contain malicious content capable of compromising your account. If you import a script from another page with "importScript", "mw.loader.load", "iusc", or "lusc", take note that this causes you to dynamically load a remote script, which could be changed by others. Editors are responsible for all edits and actions they perform, including by scripts. User scripts are not centrally supported and may malfunction or become inoperable due to software changes. A guide to help you find broken scripts is available. If you are unsure whether code you are adding to this page is safe, you can ask at the appropriate village pump. This code will be executed when previewing this page. |
The accompanying .css page for this skin can be added at User:Triadian/monobook.css. |
//Please leave this link: [[User:ais523/editcount.js]]
//<pre><nowiki>
//JavaScript edit counter. By [[User:ais523]].
//To install this, you can copy it into your monobook.js or use a script-inclusion
//method (see WikiProject User Scripts). It produces a 'count' tab on contribs pages
//that can be used to count a user's edits. It won't count more than 5000 edits in any
//namespace, to prevent excessive server load.
//Add LI Link and Add Tab, renamed to prevent conflicts. To make installation easier
//for people who haven't used User Scripts before.
function ecAddLILink(tabs, url, name, id, title, key){
var na = document.createElement('a');
na.href = url;
na.appendChild(document.createTextNode(name));
var li = document.createElement('li');
if(id) li.id = id;
li.appendChild(na);
tabs.appendChild(li);
if(id)
{
if(key && title)
{
ta[id] = [key, title];
}
else if(key)
{
ta[id] = [key, ''];
}
else if(title)
{
ta[id] = ['', title];
}
}
// re-render the title and accesskeys from existing code in wikibits.js
akeytt();
return li;
}
function ecAddTab(url, name, id, title, key){
var tabs = document.getElementById('p-cactions').getElementsByTagName('ul')[0];
return ecAddLILink(tabs, url, name, id, title, key)
}
addOnloadHook(function() {
if(location.href.indexOf("Special")!=-1&&location.href.indexOf("Contributions")!=-1)
ecAddTab("javascript:ais523contrib()","count","ca-ais523count","Count","");
});
//This function was orignally taken from [[User:Lupin/autoedit.js]]. I've renamed it
//because I know many users use popups, and I don't want to cause a naming conflict.
//Edited to decode + to space as well, and to use a decoding function that handles
//a broader range of characters.
function ecGetParamValue(paramName) {
var cmdRe=RegExp('[&?]'+paramName+'=([^&]*)');
var h=document.location;
var m;
if (m=cmdRe.exec(h)) {
try {
while(m[1].indexOf('+')!=-1)
{
m[1]=m[1].substr(0,m[1].indexOf('+'))+" "+m[1].substr(m[1].indexOf('+')+1);
}
return decodeURIComponent(m[1]);
} catch (someError) {}
}
return null;
};
function ais523contrib()
{
var u;
if(location.href.indexOf("?")!=-1) u=ecGetParamValue("target");
else u=location.href.substr(location.href.lastIndexOf("/")+1);
location.href="http://en.wikipedia.org/w/index.php?title=Special:Contributions&limit=5000&target="+u+"&ais523count=1&namespace=0";
}
//Analyses an edit summary and returns a two-letter code indicating what the edit seems
//to be doing. The edit summary is passed with parens round it, written in HTML. This
//doesn't yet work for section edits, which will have to be parsed out in the main
//function.
function ecAnalyseSummary(edsum)
{
edsum=edsum.toLowerCase();
if(edsum.indexOf("→")!=-1) return 'se'; //section edit, can't say any more than that
if(edsum==")") return 'se'; //section edit, no summary
if(edsum.indexOf(" ")==0) edsum="("+edsum.substr(1); //came from section
if(edsum.indexOf("(rvv")==0) return 'rv'; //vandalism revert
if(edsum.indexOf("(rv vand")==0) return 'rv'; //vandalism revert
if(edsum.indexOf("(revv")==0) return 'rv'; //vandalism revert
if(edsum.indexOf("(rev vand")==0) return 'rv'; //vandalism revert
if(edsum.indexOf("(revert vand")==0) return 'rv'; //vandalism revert
if(edsum.indexOf("(rv ")==0&&edsum.indexOf("vandal")!=-1) return 'rv';
if(edsum.indexOf("(rev ")==0&&edsum.indexOf("vandal")!=-1) return 'rv';
if(edsum.indexOf("(rv ")==0) return 'ro'; //other manual revert
if(edsum.indexOf("(rev ")==0) return 'ro'; //other manual revert
if(edsum.indexOf("(reverted ")==0) return 'ra'; //automatic revert
if(edsum.indexOf("(revert to ")==0) return 'ra'; //automatic revert, probably
if(edsum.indexOf("(revert edit(s) ")==0) return 'ra'; //per [[User:Qxz]]
if(edsum.indexOf("(revert")==0) return 'ro'; //guess manual for time being;
//I need more examples of this sort of rv
if(edsum.indexOf("(rm ")==0) return 'rm'; //removal
if(edsum.indexOf("(rem ")==0) return 'rm'; //removal
if(edsum.indexOf("(remove ")==0) return 'rm'; //removal
if(edsum.indexOf("(redir")==0) return 'rd'; //redirect, including redir auto-summary
if(edsum.indexOf("(#redir")==0) return 'rd'; //redirect, including redir auto-summary
if(edsum.indexOf('(<a href="/w')==0) return 'li'; //edit summary was a link
if(edsum.indexOf("(<a href='/w")==0) return 'li'; //edit summary was a link
if(edsum.indexOf('(<a href=/w')==0) return 'li'; //edit summary was a link
if(edsum.indexOf('{{welcome')!=-1) return 'we'; //welcome
if(edsum.indexOf('welcome}}')!=-1) return 'we'; //welcome
if(edsum.indexOf('(welcome')!=-1) return 'we'; //welcome
if(edsum.indexOf('welcome)')!=-1) return 'we'; //welcome
//User warnings are sorted by level. Other warnings and edit summaries are used;
//this is just a small beginning for now.
if(edsum.indexOf('test0')!=-1) return 'w0'; //warning 1
if(edsum.indexOf('test1')!=-1) return 'w1'; //warning 1
if(edsum.indexOf('test2')!=-1) return 'w2'; //warning 2
if(edsum.indexOf('test3')!=-1) return 'w3'; //warning 3
if(edsum.indexOf('test4')!=-1) return 'w4'; //warning 4
if(edsum.indexOf('test5')!=-1) return 'w5'; //warning 5
if(edsum.indexOf('test6')!=-1) return 'w6'; //warning 6
//Automated warnings
if(edsum.indexOf('(warning user using')==0) return 'wa'; //automated warning
//Prodding
if(edsum.indexOf('{'+'{prod')!=-1) return 'pr'; //prod
if(edsum.indexOf('(prod')!=-1) return 'pr'; //prod
//Some XfD-tagging summaries. So far I've only included the deletion-debates
//I'm familiar with.
if(edsum.indexOf('{'+'{afd}}')!=-1) return 'xf'; //XfD tagging
if(edsum.indexOf('{'+'{afd1')!=-1) return 'xf'; //XfD tagging
if(edsum.indexOf('(afd)')!=-1) return 'xf'; //XfD tagging
if(edsum.indexOf('{'+'{tfd}}')!=-1) return 'xf'; //XfD tagging
if(edsum.indexOf('(tfd)')!=-1) return 'xf'; //XfD tagging
if(edsum.indexOf('{'+'{md}}')!=-1) return 'xf'; //XfD tagging
if(edsum.indexOf('{'+'{md1')!=-1) return 'xf'; //XfD tagging
if(edsum.indexOf('(mfd)')!=-1) return 'xf'; //XfD tagging
if(edsum.indexOf('{'+'{rfd}}')!=-1) return 'xf'; //XfD tagging
if(edsum.indexOf('(rfd)')!=-1) return 'xf'; //XfD tagging
if(edsum.indexOf('for deletion')!=-1) return 'xf'; //XfD tagging
//Speedy deletions
if(edsum.indexOf('db-')!=-1) return 'sp'; //Speedy
if(edsum.indexOf('db|')!=-1) return 'sp'; //Speedy
if(edsum.indexOf('speedy')!=-1) return 'sp'; //Speedy (probably)
if(edsum.indexOf('{{delete}}')!=-1) return 'sp'; //override group de below
//Other deletion-related (removal of text, delete votes, etc.
if(edsum.indexOf('(del')!=-1) return 'de';
if(edsum.indexOf('delete')!=-1) return 'de';
if(edsum.indexOf('(d)')!=-1) return 'de';
if(edsum.indexOf('(d ')!=-1) return 'de';
if(edsum.indexOf('(-')==0) return 'de'; // as in -link
//Marked as additions
if(edsum.indexOf('(add ')!=-1) return 'ad';
if(edsum.indexOf(' add ')!=-1) return 'ad';
if(edsum.indexOf('(add)')!=-1) return 'ad';
if(edsum.indexOf(' add)')!=-1) return 'ad';
if(edsum.indexOf('(+')==0) return 'ad'; // as in +1
//Probable XfD votes to keep
if(edsum.indexOf('(k)')!=-1) return 'ke';
if(edsum.indexOf('(keep')!=-1) return 'ke';
if(edsum.indexOf("'keep'")!=-1) return 'ke'; //for when the user just copies their
//vote to the summary; also produced by
//WikiVoter
//Votes somewhere to support
if(edsum.indexOf('(support')!=-1) return 'su';
//to oppose
if(edsum.indexOf('(oppose')!=-1) return 'op';
if(edsum.indexOf("{"+"{")!=-1) return 'ta'; //unknown, marked as a tag
if(edsum.length<=6) return 'ab'; //unknown abbreviation <=4 chars + parens
return 'uk'; //unknown
}
//The main function; this actually counts the edits. The section at the end displays
//the results.
addOnloadHook(function() {
if(location.href.indexOf("ais523count")!=-1&&location.href.indexOf("ais523countres")==-1)
{
//Counting edits. Relies on the fact that <LI> with no arguments only appears
//at the start of a contrib line.
var contribs=0;
var nosum=0,oldnosum;
var sumloc;
var sortcount=new Array();
var bodyh=document.body.innerHTML;
while(bodyh.indexOf("<li>")!=-1)
{
contribs++;
oldnosum=nosum;
bodyh=bodyh.substr(bodyh.indexOf("<li>")+4);
sumloc=9999999;
if(bodyh.indexOf('<span class="comment">')!=-1)
sumloc=bodyh.indexOf('<span class="comment">');
if(bodyh.indexOf("<li>")<sumloc)
nosum++;
if(bodyh.indexOf("<li>")==-1&&sumloc!=9999999) nosum--; //last edit on page
if(nosum==oldnosum)
{ //Parse edit summary
var edsum=bodyh.indexOf('>',sumloc);
bodyh=bodyh.substr(edsum+1);
sumloc=bodyh.indexOf("</span>");
edsum=bodyh.substr(0,sumloc);
edsum=ecAnalyseSummary(edsum);
if(edsum=='se')
{
//jump to next </span>
bodyh=bodyh.substr(sumloc+7);
sumloc=bodyh.indexOf("</span>");
edsum=bodyh.substr(0,sumloc);
edsum=ecAnalyseSummary(edsum);
}
if(sortcount[edsum]==undefined) sortcount[edsum]=0;
sortcount[edsum]++;
}
}
bodyh=document.body.innerHTML;
//This is the way IE counts it.
while(bodyh.indexOf("<LI>")!=-1)
{
contribs++;
oldnosum=nosum;
bodyh=bodyh.substr(bodyh.indexOf("<LI>")+4);
sumloc=9999999;
if(bodyh.indexOf('<SPAN CLASS="comment">')!=-1) //a plausible format
sumloc=bodyh.indexOf('<SPAN CLASS="comment">');
if(bodyh.indexOf('<SPAN class=comment>')!=-1) //The IE method
sumloc=bodyh.indexOf('<SPAN class=comment>');
if(bodyh.indexOf("<LI>")<sumloc)
nosum++;
if(bodyh.indexOf("<LI>")==-1&&sumloc!=9999999) nosum--; //last edit on page
if(nosum==oldnosum)
{ //Parse edit summary
var edsum=bodyh.indexOf('>',sumloc);
bodyh=bodyh.substr(edsum+1);
sumloc=bodyh.indexOf("</SPAN>");
edsum=bodyh.substr(0,sumloc);
edsum=ecAnalyseSummary(edsum);
if(edsum=='se')
{
//jump to next </SPAN>
bodyh=bodyh.substr(sumloc+7);
sumloc=bodyh.indexOf("</SPAN>");
edsum=bodyh.substr(0,sumloc);
edsum=ecAnalyseSummary(edsum);
}
if(sortcount[edsum]==undefined) sortcount[edsum]=0;
sortcount[edsum]++;
}
}
var namespace=ecGetParamValue("namespace");
var scres="";
var scit;
for (scit in sortcount)
{
scres+="&cns"+namespace+scit+"="+sortcount[scit];
}
if(namespace!="101") //Portal talk
location.href=location.href.substr(0,location.href.lastIndexOf("namespace="))+
"countns"+namespace+"="+contribs+scres+"&countnosum"+namespace+"="+nosum+"&namespace="+(namespace=="15"?"100":1+new Number(namespace));
else
{
var lh=location.href;
location.href="http://en.wikipedia.org/wiki/User:ais523/results?ais523countres="+lh+"&countns101="+contribs+"&countnosum101="+nosum+scres;
//You can use a page other than [[User:ais523/results]] as long as it's in the
//correct format.
}
}
else if(location.href.indexOf("ais523countres=")!=-1)
{ //This relies on the template page [[User:ais523/results]] being in the
//correct format.
document.getElementById("ais523echead").style.display="none";
var h=document.getElementById("ais523ecbody").innerHTML;
while(h.indexOf("((")!=-1)
{
var i=h.indexOf("((");
var f=h.substr(0,i);
var g=h.substr(i+2,h.indexOf("))")-i-2);
if(g.indexOf('#d')==0)
{ //delete unwanted lines to remove clutter
var j=h.indexOf("((/#d))");
var v=false;
j=h.substr(i+6,j-i-2);
while(j.indexOf("((")!=-1)
{
var ii=j.indexOf("((");
var gg=j.substr(ii+2,j.indexOf("))")-ii-2);
j=j.substr(ii+2);
gg=ecGetParamValue(gg);
if(gg!=null&&gg!=0&&gg!='0') v=true;
}
if(v) g="";
else {h=h.substr(h.indexOf("((/#d")); g="";}
}
else if(g.indexOf("/#d")==0)
g="";
else if(g.indexOf("total")==0)
{
g=new Number(ecGetParamValue('countns0'));
g+=new Number(ecGetParamValue('countns1'));
g+=new Number(ecGetParamValue('countns2'));
g+=new Number(ecGetParamValue('countns3'));
g+=new Number(ecGetParamValue('countns4'));
g+=new Number(ecGetParamValue('countns5'));
g+=new Number(ecGetParamValue('countns6'));
g+=new Number(ecGetParamValue('countns7'));
g+=new Number(ecGetParamValue('countns8'));
g+=new Number(ecGetParamValue('countns9'));
g+=new Number(ecGetParamValue('countns10'));
g+=new Number(ecGetParamValue('countns11'));
g+=new Number(ecGetParamValue('countns12'));
g+=new Number(ecGetParamValue('countns13'));
g+=new Number(ecGetParamValue('countns14'));
g+=new Number(ecGetParamValue('countns15'));
g+=new Number(ecGetParamValue('countns100'));
g+=new Number(ecGetParamValue('countns101'));
}
else
g=ecGetParamValue(g);
if(g==null) g='0';
f+=g+h.substr(h.indexOf("))")+2);
h=f;
}
document.getElementById("ais523ecbody").innerHTML=h;
}
});
//JavaScript diff finder. By [[User:ais523]]
addOnloadHook(function() {
if(location.href.indexOf("Special")!=-1&&location.href.indexOf("Contributions")!=-1)
{
ecAddTab("javascript:ais523l1000()","last 1000","ca-ais523sort","Random diffs from recent edits","");
document.getElementById('ca-ais523sort').innerHTML=
"last <A HREF='javascript:ais523l1000()'>1000</A> "+
"<A HREF='javascript:ais523l2000()'>2000</A>";
}
if(location.href.indexOf("&ais523sort=last")!=-1)
window.setTimeout("ais523sort();",500); //work around IE bug
});
function ais523l1000()
{
var trg;
trg=ecGetParamValue('target');
if(trg==null) trg=location.href.substr(location.href.lastIndexOf("/")+1);
location.href="http://en.wikipedia.org/w/index.php?title=Special:Contributions"+
"&limit=1000&target="+trg+"&ais523sort=last1000";
}
function ais523l2000()
{
var trg;
trg=ecGetParamValue('target');
if(trg==null) trg=location.href.substr(location.href.lastIndexOf("/")+1);
location.href="http://en.wikipedia.org/w/index.php?title=Special:Contributions"+
"&limit=2000&target="+trg+"&ais523sort=last2000";
}
function ais523sort()
{
var s=document.body.innerHTML;
var re=/href="(\/w\/index\.php\?title=([^"/]*)((\/[^"]*)?)&diff=prev&oldid=[0-9]*)"/i;
var a=new Array();
var b=new Array();
var c=new Array();
var nc=new Array();
var d=new Array();
while(s.search(re)!=-1)
{
var m=s.match(re);
var m2="";
var q;
if(m[3]!='') m2=" subpages";
m[4]=decodeURIComponent(m[2])+m2;
m[5]=m2;
if(c[m[4]]==undefined) c[m[4]]=0;
if(c[m[4]]<10) q=c[m[4]];
else if(Math.random()<10/(c[m[4]]+1)) q=Math.floor(Math.random()*10);
else q=-1;
c[m[4]]++;
if(d[m[4]]==undefined) d[m[4]]=new Array();
if(q>-1) d[m[4]][q]=m;
s=s.substr(s.search(re)+2);
}
var i;
var j;
for(i in c)
{
if(c[i]<5)
{
for(j in d[i])
{
var ns="(main)";
var q;
if(d[i][j][4].indexOf(":")!=-1) ns=d[i][j][4].substr(0,d[i][j][4].indexOf(":"));
m=d[i][j];
m[2]="Others in namespace "+ns;
m[3]="";
m[4]=m[2];
m[5]="";
if(nc[m[4]]==undefined) nc[m[4]]=0;
if(nc[m[4]]<10) q=nc[m[4]];
else if(Math.random()<10/(nc[m[4]]+1)) q=Math.floor(Math.random()*10);
else q=-1;
nc[m[4]]++;
if(d[m[4]]==undefined) d[m[4]]=new Array();
if(q>-1) d[m[4]][q]=m;
}
}
}
for(i in d)
{
if(nc[i]!=undefined||c[i]>=5)
for(j in d[i])
{
var m=d[i][j];
m[2]=decodeURIComponent(m[2]);
if(a[m[4]]==undefined) a[m[4]]="*[[:"+m[2].split("_").join(" ")+"]]"+m[5]+":";
if(b[m[4]]==undefined) b[m[4]]="<LI><A HREF='http://en.wikipedia.org/wiki/"+
m[2]+"'>"+m[2].split("_").join(" ")+"</A>"+m[5]+":";
a[m[4]]+=" [http://en.wikipedia.org"+m[1]+"]";
b[m[4]]+=" <A HREF='http://en.wikipedia.org"+m[1]+"'>["+(new Number(j)+1)+"]</A>";
}
}
var e=0;
for(i in c)
{
if(c[i]>=5)
{
a[i]+=(c[i]>10?"...":"")+" ("+c[i]+" edit(s))\n";
b[i]+=(c[i]>10?"...":"")+" ("+c[i]+" edit(s))\n";
if(c[i]>e) e=c[i]+1;
}
}
for(i in nc)
{
if(nc[i]>=5)
{
a[i]+=(nc[i]>10?"...":"")+" ("+nc[i]+" edit(s))\n";
b[i]+=(nc[i]>10?"...":"")+" ("+nc[i]+" edit(s))\n";
}
}
var trg=ecGetParamValue('target');
var h="<H1>Contribution breakdown for <A HREF='http://en.wikipedia.org/wiki/User:"+trg;
h+="'>User:"+trg+"</A></H1>\n";
h+="<H2>HTML output</H2><UL>";
var j=e;
while(--j>=5)
{
for(i in c)
{
if(c[i]==j) h+=b[i];
}
}
for(i in nc) if(nc[i]>=5) h+=b[i];
j=e;
h+="</UL>\n<H2>Wikimarkup output</H2><pr"+"e>";
while(--j>=5)
{
for(i in c)
{
if(c[i]==j) h+=a[i];
}
}
for(i in nc) if(nc[i]>=5) h+=a[i];
h+="</p"+"re>";
document.body.innerHTML=h;
}
// Log counter.
function ais523log()
{
location.href="http://en.wikipedia.org/w/index.php?title=Special:Log&type=&user="+
document.getElementById('user').value+"&page=&limit=5000&offset=0&ais523log=count";
}
addOnloadHook(function() {
if(location.href.indexOf("ais523log")!=-1&&location.href.indexOf("ais523logres")==-1)
{
var h=document.body.innerHTML;
var i;
var j=new Array();
h=h.toLowerCase().split("<li>");
i=h.length;
while(--i)
{
h[i]=h[i].split("contribs</a>)")[1];
h[i]=h[i].split("<")[0].split('"').join("").split(" ").join("");
if(h[i]==""&&i+1==h.length) h[i]="newuseraccount";
else if(h[i]=="") h[i]="renamed"; //renames and original account creation are both ""
if(j[h[i]]==null||j[h[i]]==undefined) j[h[i]]=0;
j[h[i]]++;
}
h="";
for(i in j)
h+="<tr><td>"+i+"</td><td>"+j[i]+"</td></tr>";
location.href="http://en.wikipedia.org/wiki/User:ais523/logresults?ais523logres="+
encodeURIComponent(h);
}
else if(location.href.indexOf("ais523logres")!=-1)
document.getElementById("ais523ecbody").innerHTML=
"<table>"+decodeURIComponent(ecGetParamValue('ais523logres'))+"</table>";
else if(wgPageName=="Special:Log")
ecAddTab("javascript:ais523log()","count","ca-ais523log","Count","");
});
//</nowiki></pre>
//[[Category:Wikipedia scripts]]