User:Ronhjones/strikeblocked.js
function markBlocked() {
mw.util.addCSS('\
.user-blocked-temp{' + (window.mbTempStyle||'opacity: 0.7; text-decoration: line-through') + '}\
.user-blocked-indef{' + (window.mbIndefStyle||'opacity: 0.4; font-style: italic; text-decoration: line-through') + '}\
.user-blocked-tipbox{' + (window.mbTipBoxStyle||'font-size:smaller; background:#FFFFF0; border:1px solid #FEA; padding:0 0.3em; color:#AAA') + '}\
')
var mbTooltip =
window.mbTooltip
|| {
dsb: '(blokěrowany wót $2 za traśe wót $1: $3)',
de: '(von $2 für die Zeitdauer $1 gesperrt: $3)',
eo: '(forbarita de $2 por daŭro de $1: $3)',
hsb: '(zablokowany wot $2 za traće wot $1: $3)',
ja: '($2によるブロック。期限:$1 理由:$3)',
ko: '(차단: $2, 기한: $1, 이유: $3)',
pt: '(bloqueado por $2 até $1: $3)',
ru: '(блокирован $2 на срок $1: $3)',
sv: '(har blockerats av $2 till $1: $3)',
uk: '(блокування $2 на термін $1: $3)'
} [mw.config.get('wgUserLanguage')]
|| '(blocked by $2 with an expiry time of $1: $3)' //en
//get local alias for 'Contributions' from "my contribs" link on top or user-defined
var mwCont = /:([^\/]+)\//.exec( $('#pt-mycontris').find('a').attr('href') )
if( mwCont ) mwCont = mwCont[1]; else mwCont = window.mbLocalContribsName || 'Contributions'
//RegExp for all links thast are User: | User_talk: | Special:Contributions/
var userTitleRX = new RegExp('^'
+ '('
+ '(' + mw.config.get('wgFormattedNamespaces')[2] + '|' + mw.config.get('wgFormattedNamespaces')[3] + '):'
+ '|'
+ mw.config.get('wgFormattedNamespaces')[-1] + ':' + mwCont + '\\/'
+ ')'
+ '([^\\/#]*)$')
//RegExp for links
var articleRX = new RegExp( '^' + mw.config.get('wgArticlePath').replace('$1', '') + '([^#]+)' )
var scriptRX = new RegExp( '^' + mw.config.get('wgScript') + '\\?title=([^#&]+)' )
var url, ma, pgTitle
var userLinks = {}
//find all "user" links and save them in userLinks : { 'users': [
mw.util.$content
.find('a')
.each(function(i, lnk){
url = $(lnk).attr('href')
if( url.charAt(0) != '/' ) return
else 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[3]
$(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
//do API request
var waitingCSS = mw.util.addCSS('a.userlink {opacity:' + (window.mbLoadingOpacity||0.85) + '}')
$.ajax({
url: '/w/api.php?format=json&action=query&list=blocks',
dataType: 'json',
type: 'POST', //too many users will exceed GET URL length
data: { bklimit: 500, bkusers: users.join('|'), bkprop: 'user|by|timestamp|expiry|reason' }, //no need for 'id|flags'
success: markLinks
})
//receive data and mark links
function markLinks(resp){
waitingCSS.disabled = true
var list, blk, tip, links
if( !resp || !(list=resp.query) || !(list=list.blocks) ) return
for( var i=0; i blk = list[i] tip = mbTooltip .replace('$1',blk.expiry.replace(/(.*)T(.*)Z/, '$1 $2 UTC')) .replace('$2', blk.by) .replace('$3', blk.reason) clss = 'user-blocked-' + ( /^in/.test(blk.expiry) ? 'indef' : 'temp' ) links = userLinks[blk.user] for (var k=0; k $(links[k]).addClass(clss).attr( 'title', $(links[k]).attr('title') + ' ' + tip ) } if( resp.warnings ) jsMsg( 'markBlocked: API warning: ' + resp.warnings.blocks['*']) } $('#ca-showblocks').parent().remove() // remove added portlet link } switch( mw.config.get('wgAction') ){ case 'edit': case 'submit': break case 'view': if( mw.config.get('wgNamespaceNumber') % 2 == 0 && mw.config.get('wgNamespaceNumber') != 4 ) break //otherwise continue with default default: // 'history', 'purge' $(function(){ if( window.mbNoAutoStart ) addPortletLink('p-cactions', 'javascript:markBlocked()', 'XX', 'ca-showblocks') else setTimeout(markBlocked, 200) }) }