User:Yair rand/TopEditors.js

// Get a list of the top editors of a set of articles linked to from a certain page.

// TODO: Filter out bots function getTopEditors( categoryTitle ) { var f = c => fetch( `https://en.wikipedia.org/w/api.php?action=query&format=json&list=categorymembers&cmnamespace=1&cmtitle=${ categoryTitle }&cmlimit=500`+(c?'&cmcontinue='+c:'')).then(x=>x.json).then(x=>{

var p = x.query.categorymembers.map( x => x.title.substr( 5 ) ); // p = p[ Object.keys(p)[0] ].links; if ( x.continue ) { return f( x.continue.cmcontinue ).then( r => p.concat( r ) ); } else { return p;   } }); f.then(x=>{ var allRevs = []; var getRevs = ( t, c ) => fetch(        `https://en.wikipedia.org/w/api.php?action=query&format=json&prop=revisions&titles=${ t }&rvprop=user&maxlag=5&rvlimit=500&rvstart=${new Date('2021').toISOString}&rvend=`+new Date('2020').toISOString + ( c || '' )      ).then( x => x.json ).then( x => {        var y = x.query && x.query.pages,          revs = y && y[ Object.keys( y )[ 0 ] ].revisions || [];        return x.continue ? getRevs( t, '&rvcontinue='+x.continue.rvcontinue ).then( a => revs.concat( a ) ) : revs;      } ); var nextPage = => { var page = x.shift; if ( page ) { return getRevs( page ).then( x => { allRevs.push( ...x ); return nextPage } ); } else { return allRevs; }   };    return nextPage .then( x => {       var results = {};        x.forEach( rev => { results[ rev.user ] = results[ rev.user ] || 0; results[ rev.user ]++; } );       return results;      } ); }).then( x=> { console.log( Object.keys(x).sort((a,b)=>x[b]-x[a]).map(a=>[a,x[a]]).map((a,i)=>`|- `).join('') ); } ); }
 * ${i+1}
 * User:${a[0]}
 * ${a[1]}

// Use a list of all medical articles getTopEditors( 'Category:All_WikiProject_Medicine_articles' );