User:Nihonjoe/userhighlighter.js

// Adapted from https://en.wikipedia.org/w/index.php?title=User:Amorymeltzer/crathighlighter.js&oldid=1043708073 // // This only highlights users on this list: //   https://en.wikipedia.org/w/index.php?title=User:Nihonjoe/userhighlighter.js/userlist.json // Features added: // // If you want different colors, add something like // .userhighlighter {background-color: red !important} // to your common.css file. // //

(function($) { var highlight_order = window.highlight_order || ['editor']; var all_groups = window.all_groups || false; if (all_groups) {	highlight_order.reverse; }

// Core function for applying classes to the parsed JSON data var main = function(data) { var USERHIGHLIGHT_EXTLINKS = window.USERHIGHLIGHT_EXTLINKS || false; var USERHIGHLIGHT_NAMESPACES = [-1, 2, 3]; var classDefs = { 'editor': '888888' };

mw.loader.using(['mediawiki.util', 'mediawiki.Uri', 'mediawiki.Title'], function {		for (var perm in highlight_order) {			mw.util.addCSS('.userhighlighter_' + highlight_order[perm] + ' {background-color: #' + classDefs[highlight_order[perm]] + '}');		}

$('#mw-content-text a').each(function(index, linkraw) {			try {				var link = $(linkraw);				var url = link.attr('href');				if (!url || url === '/wiki/' || 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				if (link[0].parentElement.className && link[0].parentElement.classList[0] === 'autocomment') {					return;				} // Skip span.autocomment links aka automatic section links in edit summaries				if (link[0].tagName === 'IMG') {					return;				} // Don't highlight image links				if (link[0].className && link[0].classList[0] === 'external') {					return;				} // Avoid errors on hard-to-parse external links				url = url.replace(/%(?![0-9a-fA-F][0-9a-fA-F])/g, '%25'); var uri = new mw.Uri(url); if (!USERHIGHLIGHT_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, USERHIGHLIGHT_NAMESPACES) >= 0) { var user = mwtitle.getMain.replace(/_/g, ' '); if (mwtitle.getNamespaceId === -1) { user = user.replace('Contributions/', ''); }						$.each(highlight_order, function(_ix, ug) {							if (data[ug][user] === 1) {								link.addClass('userhighlighter_' + ug);								return all_groups; // Exit on first match if false, continue if true							}						}); }				}			} catch (e) { // Sometimes we will run into unparsable links, so just log these and move on				mw.log.warn('userhighlighter.js unparsable link', e.message, linkraw); }		});	}); };

// Grab or generate the user data then actually run the main function var userhighlighterdata; try { userhighlighterdata = JSON.parse(localStorage.getItem('userhighlighterjson')); } catch (e) { mw.log.error('userhighlighter: failed to parse local storage', e.message); } var cache_len = window.cache_hours || 1; cache_len *= 60 * 60 * 1000; // milliseconds if (!userhighlighterdata || !userhighlighterdata.date || (Date.now - new Date(userhighlighterdata.date).getTime) > cache_len) { userhighlighterdata = {}; var promises = []; var baseUrl = '/w/index.php?action=raw&ctype=application/json&title=User:Nihonjoe/userhighlighter.js/'; $.each(highlight_order, function(idx, perm) {		var url = baseUrl + perm + '.json';		var deferred = $.getJSON(url, function(data) { userhighlighterdata[perm] = data; });		promises.push(deferred);	});

$.when.apply(null, promises).then(function {		userhighlighterdata.date = Date.now;		localStorage.setItem('userhighlighterjson', JSON.stringify(userhighlighterdata));		main(userhighlighterdata);	}); } else { main(userhighlighterdata); } })(jQuery); //