MediaWiki:Gadget-rightsfilter-dev.js

From Wikimedia Commons, the free media repository
Jump to navigation Jump to search
Note: After saving, you have to bypass your browser's cache to see the changes. Internet Explorer: press Ctrl-F5, Mozilla: hold down Shift while clicking Reload (or press Ctrl-Shift-R), Opera/Konqueror: press F5, Safari: hold down Shift + Alt while clicking Reload, Chrome: hold down Shift while clicking Reload.
// <source lang="javascript">
// Log filter script
//
// Created by [[w:User:Splarka|Splarka]] 
// Amended by [[b:User:Mike.lifeguard]] & [[User:Lupo]]
// Partially rewritten by DieBuche
//
// <li> element Filter Script, version [0.2]
// Should currently work on all known skins (with a #contentSub or #topbar)
//


if (typeof(filterLists) == 'undefined') { // Guard against double inclusions
var filterLists = {
	rightsLogOnly: (document.location.href.indexOf('type=rights') == -1 && document.location.href.indexOf('Log/rights') == -1) ? false : true,
	lastClicked: false,
	makeButton: function () {
		mw.util.addPortletLink('p-cactions', 'javascript:filterLists.buildForm()', 'Filter', 'ca-rxfilter', 'Open interactive log entry regex filter thingy');
		if (window.AutoLoadLogsFilter || mw.util.getParamValue('lifilter') != null) filterLists.buildForm();
	},

	buildForm: function () {
		var instructions = (this.rightsLogOnly) ? 'Regex filter the space-delimited list of rights.' : 'Regex filter the plain text representation of this list.';

		$('#ca-rxfilter').hide();
		var pageTop = $('#contentSub, #topbar');
		if (!pageTop.length) return;

		// Set up config
		var value = mw.util.getParamValue('lifilterexpr');
		var casing = (mw.util.getParamValue('lifiltercase') == '1');
		var inverted = (mw.util.getParamValue('lifilterinv') == '1');

		// Generate the form
		var $fieldSet = $('<fieldset id="rightsFilter"></fieldset>');

		$fieldSet.append(instructions);

		var $legend = $('<legend></legend>');
		$legend.text('Filter <li> list');
		$fieldSet.append($legend);
		if (this.rightsLogOnly) {
			var sel = $('<select id=rfSelect></select>');

			sel.append('<option>Added rights</option>');
			sel.append('<option>Removed rights</option>');
			sel.append('<option>Added OR removed</option>');
			sel.append('<option>Added/removed/static</option>');

			$fieldSet.append(sel);
		}
		$fieldSet.append('<label for="rfRegex"> Regex string: </label><input id="rfRegex">');
		$fieldSet.append('<input id="rfInvert" type="checkbox"><label for="rfInvert">Invert </label>');

		$fieldSet.append('<input id="rfCase" type="checkbox"><label for="rfCase">Case insensitive </label>');
		$fieldSet.append('<button type="button" value="0">Filter</button>');
		$fieldSet.append('<button type="button" value="1">Highlight</button>');

		pageTop.after($fieldSet);

		//Set passed values
		$('#rfRegex').val(value);
		$('#rfCase').attr('checked', !casing);		
		$('#rfInvert').attr('checked', inverted);
		
		//Bind click and change handlers
		$('#rightsFilter input').on('keyup change', function () {
			filterLists.filterLi();
		});
		$fieldSet.find('button').click(function () {
			filterLists.lastClicked = $(this).val();
			filterLists.filterLi();
		});

		if (value.length > 0) this.filterLi(mw.util.getParamValue('lifilterhilight') == '1');
	},

	filterLi: function (hilight) {
		//grab options from form
		if (this.rightsLogOnly) var type = $('#rfSelect').attr('selectedIndex');
		var invert = $('#rfInvert').attr('checked');
		var search = $('#rfRegex').val();
		var flags = ($('#rfCase').attr('checked')) ? 'ig' : 'g';
		var hilight = (this.lastClicked == '1') ? true : false;

		var rx = new RegExp(search, flags);

		//grab the list of all <li> in the content
		var listItems = $('#bodyContent li');
		if (!listItems.length) return;

		//iterate
		var rightrx = /^.*?User\:.*? from (.*?) to (.*?) \u200E.*?$/i; //the regex used to grab the Special:Log/rights changes
		listItems.each(function () {
			if (this.rightsLogOnly) {
				//Special:Log/rights
				var oldr = $(this).text().replace(rightrx, '$1');
				var newr = $(this).text().replace(rightrx, '$2');
				var oldrl = oldr.split(', ');
				var newrl = newr.split(', ');
				for (var j = 0; j < oldrl.length; j++) {
					for (var k = 0; k < newrl.length; k++) {
						if (oldrl[j] == newrl[k]) {
							oldrl[j] = '';
							newrl[k] = '';
						}
					}
				}
				var remr = oldrl.join();
				var addr = newrl.join();
				switch (type) {
				case 0:
					var look = addr;
					break;
				case 1:
					var look = remr;
					break;
				case 2:
					var look = remr + ' ' + addr;
					break;
				case 3:
					var look = oldr + ' ' + newr;
					break;
				}
			} else {
				//Any other list of <li> objects
				var look = $(this).text();
			}
			$(this).show();
			$(this).css('background-color','');
			if ((look.search(rx) != -1 && !invert) || (look.search(rx) == -1 && invert)) {
				if (hilight) $(this).css('background-color','#ffff99');
			} else {
				if (!hilight) $(this).hide();
			}
		});
	}
};

//When to enable all this
if (mw.config.get('wgAction') == 'history' || wgCanonicalSpecialPageName && wgCanonicalSpecialPageName.match(/^(Activeusers|CheckUser|Contributions|Ipblocklist|LinkSearch|Log|Search|(Uncategoriz|Unus|Want)ed(categori|templat)es|Wantedfiles|(Short|Long|Ancient|Uncategorized|Unwatched|Wanted|Protected|Deadend|Lonely|New)pages|Fewestrevisions|Withoutinterwiki|(Double|Broken)Redirects|Protectedtitles|CrossNamespaceLinks|Recentchanges|Categories|Disambiguations|Listredirects|GlobalUsers|GlobalBlockList|Listusers|Watchlist|Most(linked|revisions|categories)|Nuke|Whatlinkshere)$/i) || mw.util.getParamValue('lifilter')) {
	$(document).ready(filterLists.makeButton);
}

} // end if (guard)
// </source>