MediaWiki:Gadget-Filtro para listas.js

Origem: Wikilivros, livros abertos por um mundo aberto.

Nota: Após gravar, terá de limpar a cache do seu navegador para ver as alterações. Mozilla / Firefox / Safari: pressione Shift enquanto clica em Recarregar, ou pressione Ctrl-F5 ou Ctrl-R (Command-R num Macintosh); Konqueror:: clique no botão Recarregar ou pressione F5; Opera: limpe a cache em Ferramentas → Preferências (Tools → Preferences); Internet Explorer: pressione Ctrl enquanto clica em Recarregar ou pressione Ctrl-F5.

//<source lang="JavaScript">
/*  _____________________________________________________________________________
 * |                                                                             |
 * |                    === AVISO: ARQUIVO DE GADGET GLOBAL ===                  |
 * |            Alterações a esta página afetarão vários colaboradores           |
 * |            Por favor discuta alterações na página de discussão ou           |
 * |                    em [[Wikilivros:Gadgets]] antes de editar.               |
 * |_____________________________________________________________________________|
 *
 * Importado da versão 0.1.1 de 22/05/2009 do [[commons:MediaWiki:Gadget-rightsfilter.js]]
 * Criado por [[w:en:User:Splarka]] & alterado por [[en:User:Mike.lifeguard]] & [[commons:User:Lupo]]
 * Deve funcionar em qualquer dos temas existentes (que contenham um #contentSub ou #topbar)
 * Filtro para listas <li>
 */
 
 
var rightsLogOnly = (document.location.href.indexOf('type=rights')==-1 && document.location.href.indexOf('Log/rights')==-1) ? false : true
if(wgAction == 'history' || wgCanonicalSpecialPageName == 'Search' || wgCanonicalSpecialPageName == 'Log' || wgCanonicalSpecialPageName == 'CheckUser' || wgCanonicalSpecialPageName == 'LinkSearch' || wgCanonicalSpecialPageName == 'Contributions' || wgCanonicalSpecialPageName == 'Ipblocklist' || queryString('lifilter')) addOnloadHook(filterLiButton)
function filterLiButton() {
	if(document.getElementById('p-cactions')) {
		addPortletLink('p-cactions','javascript:filterLiForm()','Filtro','ca-rxfilter','Abrir um filtro interativo baseado em regex');
		if(window.AutoLoadLogsFilter || queryString('lifilter')) filterLiForm();
	} else {
		filterLiForm(); //not a portlet skin, so add the filter anyway.
	}
}
function filterLiForm() {
	var instructions = (rightsLogOnly) ? 'Filtre a lista de privilégios separados por espaços usando regex.' : 'Filtre a representação desta lista em texto simples usando regex.'
	//generate the form
	try { document.getElementById('ca-rxfilter').style.display = 'none' } catch(e) {}
	var obj = (document.getElementById('contentSub')) ? document.getElementById('contentSub') : document.getElementById('topbar')
	if(!obj) return;
	var rf = document.createElement('div');
		rf.setAttribute('id','rfform');
		rf.style.color = 'black';
		var fs = document.createElement('fieldset');
		var is = document.createElement('p');
			is.appendChild(document.createTextNode(instructions));
		fs.appendChild(is);
		var lg = document.createElement('legend');
			lg.appendChild(document.createTextNode('Filtro para listas <li> (javascript)'));
		fs.appendChild(lg);
		if(rightsLogOnly) {
			var sel = document.createElement('select');
				sel.setAttribute('id','rfselect');
				var op1 = document.createElement('option');
				op1.appendChild(document.createTextNode('direitos adicionados'));
				sel.appendChild(op1);
				var op2 = document.createElement('option');
				op2.appendChild(document.createTextNode('direitos removidos'));
				sel.appendChild(op2);
				var op3 = document.createElement('option');
				op3.appendChild(document.createTextNode('adicionado OU removido'));
				sel.appendChild(op3);
				var op4 = document.createElement('option');
				op4.appendChild(document.createTextNode('adicionado/removido/estatico'));
				sel.appendChild(op4);
			fs.appendChild(sel);
		}
		var lab1 = document.createElement('label');
			lab1.appendChild(document.createTextNode(' Texto (ou regex): '));
			lab1.setAttribute('for','rfinput1');
		fs.appendChild(lab1);
		fs.appendChild(document.createTextNode(' '));
		var inp1 = document.createElement('input');
			inp1.setAttribute('id','rfinput1');
			inp1.setAttribute('name','rfinput1');
			inp1.setAttribute('type','text');
		fs.appendChild(inp1);
		var chk1 = document.createElement('input');
			chk1.setAttribute('id','rfinput2');
			chk1.setAttribute('name','rfinput2');
			chk1.setAttribute('type','checkbox');
		fs.appendChild(chk1);
		var lab2 = document.createElement('label');
			lab2.appendChild(document.createTextNode('Inverter '));
			lab2.setAttribute('for','rfinput2');
		fs.appendChild(lab2);
 
		var chk2 = document.createElement('input');
			chk2.setAttribute('id','rfinput_case');
			chk2.setAttribute('name','rfinput_case');
			chk2.setAttribute('type','checkbox');
			chk2.checked = true; // Default: case-insensitive.
		fs.appendChild(chk2);
		lab2 = document.createElement('label');
			lab2.appendChild(document.createTextNode('Não distinguir maiúsculas e minúsculas '));
			lab2.setAttribute('for','rfinput_case');
		fs.appendChild(lab2);
 
		var sub1 = document.createElement('input');
			sub1.setAttribute('type','button');
			sub1.setAttribute('value','Filtrar');
			addClickHandler(sub1,function() { filterLi(false) });
			sub1.setAttribute('onclick','');
		fs.appendChild(sub1)
		fs.appendChild(document.createTextNode(' '));
		var sub2 = document.createElement('input');
			sub2.setAttribute('type','button');
			sub2.setAttribute('value','Destacar');
			addClickHandler(sub2,function() { filterLi(true) });
		fs.appendChild(sub2)
		rf.appendChild(fs);
	obj.appendChild(rf);
}
 
