(문서를 비움) 태그: 비우기 |
|||
1번째 줄: | 1번째 줄: | ||
/* <nowiki> */ | |||
/* 다음의 코드는 차단된 사용자에게 선을 그어주는 스크립트로 [[:wikipedia:ru:MediaWiki:Gadget-markblocked.js]]에서 퍼온 겁니다. 각자 js문서에 붙여넣어서 쓰세요. */ | |||
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.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(); | |||
} ); | |||
} | |||
} ); | |||
} | |||
/* </nowiki> */ |
2020년 7월 29일 (수) 13:40 판
/* <nowiki> */ /* 다음의 코드는 차단된 사용자에게 선을 그어주는 스크립트로 [[:wikipedia:ru:MediaWiki:Gadget-markblocked.js]]에서 퍼온 겁니다. 각자 js문서에 붙여넣어서 쓰세요. */ 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.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(); } ); } } ); } /* </nowiki> */