<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://pool.calebcooper.ie/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-markblocked.js</id>
	<title>MediaWiki:Gadget-markblocked.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://pool.calebcooper.ie/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-markblocked.js"/>
	<link rel="alternate" type="text/html" href="https://pool.calebcooper.ie/index.php?title=MediaWiki:Gadget-markblocked.js&amp;action=history"/>
	<updated>2026-04-08T02:58:43Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://pool.calebcooper.ie/index.php?title=MediaWiki:Gadget-markblocked.js&amp;diff=10148&amp;oldid=prev</id>
		<title>Caleb Cooper: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://pool.calebcooper.ie/index.php?title=MediaWiki:Gadget-markblocked.js&amp;diff=10148&amp;oldid=prev"/>
		<updated>2020-01-28T15:04:33Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 15:04, 28 January 2020&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Caleb Cooper</name></author>
	</entry>
	<entry>
		<id>https://pool.calebcooper.ie/index.php?title=MediaWiki:Gadget-markblocked.js&amp;diff=10147&amp;oldid=prev</id>
		<title>powerstorewiki&gt;Caleb Cooper: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://pool.calebcooper.ie/index.php?title=MediaWiki:Gadget-markblocked.js&amp;diff=10147&amp;oldid=prev"/>
		<updated>2020-01-21T18:21:06Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/*&lt;br /&gt;
You can import this gadget to other wikis by using mw.loader.load and specifying the local alias for Special:Contributions. For example:&lt;br /&gt;
var markblocked_contributions = &amp;#039;Special:Contributions&amp;#039;;&lt;br /&gt;
mw.loader.load(&amp;#039;//en.wikipedia.org/w/index.php?title=MediaWiki:Gadget-markblocked.js&amp;amp;bcache=1&amp;amp;maxage=259200&amp;amp;action=raw&amp;amp;ctype=text/javascript&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
This gadget will pull the user accounts and IPs from the history page and will strike out the users that are currently blocked.&lt;br /&gt;
*/&lt;br /&gt;
function markBlocked( container ) {&lt;br /&gt;
	var ipv6Regex = /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i;&lt;br /&gt;
	var contentLinks;&lt;br /&gt;
&lt;br /&gt;
	// Collect all the links in the page&amp;#039;s content&lt;br /&gt;
	if ( container ) {&lt;br /&gt;
		contentLinks = $( container ).find( &amp;#039;a&amp;#039; );&lt;br /&gt;
	} else if ( mw.util.$content ) {&lt;br /&gt;
		contentLinks = mw.util.$content.find( &amp;#039;a&amp;#039; ).add( &amp;#039;#ca-nstab-user a&amp;#039; );&lt;br /&gt;
	} else {&lt;br /&gt;
		contentLinks = $();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	mw.util.addCSS(&amp;#039;\&lt;br /&gt;
	a.user-blocked-temp {&amp;#039;   + ( window.mbTempStyle || &amp;#039;opacity: 0.7; text-decoration: line-through&amp;#039; ) + &amp;#039;}\&lt;br /&gt;
	a.user-blocked-indef {&amp;#039;  + ( window.mbIndefStyle || &amp;#039;opacity: 0.4; font-style: italic; text-decoration: line-through&amp;#039; ) + &amp;#039;}\&lt;br /&gt;
	.user-blocked-tipbox {&amp;#039; + ( window.mbTipBoxStyle || &amp;#039;font-size:smaller; background:#FFFFF0; border:1px solid #FEA; padding:0 0.3em; color:#AAA&amp;#039; ) + &amp;#039;}\&lt;br /&gt;
	&amp;#039;);&lt;br /&gt;
	var mbTooltip =  window.mbTooltip || &amp;#039;; blocked ($1) by $2: $3 ($4 ago)&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	// Get all aliases for user: &amp;amp; user_talk:&lt;br /&gt;
	var userNS = [];&lt;br /&gt;
	for ( var ns in mw.config.get( &amp;#039;wgNamespaceIds&amp;#039; ) ) {&lt;br /&gt;
		if ( mw.config.get( &amp;#039;wgNamespaceIds&amp;#039; )[ns] == 2 || mw.config.get( &amp;#039;wgNamespaceIds&amp;#039; )[ns] == 3 ) {&lt;br /&gt;
			userNS.push( ns.replace( /_/g, &amp;#039; &amp;#039; ) + &amp;#039;:&amp;#039; );&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// Let wikis that are importing this gadget specify the local alias of Special:Contributions&lt;br /&gt;
	if ( window.markblocked_contributions === undefined ) {&lt;br /&gt;
		window.markblocked_contributions = &amp;#039;Special:Contributions&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
	// RegExp for all titles that are  User:| User_talk: | Special:Contributions/ (for userscripts)&lt;br /&gt;
	var userTitleRX = new RegExp( &amp;#039;^(&amp;#039; + userNS.join( &amp;#039;|&amp;#039; ) + &amp;#039;|&amp;#039; + window.markblocked_contributions + &amp;#039;\\/)([^\\/#]+)$&amp;#039;, &amp;#039;i&amp;#039; );&lt;br /&gt;
&lt;br /&gt;
	// RegExp for links&lt;br /&gt;
	// articleRX also matches external links in order to support the noping template&lt;br /&gt;
	var articleRX = new RegExp( mw.config.get( &amp;#039;wgArticlePath&amp;#039; ).replace(&amp;#039;$1&amp;#039;, &amp;#039;&amp;#039;) + &amp;#039;([^#]+)&amp;#039; );&lt;br /&gt;
	var scriptRX =  new RegExp( &amp;#039;^&amp;#039; + mw.config.get( &amp;#039;wgScript&amp;#039; ) + &amp;#039;\\?title=([^#&amp;amp;]+)&amp;#039; );&lt;br /&gt;
&lt;br /&gt;
	var userLinks = {};&lt;br /&gt;
	var user, url, ma, pgTitle;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Find all &amp;quot;user&amp;quot; links and save them in userLinks : { &amp;#039;users&amp;#039;: [&amp;lt;link1&amp;gt;, &amp;lt;link2&amp;gt;, ...], &amp;#039;user2&amp;#039;: [&amp;lt;link3&amp;gt;, &amp;lt;link3&amp;gt;, ...], ... }&lt;br /&gt;
	contentLinks.each( function( i, lnk ) {&lt;br /&gt;
		if( $( lnk ).hasClass(&amp;quot;mw-changeslist-date&amp;quot;) || $( lnk ).parent(&amp;quot;span&amp;quot;).hasClass(&amp;quot;mw-history-undo&amp;quot;) || $(lnk).parent(&amp;quot;span&amp;quot;).hasClass(&amp;quot;mw-rollback-link&amp;quot;) )&lt;br /&gt;
		{&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		url = $( lnk ).attr( &amp;#039;href&amp;#039; );&lt;br /&gt;
		if ( !url ) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if ( ma = articleRX.exec( url ) ) {&lt;br /&gt;
			pgTitle = ma[1];&lt;br /&gt;
		} else if ( ma = scriptRX.exec( url ) ) {&lt;br /&gt;
			pgTitle = ma[1];&lt;br /&gt;
		} else {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		pgTitle = decodeURIComponent( pgTitle ).replace( /_/g, &amp;#039; &amp;#039; );&lt;br /&gt;
		user = userTitleRX.exec( pgTitle );&lt;br /&gt;
		if ( !user ) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		user = user[2];&lt;br /&gt;
		if( ipv6Regex.test(user) ) user = user.toUpperCase();&lt;br /&gt;
		$( lnk ).addClass( &amp;#039;userlink&amp;#039; );&lt;br /&gt;
		if ( !userLinks[user] ) {&lt;br /&gt;
			userLinks[user] = [];&lt;br /&gt;
		}&lt;br /&gt;
		userLinks[user].push (lnk );&lt;br /&gt;
	} );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Convert users into array&lt;br /&gt;
	var users = [];&lt;br /&gt;
	for ( var u in userLinks ) {&lt;br /&gt;
		users.push( u );&lt;br /&gt;
	}&lt;br /&gt;
	if ( users.length === 0 ) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// API request&lt;br /&gt;
	var serverTime, apiRequests = 0;&lt;br /&gt;
	var waitingCSS = mw.util.addCSS( &amp;#039;a.userlink {opacity:&amp;#039; + ( window.mbLoadingOpacity || 0.85 ) + &amp;#039;}&amp;#039; );&lt;br /&gt;
	while ( users.length &amp;gt; 0 ) {&lt;br /&gt;
		apiRequests++;&lt;br /&gt;
		$.post( &lt;br /&gt;
			mw.util.wikiScript( &amp;#039;api&amp;#039; ) + &amp;#039;?format=json&amp;amp;action=query&amp;#039;,&lt;br /&gt;
			{&lt;br /&gt;
				list: &amp;#039;blocks&amp;#039;,&lt;br /&gt;
				bklimit: 100,&lt;br /&gt;
				bkusers: users.splice( 0, 50 ).join( &amp;#039;|&amp;#039; ),&lt;br /&gt;
				bkprop: &amp;#039;user|by|timestamp|expiry|reason&amp;#039;&lt;br /&gt;
				// no need for &amp;#039;id|flags&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			markLinks&lt;br /&gt;
		);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return; // the end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Callback: receive data and mark links&lt;br /&gt;
	function markLinks( resp, status, xhr ) {&lt;br /&gt;
&lt;br /&gt;
		serverTime = new Date( xhr.getResponseHeader(&amp;#039;Date&amp;#039;) );&lt;br /&gt;
		var list, blk, tip, links, lnk;&lt;br /&gt;
		if ( !resp || !( list = resp.query ) || !( list = list.blocks ) ) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		for ( var i = 0; i &amp;lt; list.length; i++ ) {&lt;br /&gt;
			blk = list[i];&lt;br /&gt;
			if ( /^in/.test( blk.expiry ) ) {&lt;br /&gt;
				clss = &amp;#039;user-blocked-indef&amp;#039;;&lt;br /&gt;
				blTime = blk.expiry;&lt;br /&gt;
			} else {&lt;br /&gt;
				clss = &amp;#039;user-blocked-temp&amp;#039;;&lt;br /&gt;
				blTime = inHours ( parseTS( blk.expiry ) - parseTS( blk.timestamp ) );&lt;br /&gt;
			}&lt;br /&gt;
			tip = mbTooltip.replace( &amp;#039;$1&amp;#039;, blTime )&lt;br /&gt;
				.replace( &amp;#039;$2&amp;#039;, blk.by )&lt;br /&gt;
				.replace( &amp;#039;$3&amp;#039;, blk.reason )&lt;br /&gt;
				.replace( &amp;#039;$4&amp;#039;, inHours ( serverTime - parseTS( blk.timestamp ) ) );&lt;br /&gt;
			links = userLinks[blk.user];&lt;br /&gt;
			for ( var k = 0; links &amp;amp;&amp;amp; k &amp;lt; links.length; k++ ) {&lt;br /&gt;
				lnk = $( links[k] ).addClass( clss );&lt;br /&gt;
				if ( window.mbTipBox ) {&lt;br /&gt;
					$( &amp;#039;&amp;lt;span class=user-blocked-tipbox&amp;gt;#&amp;lt;/span&amp;gt;&amp;#039; ).attr( &amp;#039;title&amp;#039;, tip ).insertBefore( lnk );&lt;br /&gt;
				} else {&lt;br /&gt;
					lnk.attr( &amp;#039;title&amp;#039;, lnk.attr( &amp;#039;title&amp;#039; ) + tip );&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if ( --apiRequests === 0 ) { // last response&lt;br /&gt;
			waitingCSS.disabled = true;&lt;br /&gt;
			$( &amp;#039;#ca-showblocks&amp;#039; ).parent().remove(); // remove added portlet link&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// --------AUX functions&lt;br /&gt;
&lt;br /&gt;
	// 20081226220605  or  2008-01-26T06:34:19Z   -&amp;gt; date&lt;br /&gt;
	function parseTS( ts ) {&lt;br /&gt;
		var m = ts.replace( /\D/g, &amp;#039;&amp;#039; ).match( /(\d\d\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)/ );&lt;br /&gt;
		return new Date ( Date.UTC( m[1], m[2]-1, m[3], m[4], m[5], m[6] ) );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function inHours( ms ) { // milliseconds -&amp;gt; &amp;quot;2:30&amp;quot; or 5,06d or 21d&lt;br /&gt;
		var mm = Math.floor( ms / 60000 );&lt;br /&gt;
		if ( !mm ) {&lt;br /&gt;
			return Math.floor( ms / 1000 ) + &amp;#039;s&amp;#039;;&lt;br /&gt;
		}&lt;br /&gt;
		var hh = Math.floor( mm / 60 );&lt;br /&gt;
		mm = mm % 60;&lt;br /&gt;
		var dd = Math.floor( hh / 24 );&lt;br /&gt;
		hh = hh % 24;&lt;br /&gt;
		if ( dd ) {&lt;br /&gt;
			return dd + ( dd &amp;lt; 10 ? &amp;#039;.&amp;#039; + zz( hh ) : &amp;#039;&amp;#039; ) + &amp;#039;d&amp;#039;;&lt;br /&gt;
		}&lt;br /&gt;
		return hh + &amp;#039;:&amp;#039; + zz( mm );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function zz( v ) { // 6 -&amp;gt; &amp;#039;06&amp;#039;&lt;br /&gt;
		if ( v &amp;lt;= 9 ) {&lt;br /&gt;
			v = &amp;#039;0&amp;#039; + v;&lt;br /&gt;
		}&lt;br /&gt;
		return v;&lt;br /&gt;
	}&lt;br /&gt;
}// -- end of main function&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Start on some pages&lt;br /&gt;
switch ( mw.config.get( &amp;#039;wgAction&amp;#039; ) ) {&lt;br /&gt;
	case &amp;#039;edit&amp;#039;:&lt;br /&gt;
	case &amp;#039;submit&amp;#039;:&lt;br /&gt;
		break;&lt;br /&gt;
	case &amp;#039;view&amp;#039;:&lt;br /&gt;
		if ( mw.config.get( &amp;#039;wgNamespaceNumber&amp;#039; ) === 0 ) {&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
		// Otherwise continue with default&lt;br /&gt;
	default: // &amp;#039;history&amp;#039;, &amp;#039;purge&amp;#039;&lt;br /&gt;
		$.when( $.ready, mw.loader.using( &amp;#039;mediawiki.util&amp;#039; ) ).then( function() {&lt;br /&gt;
			if ( window.mbNoAutoStart ) {&lt;br /&gt;
				var portletLink = mw.util.addPortletLink( &amp;#039;p-cactions&amp;#039;, &amp;#039;&amp;#039;, &amp;#039;XX&amp;#039;, &amp;#039;ca-showblocks&amp;#039; );&lt;br /&gt;
				$( portletLink ).click( function ( e ) {&lt;br /&gt;
					e.preventDefault();&lt;br /&gt;
					markBlocked();&lt;br /&gt;
				} );&lt;br /&gt;
			} else {&lt;br /&gt;
				mw.hook( &amp;#039;wikipage.content&amp;#039; ).add( markBlocked );&lt;br /&gt;
			}&lt;br /&gt;
  		} );&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>powerstorewiki&gt;Caleb Cooper</name></author>
	</entry>
</feed>