|
|
Line 1: |
Line 1: |
| function markBlocked( container ) {
| | var markblocked_contributions = 'Special:Contributions'; |
| var contentLinks = container ?
| | mw.loader.load('//en.wikipedia.org/w/index.php?title=MediaWiki:Gadget-markblocked.js&bcache=1&maxage=259200&action=raw&ctype=text/javascript'); |
| $( 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.mbPartialStyle || 'opacity: 0.5' ) + '}\
| |
| .mediawiki .user-blocked-temp {' + ( window.mbTempStyle || 'opacity: 0.7; text-decoration: line-through' ) + '}\
| |
| .mediawiki .user-blocked-indef {' + ( window.mbIndefStyle || 'opacity: 0.4; font-style: italic; text-decoration: line-through' ) + '}\
| |
| .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 blocked ($2) by $3: $4 ($5 ago)';
| |
| | |
| //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, blPartial;
| |
| if ( !resp || !( list = resp.query ) || !( list = list.blocks ) ) {
| |
| return;
| |
| }
| |
| | |
| for ( var i = 0; i < list.length; i++ ) {
| |
| blk = list[ i ];
| |
| blPartial = '';
| |
| 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 = ' partial';
| |
| }
| |
| tip = mbTooltip.replace( '$1', blPartial )
| |
| .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 ) + 's';
| |
| }
| |
| 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 ) : '' ) + 'd';
| |
| }
| |
| 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();
| |
| } );
| |
| }
| |
| } );
| |
| }
| |