MediaWiki:Gadget-contribsrange.js

Från Wikipedia

OBS: Efter du har publicerat sidan kan du behöva tömma din webbläsares cache för att se ändringarna.

  • Firefox / Safari: Håll ned Skift och klicka på Uppdatera sidan eller tryck Ctrl-F5 eller Ctrl-R (⌘-R på Mac)
  • Google Chrome: Tryck Ctrl-Skift-R (⌘-Skift-R på Mac)
  • Internet Explorer / Edge: Håll ned Ctrl och klicka på Uppdatera eller tryck Ctrl-F5
  • Opera: Tryck Ctrl-F5.
//  _________________________________________________________
// |                                                         |
// |              === WARNING: GADGET FILE ===               |
// |         Changes to this page affect many users.         |
// | Please discuss changes on the talk page before editing. |
// |_________________________________________________________|
//
// Imported from version 312947638 as of September 10, 2009 from [[User:Splarka/contribsrange.js]]
// Imported from http://de.wikipedia.org/w/index.php?title=MediaWiki:Gadget-contribsrange.js&oldid=68811790 by GameOn 110831
// See notes below

/* Special:Contributions Wildcard/CIDR lookup, version [0.2.7]
Originally from: http://en.wikipedia.org/wiki/User:Splarka/contribsrange.js

Notes:
* Uses the API which is faster than most CIDR contrib tools.
** Needs 1.14 r42198+ for advanced continue.
* Currently uses a GET json via <script src=""> to avoid ajax problems.
* Only currently works if submitted (or called by URL parameter, eg Special:Contributions/User).
** Checks namespace and date options in form.
** Also utilizes &ucstart and &ucend date parameters if supplied manually (not supported in the UI atm).
*** These parameter soverride the form date options.
* Uses: Submit any IP CIDR range /16 or from /24 to /32. Submit any string (at least 3 characters) with a suffixed asterisk.
** eg: [123.123.123.0/24 ] or [123.123.123.* ] or [Willy* ].
* Now keeps searching until it finds crMax (or forever with crshowall=true URI parameter).
** Puts them in a nice collapsed div stack, like enhanced recent changes.
* /25 and /26 ranges now disabled, since they are inaccurate (50 parameter limit), please use /24 (ucuserprefix) or /27 (32 parameters)

To do:
* use ajax (let sysops/bots = 5000)?
*/

if ( mw.config.get( 'wgCanonicalSpecialPageName' ) == 'Contributions' ) { 
	var crLimit = 500; //limit for each query
	var crMax = 10000; //bypass with &crshowall=true URI parameter
	$( prefixContribsInit );
}