function filterLi(hilight) {
	//grab options from form
	if(rightsLogOnly) var type = document.getElementById('rfselect').selectedIndex;
	var invert = document.getElementById('rfinput2').checked;
	var srch = document.getElementById('rfinput1').value;
	var flags = (document.getElementById('rfinput_case').checked ? 'ig' : 'g');
	var rx = new RegExp(srch, flags);
 
	//grab the list of all <li> in the content
	var bod = (document.getElementById('bodyContent')) ? document.getElementById('bodyContent') : document.getElementsByTagName('body')[0]
	var lis = bod.getElementsByTagName('li');
	if(lis.length==0) return;
 
	//iterate
	var rightrx = /^.*?User\:.*? from (.*?) to (.*?) \u200E.*?$/i		//the regex used to grab the Special:Log/rights changes
	for(var i=0;i<lis.length;i++) {
		if(rightsLogOnly) {
			//Special:Log/rights
			var oldr = gettext(lis[i]).replace(rightrx,'$1').replace(/\, /g,' ');
			var newr = gettext(lis[i]).replace(rightrx,'$2').replace(/\, /g,' ');
			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 = gettext(lis[i]);
		}
		lis[i].style.display = '';
		lis[i].style.backgroundColor = '';
		if ((look.search(rx)!=-1 && !invert) || (look.search(rx)==-1 && invert)) {
			if(hilight) lis[i].style.backgroundColor = '#ffff99';
		} else {
			if(!hilight) lis[i].style.display = 'none';
		}
	}
}
 
function gettext(object) {
	if (object.nodeType == 3) return object.nodeValue;
	var txt = [];
	var i=0;
	while(object.childNodes[i]) {
		txt[txt.length] = gettext(object.childNodes[i]);
		i++;
	}
	return txt.join('');
}
 
function queryString(p) {
	var re = RegExp('[&?]' + p + '=([^&]*)');
	var matches;
	if (matches = re.exec(document.location)) {
		try { 
			return decodeURI(matches[1]);
		} catch (e) {
		}
	}
	return null;
}
 
//</source>
// [[Categoria:Gadgets|Filtro para listas]]