User:Galobtter/scripts/adminhighlighter.js

// /** * Admin highlighter 3.0 * - * Derivative of of User:Theopolisme/Scripts/adminhighlighter.js * Changes: cache list of admins, and tweak css to use nicer one by Jorm. * This script highlights links to admins' userpages or talkpages in bodyContent * (that is, everything but the tabs, personal links at the top of the screen and sidebar) * by giving them a light background and border. * * @authors Galobtter, Theopolisme, Amalthea, Ais523 */ var prevPostRequest, data; var highlight = function(data){ ADMINHIGHLIGHT_EXTLINKS = window.ADMINHIGHLIGHT_EXTLINKS || false; ADMINHIGHLIGHT_NAMESPACES = [-1,2,3]; mw.loader.using(['mediawiki.util','mediawiki.Uri', 'mediawiki.Title']).then(function {		mw.util.addCSS( "a.userhighlighter_sysop { background-color: rgba(100, 149, 237, 0.25) !important; border-top: .05em dashed rgba(100, 149, 237, 0.5); border-bottom: .05em dashed rgba(100, 149, 237, 0.5); }"+ "a.userhighlighter_sysop.mw-changeslist-title { background-color: transparent !important; border-color: transparent !important; }" );		$('#bodyContent a').each(function(index,linkraw){ try { var link = $(linkraw); var url = link.attr('href'); if (!url || url.charAt(0) === '#') return; // Skip  elements that aren't actually links; skip anchors if (url.lastIndexOf("http://", 0) !== 0 && url.lastIndexOf("https://", 0) !== 0 && url.lastIndexOf("/", 0) !== 0) return; //require http(s) links, avoid "javascript:..." etc. which mw.Uri does not support var uri = new mw.Uri(url); if (!ADMINHIGHLIGHT_EXTLINKS && !$.isEmptyObject(uri.query)) return; // Skip links with query strings if highlighting external links is disabled if (uri.host == 'en.wikipedia.org') { var mwtitle = new mw.Title(mw.util.getParamValue('title',url) || decodeURIComponent(uri.path.slice(6))); // Try to get the title parameter of URL; if not available, remove '/wiki/' and use that if ($.inArray(mwtitle.getNamespaceId, ADMINHIGHLIGHT_NAMESPACES)>=0) { var user = mwtitle.getMain.replace(/_/g," "); if (mwtitle.getNamespaceId === -1) user = user.replace('Contributions/',''); // For special page "Contributions/ " if (data[user] == 1) { link.addClass('userhighlighter_sysop'); // Override the above color by using `a.userhighlighter_sysop.userhighlighter_sysop {background-color: COLOR !important}` }					}				}			} catch (e) { // Sometimes we will run into unparsable links, so just log these and move on				console.error('Admin highlighter recoverable error',e.message); }		});	}); };

var main = function { // if called a second time, should have data if (data) { highlight(data); }	// Cache the admin json for a period of time try { data = JSON.parse(localStorage.getItem('adminjson')); } catch(e) { console.error('Admin highlighter: failed to parse cached admin json object', e.message); }	if (!data || !data.date || (Date.now - data.date) > 3600000) { // 1 hour in milliseconds $.getJSON(mw.config.get('wgScriptPath')+'/index.php?action=raw&ctype=application/json&title=User:AmoryBot/crathighlighter.js/sysop.json').then(			function(result) {				data = result;				data.date = Date.now;				localStorage.setItem('adminjson', JSON.stringify(data));				highlight(data);			}		); } else { highlight(data); } };

main;

if ( mw.config.get( 'wgCanonicalSpecialPageName' ) === 'Watchlist' ) { /* Rerun every time update watchlist */ $( document ).ajaxSend( function ( event, request, settings ) {		/**		 * Should not update on regular pings by the watchlist checking for an update		 * Wait for the next ping after a post request		 * (which is involved in updating watchlist)		 */		if ( settings.type === 'POST' ) {			prevPostRequest = true;			return;		}		if ( prevPostRequest && settings.url.indexOf( 'Special:Watchlist' ) === -1 && settings.type === 'GET' ) {			main;			prevPostRequest = false;		}	} ); } //