function prefixContribsInit() {
	$( 'fieldset .mw-contributions-table' ).prepend( '\u2022 Du kan söka efter ett IP-intervall (ex. 123.45.67.1/30) eller genom jokertecken (ex. 123.45.67.*).' );
	var ucfrm = document.getElementsByTagName( 'form' )[ 0 ];
	if ( !ucfrm.target ) {
		return;
	}

	//general optionlets independent of type of search.
	var apioptions = {};
	apioptions.action = 'query';
	apioptions.format = 'json';
	apioptions.list = 'usercontribs';
	apioptions.rawcontinue = '';
	apioptions.uclimit = crLimit;
	apioptions.ucnamespace = ucfrm.namespace.value;
	apioptions.ucstart = ucfrm.start.value + 'T00:00:00Z';
	apioptions.ucend = ucfrm.end.value + 'T00:00:00Z';
	
	if ( queryString( 'ucstart' ) ) {
		apioptions.ucstart = encodeURIComponent( queryString( 'ucstart' ) );
		apioptions.ucdir = 'newer';
	}
	if ( queryString( 'ucend' ) ) {
		apioptions.ucend = encodeURIComponent( queryString( 'ucend' ) );
		apioptions.ucdir = 'newer';
	}

	var patternCIDR = /(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\/(2[7-9]|3[0-2]|24|16)/i ;
	var patternWild = /^.{3,}\*$/i ;

	if ( ucfrm.target.value.search( patternCIDR ) == 0 ) {
		prefixContribsStartbox( ucfrm.parentNode );
		var cidr = ucfrm.target.value.match( patternCIDR )[ 0 ];
		var range = cidr.match( /[^\/]\d{1,2}$/i )[ 0 ];
		if ( range == 24 || range == 16 ) {
			//prefixable CIDR, lets do-er
			if ( range == 24 ) {
				cidr = cidr.match( /\d{1,3}\.\d{1,3}\.\d{1,3}\./ )[ 0 ];
			} else {
				cidr = cidr.match( /\d{1,3}\.\d{1,3}\./ )[ 0 ];
			}
			apioptions.ucuserprefix = cidr;
		} else {
			//complex CIDR, lets figure it out
			var oct3 = cidr.match( /\.\d{1,3}\//i )[ 0 ].replace( /(\.|\/)/g, '' );
			cidr = cidr.match( /\d{1,3}\.\d{1,3}\.\d{1,3}\./ )[ 0 ];
			var num = Math.pow( 2, 32 - range );
			var start = oct3 - oct3 % num;
			apioptions.ucuser = '';
			for ( var i = start; i <= start + num; i++ ) {
				apioptions.ucuser += '' + cidr + i;
				if ( i != start + num ) {
					apioptions.ucuser += '|';
				}
			}
		}
	} else if ( ucfrm.target.value.search( patternWild ) == 0 ) {
		//very simple wildcard, lets do-er
		prefixContribsStartbox( ucfrm.parentNode );
		var prefix = ucfrm.target.value.replace( /\*$/, '' );
		prefix = prefix.substr( 0, 1 ).toUpperCase() + prefix.substr( 1 );
		apioptions.ucuserprefix = prefix;
	}
	new mw.Api().get( apioptions ).done( function( data ){ prefixContribs( data, apioptions); } );
}

function prefixContribsStartbox( parent ) {
	var res = document.createElement( 'div' );
	res.setAttribute( 'id', 'results-from-CIDR' );
	addlinkchild( res, 'javascript:prefixContribsToggleAll();', 'visa/dölj alla', 'prefixcontribs-tog' );
	var spin = document.createElement( 'span' );
	spin.setAttribute( 'id', 'prefixcontribs-prog' );
	spin.appendChild( document.createTextNode( 'Söker…' ) );
	res.appendChild( spin );
	injectSpinner( spin, 'prefixcontribs-spin' );
	parent.appendChild( res );
}

function prefixContribs( obj, options ) {
	if ( !obj[ 'query' ] || !obj[ 'query' ][ 'usercontribs' ] ) {
		return;
	}
	cidr = obj[ 'query' ][ 'usercontribs' ];
	var res = document.getElementById( 'results-from-CIDR' );
	if( cidr.length == 0 ) {
		res.appendChild( document.createTextNode( ' Inga redigeringar hittades.' ) );
		removeSpinner( 'prefixcontribs-spin' );
		return;
	}
	for ( var i = 0; i < cidr.length; i++ ) {
		var id = 'cr-' + escapeID( cidr[ i ].user );
		var etitle = encodeURIComponent( cidr[ i ].title.replace( / /g, '_' ) ).replace( '%2F', '/' ).replace( '%3A', ':' );
		var euser = encodeURIComponent( cidr[ i ].user.replace( / /g, '_' ) ).replace( '%2F', '/' ).replace( '%3A', ':' );
		// group each result set based on the user name, create new div for new names
		if ( !document.getElementById( id ) ) {
			var hdiv = document.createElement( 'div' );
			hdiv.setAttribute( 'id', 'd-' + id );
			addlinkchild( hdiv, 'javascript:prefixContribsToggleDiv("' + id +'")', cidr[ i ].user, 'm-' + id, 'cr-toggle-hidden' );
			res.appendChild( hdiv );
			res.appendChild( document.createTextNode( '\n' ) );
			var rul = document.createElement( 'ul' );
			rul.setAttribute( 'id', id );
			rul.setAttribute( 'class', 'cr-list' );
			rul.style.display = 'none';
			res.appendChild( rul );
			res.appendChild( document.createTextNode( '\n' ) );
		}
		var ul = document.getElementById( id );
		ul.appendChild( document.createTextNode( '\n' ) );
		var li = document.createElement( 'li' );
		li.appendChild( document.createTextNode( cidr[ i ].timestamp.replace( /T[\d:]*Z/, ' ' ) ) );
		addlinkchild( li, mw.config.get( 'wgScript' ) + '?title=Special:Contributions/' + euser, cidr[i].user );
		li.appendChild( document.createTextNode( ' (' ) );
		addlinkchild( li, mw.config.get( 'wgScript' ) + '?title=User_talk:' + euser, 'Diskussion', '', 'mw-mightexist' );
		li.appendChild( document.createTextNode(') redigerade (' ) );
		addlinkchild( li, mw.config.get( 'wgScript' ) + '?title=' + etitle + '&curid=' + cidr[ i ].pageid + '&diff=prev&oldid=' + cidr[ i ].revid, 'diff' );
		li.appendChild( document.createTextNode( ') ' ) );
		addlinkchild( li, mw.config.get( 'wgScript' ) + '?title=' + etitle + '&curid=' + cidr[ i ].pageid, cidr[ i ].title );
		if ( cidr[ i ].comment ) {
			li.appendChild( document.createTextNode( ' (' + cidr[ i ].comment + ')' ) );
		}
		ul.appendChild( li );
	}

	//continue?
	crMax = crMax - cidr.length;
	var prog = document.getElementById( 'prefixcontribs-prog' );
	if ( !obj[ 'query-continue' ] || !obj[ 'query-continue' ][ 'usercontribs' ] || !obj[ 'query-continue' ][ 'usercontribs' ][ 'uccontinue' ] ) {
		removeSpinner( 'prefixcontribs-spin' );
		prog.parentNode.removeChild( prog );
		prefixContribsNumerate();
		return;
	}
	options.uccontinue = obj[ 'query-continue' ][ 'usercontribs' ][ 'uccontinue' ];
	if ( crMax <= 0 && queryString( 'crshowall' ) != 'true' ) {
		prog.appendChild( document.createTextNode( ' Väldigt många resultat hittades. Om du vill se alla klicka ' ) );
		var ga = document.createElement( 'a' );
		var gaurl = document.location.href;
		if ( gaurl.indexOf( '#' ) != -1 ) {
			gaurl = gaurl.substr( 0, gaurl.indexOf( '#' ) );
		}
		if ( gaurl.indexOf( '?' ) == -1 ) {
			gaurl += '?';
		}
		gaurl += '&crshowall=true';
		ga.setAttribute( 'href', gaurl );
		ga.appendChild( document.createTextNode( 'här' ) );
		prog.appendChild( ga );
		prog.appendChild( document.createTextNode( '. Varning: Din webbläsare kan låsa sig!' ) );
		removeSpinner( 'prefixcontribs-spin' );
		prefixContribsNumerate();
	} else {
		prog.appendChild( document.createTextNode( '.' ) );
		new mw.Api().get( options ).done( function( data ){ prefixContribs( data, options); } );
	}
}

function prefixContribsNumerate() {
	var lsts = getElementsByClassName( document, 'ul', 'cr-list' );
	for ( var i = 0; i < lsts.length; i++ ) {
		var dv = document.getElementById( 'd-' + lsts[ i ].getAttribute( 'id' ) );
		dv.appendChild( document.createTextNode( ' ' + lsts[ i ].getElementsByTagName( 'li' ).length + ' hittade' ) );
	}
	if ( lsts.length == 1 ) {
		prefixContribsToggleDiv( lsts[ 0 ].id );
	}
}

function prefixContribsToggleAll() {
	var lsts = getElementsByClassName( document, 'ul', 'cr-list' );
	if( lsts.length == 0 ) {
		return;
	}
	var togglefrom = lsts[ 0 ].style.display;
	for ( var i = 0; i < lsts.length; i++ ) {
		if ( lsts[ i ].style.display == togglefrom ) {
			prefixContribsToggleDiv( lsts[ i ].id );
		}
	}
}

function prefixContribsToggleDiv( id ) {
	var i = document.getElementById( id );
	var m = document.getElementById( 'm-' + id );
	if ( !i || !m ) {
		return;
	}
	if ( i.style.display == 'none' ) {
		i.style.display = 'block';
		m.className = 'cr-toggle-shown';
	} else {
		i.style.display = 'none';
		m.className = 'cr-toggle-hidden';
	}
}

function addlinkchild( obj, href, text, id, classes ) {
	if( !obj || !href || !text ) {
		return false;
	}
	var a = document.createElement( 'a' );
	a.setAttribute( 'href', href );
	a.appendChild( document.createTextNode( text ) );
	if ( id ) {
		a.setAttribute( 'id', id );
	}
	if ( classes ) {
		a.setAttribute( 'class', classes );
	}
	obj.appendChild( a );
	return a;
}

function escapeID( txt ) {
	var id = txt;
	id = id.replace( / /g, '_' );
	id = encodeURIComponent( id );
	id = id.replace( /\%3A/g, ':' );
	id = id.replace( /\%/g, '.' );
	return id;
}

function queryString( p ) {
	var re = RegExp( '[&?#]' + p + '=([^&#]*)' );
	var matches;
	if ( matches = re.exec( document.location ) ) {
		try {
			return decodeURI( matches[ 1 ] );
		} catch ( e ) {
		}
	}
	return null;
}