# MediaWiki:Gadget-markblocked.js

From faraghaib
Jump to navigation Jump to search

Note: After publishing, you may have to bypass your browser's cache to see the changes.

- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
- Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.

    //https://ru.wikipedia.org/w/index.php?title=MediaWiki:Gadget-markblocked.js&oldid=102022281
    function markBlocked( container ) {
    	var contentLinks = container ?
    		$( container ).find( 'a' ) :
    		( mw.util.$content || $( '.mw-body' ) ).find( 'a' ).add( '#ca-nstab-user a' );

    	if ( !markBlockedCSS ) {
    		markBlockedCSS = mw.util.addCSS('\
    			.mediawiki .user-blocked-partial {'  + ( window.mbIndefStyle || 'opacity: 0.5; background:#e4f4f5;' ) + '}\
    			.mediawiki .user-blocked-temp {'   + ( window.mbTempStyle || 'opacity: 0.5; background:#f5e4ec;' ) + '}\
    			.mediawiki .user-blocked-indef {'  + ( window.mbIndefStyle || 'opacity: 0.5; background:#f5e4ec;' ) + '}\
    			.mediawiki .user-blocked-tipbox {' + ( window.mbTipBoxStyle || 'font-size:85%; background:#FFFFF0; border:1px solid #FEA; padding:0 0.3em; color:#AAA' ) + '}\
    		');
    	}
    	var mbTooltip =  window.mbTooltip || ';$1 بسته شد ($2) توسط $3: $4 ($5 پیش)';

    	//get all aliases for user: & user_talk:
    	var userNS = [];
    	for ( var ns in mw.config.get( 'wgNamespaceIds' ) ) {
    		if ( mw.config.get( 'wgNamespaceIds' )[ ns ] == 2 || mw.config.get( 'wgNamespaceIds' )[ ns ] == 3 ) {
    			userNS.push( ns.replace( /_/g, ' ' ) + ':' );
    		}
    	}

    	//RegExp  for all titles that are  User: | User_talk: | Special:Contributions/ (localized) | Special:Contributions/ (for userscripts)
    	var userTitleRX = new RegExp( '^'
    		+ '(' + userNS.join( '|' )
    		+ '|ویژه:مشارکت‌ها\\/|Special:Contributions\\/'
    		+ ')'
    		+ '([^\\/#]+)$', 'i' );

    	//RegExp for links
    	var articleRX = new RegExp(
    		'^(?:' + mw.config.get( 'wgServer' ) + ')?' +
    		mw.config.get( 'wgArticlePath' ).replace( '$1', '' ) + '([^#]+)'
    	);
    	var scriptRX = new RegExp(
    		'^(?:' + mw.config.get( 'wgServer' ) + ')?' +
    		mw.config.get( 'wgScript' ) + '\\?title=([^#&]+)'
    	);

    	var userLinks = {};
    	var url, ma, pgTitle;

    	//find all "user" links and save them in userLinks : { 'users': [<link1>, <link2>, ...], 'user2': [<link3>, <link3>, ...], ... }
    	contentLinks.each( function( i, lnk ) {
    		url = $( lnk ).attr( 'href' );
    		if ( !url || url.charAt( 0 ) !== '/' ) {
    			return;
    		}
    		if ( ma = articleRX.exec( url ) ) {
    			pgTitle = ma[ 1 ];
    		} else if ( ma = scriptRX.exec( url ) ) {
    			pgTitle = ma[ 1 ];
    		} else {
    			return;
    		}
    		pgTitle = decodeURIComponent( pgTitle ).replace( /_/g, ' ' );
    		user = userTitleRX.exec( pgTitle );
    		if ( !user ) {
    			return;
    		}
    		user = user[ 2 ];
    		if ( user === 'К удалению' ) {
    			return;
    		}
    		$( lnk ).addClass( 'userlink' );
    		if ( !userLinks[ user ] ) {
    			userLinks[ user ] = [];
    		}
    		userLinks[ user ].push (lnk );
    	} );

    	//convert users into array
    	var users = [];
    	for ( var u in userLinks ) {
    		users.push( u );
    	}
    	if ( users.length === 0 ) {
    		return;
    	}

    	//API request
    	var serverTime,
    		apiRequests = 0;
    	var waitingCSS = mw.util.addCSS( 'a.userlink {opacity:' + ( window.mbLoadingOpacity || 0.85 ) + '}' );
    	while ( users.length > 0 ) {
    		apiRequests++;
    		$.post(
    			mw.util.wikiScript( 'api' ) + '?format=json&action=query',
    			{
    				list: 'blocks',
    				bklimit: 100,
    				bkusers: users.splice( 0, 50 ).join( '|' ),
    				bkprop: 'user|by|timestamp|expiry|reason|flags'
    				//no need for 'id'
    			},
    			markLinks
    		);
    	}

    	return; //the end

    	//callback: receive data and mark links
    	function markLinks( resp, status, xhr ) {

    		serverTime = new Date( xhr.getResponseHeader('Date') );
    		var list, blk, tip, links, lnk;
    		var blPartial = '';
    		if ( !resp || !( list = resp.query ) || !( list = list.blocks ) ) {
    			return;
    		}

    		for ( var i = 0; i < list.length; i++ ) {
    			blk = list[ i ];
    			if ( /^in/.test( blk.expiry ) ) {
    				clss = 'user-blocked-indef';
    				blTime = blk.expiry;
    			} else {
    				clss = 'user-blocked-temp';
    				blTime = inHours ( parseTS( blk.expiry ) - parseTS( blk.timestamp ) );
    			}
    			if ('partial' in blk) {
    				clss = 'user-blocked-partial';
    				blPartial = ' موردی';
    			}
    			tip = mbTooltip.replace( '$1', blPartial )
    				.replace( 'infinity', 'بی‌پایان' )
    				.replace( '$2', blTime )
    				.replace( '$3', blk.by )
    				.replace( '$4', blk.reason )
    				.replace( '$5', inHours ( serverTime - parseTS( blk.timestamp ) ) );
    			links = userLinks[ blk.user ];
    			for ( var k = 0; k < links.length; k++ ) {
    				lnk = $( links[ k ] ).addClass( clss );
    				if ( window.mbTipBox ) {
    					$( '<span class=user-blocked-tipbox>#</span>' ).attr( 'title', tip ).insertBefore( lnk );
    				} else {
    					lnk.attr( 'title', lnk.attr( 'title' ) + tip );
    				}
    			}
    		}

    		if ( --apiRequests === 0 ) { //last response
    			waitingCSS.disabled = true;
    			$( '#ca-showblocks' ).parent().remove(); // remove added portlet link
    		}

    	}

    	//--------AUX functions

    	//20081226220605 or 2008-01-26T06:34:19Z -> date
    	function parseTS( ts ) {
    		var m = ts.replace( /\D/g, '' ).match( /(\d\d\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)/ );
    		return new Date ( Date.UTC( m[ 1 ], m[ 2 ] - 1, m[ 3 ], m[ 4 ], m[ 5 ], m[ 6 ] ) );
    	}

    	function inHours( ms ) { //milliseconds -> "2:30" or 5,06d or 21d
    		var mm = Math.floor( ms / 60000 );
    		if ( !mm ) {
    			return Math.floor( ms / 1000 ) + 'ثانیه';
    		}
    		var hh = Math.floor( mm / 60 );
    		mm = mm % 60;
    		var dd = Math.floor( hh / 24 );
    		hh = hh % 24;
    		if ( dd ) {
    			return dd + ( dd < 10 ? '.' + zz( hh ) : '' ) + 'روز';
    		}
    		return hh + ':' + zz( mm );
    	}

    	function zz( v ) { // 6 -> '06'
    		if ( v <= 9 ) {
    			v = '0' + v;
    		}
    		return v;
    	}
    }// -- end of main function

    // FIXME: a global variable
    var markBlockedCSS;

    //start on some pages
    switch ( mw.config.get( 'wgAction' ) ) {
    	case 'edit':
    	case 'submit':
    	case 'delete':
    		break;
    	case 'view':
    		if ( $.inArray( mw.config.get( 'wgNamespaceNumber' ), [ 0, 10 ] ) !== -1 ) {
    			break;
    		}
    		// otherwise continue with default
    	default: // 'history', 'purge'
    		// In case if the gadget is loaded directly by URL
    		mw.loader.using( 'mediawiki.util' ).done( function () {
    			if ( window.mbNoAutoStart ) {
    				mw.util.addPortletLink( 'p-cactions', 'javascript:markBlocked()', 'XX', 'ca-showblocks' );
    			} else {
    				mw.hook( 'wikipage.content' ).add( function () {
    					markBlocked();
    		  		} );
    			}
    		} );
    }

Retrieved from "https://en.faraghaib.ir/w/index.php?title=MediaWiki:Gadget-markblocked.js&oldid=310"