|
|
(5 intermediate revisions by the same user not shown) |
Line 1: |
Line 1: |
| // Modified version of [http://en.wikipedia.org/wiki/User:Ais523/editcount.js] by Elliott Hird/Elliottmobila
| |
|
| |
|
| //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://wiki.hydrogenaudio.org/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
| |
|
| |
| 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
| |
|
| |
| //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; reasonably useless at the moment because section edits
| |
| //can't be parsed
| |
| 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://wiki.hydrogenaudio.org/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","Last 1000","");
| |
| if(location.href.indexOf("&ais523sort=last1000")!=-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://wiki.hydrogenaudio.org/index.php?title=Special:Contributions"+
| |
| "&limit=1000&target="+trg+"&ais523sort=last1000";
| |
| }
| |
|
| |
| 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://wiki.hydrogenaudio.org/"+
| |
| m[2]+"'>"+m[2].split("_").join(" ")+"</A>"+m[5]+":";
| |
| a[m[4]]+=" [http://en.wikipedia.org"+m[1]+"]";
| |
| b[m[4]]+=" <A HREF='http://wiki.hydrogenaudio.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://wiki.hydrogenaudio.org/index.php?title=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;
| |
| }
| |
|
| |
| //</nowiki></pre>
| |