//<nowiki>
/**
* 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 <a> 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/<username>"
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;
}
} );
}
//</nowiki>