Wikiversità:Monobook.js/VFonLine.js
//
// Stiamo modificando la White o la Black List? var BlackOrWhite = ""; $(function (){ if (BrowserDetect.browser!="Firefox" && BrowserDetect.browser!="Mozilla" && BrowserDetect.browser!="Netscape") return; // Funziona solo con browser della famiglia Firefox if (wgCanonicalSpecialPageName != "Recentchanges") return; //Serve solo in Utlime modifiche var abilitato = GetCookie('wikiVFOL'); if (abilitato == '' || abilitato == 'disabilitato') return; //Serve solo se c'e' abilitato il filtro // Lettura cookie: nei cookie ho salvato la lista in formato testo. Per poter funzionare il controllo devo // codificarla in formato URI (ad esempio sostituendo "û" con "%C3%BB") WhiteList = GetCookie('wikiWhiteList'); WhiteList = correggiTesto(WhiteList); BlackList = GetCookie('wikiBlackList'); BlackList = correggiTesto(BlackList); // Leggo il contenuto di "content" var Contenuto = document.getElementById('content'); // Estraggo le righe delle modifiche if (Contenuto.innerHTML.indexOf("</h4>\n<ul class=\"special\">") != -1) tagliatoDa = Contenuto.innerHTML.indexOf("</h4>\n<ul class=\"special\">")+26; // +26 per saltare '</h4>\n<ul class="special">' else tagliatoDa = Contenuto.innerHTML.indexOf('</h4>')+11; // +11 per saltare '</h4>\n<div>' // Ogni singola modifica e' un elenco di tag ed e' separata dalle altre con l'uso di <br /> TutteLeModifiche = Contenuto.innerHTML.substr(tagliatoDa); // Splitta le modifiche rispetto a <\n> var Modifiche = TutteLeModifiche.split("\n"); // Variabili necessarie per colorare i div che racchiudono numerose modifiche var tutteVerdi = true; // Tutte le modifiche all'interno sono verdi var unaGialla = false; // Almeno una modifica e' gialla var unaRossa = false; // Almeno una modifica e' rossa var inDiv = false; // Sono nel div var escoAdesso = false; // Mi dice se sto uscendo dal div nell'iterazione corrente del ciclo var divCorrente = 0; var preModifica = ""; // Se la riga inizia con un tag DIV devo eliminarlo, e ricordarmi di riaggiungerlo dopo // Per ogni modifica for (z=0;z<Modifiche.length;z++) { inizioNomeUtente = Modifiche[z].indexOf("Speciale:Contributi/") + 20; lunghezzaNomeUtente = Modifiche[z].indexOf("\"",inizioNomeUtente) - inizioNomeUtente; nomeUtente = Modifiche[z].substr(inizioNomeUtente,lunghezzaNomeUtente); // Gestione variabili del DIV preModifica = ""; // al momento non ho cancellato niente dalla modifica corrente // Inizio DIV if (Modifiche[z].substr(0,5)=="<div ") { divCorrente = z-1; // la riga precedente inDiv = true; tutteVerdi = true; unaRossa = false; unaGialla = false; } // Fine DIV if (Modifiche[z].substr(0,6)=="</div>") { // Se siamo arrivati al footer possiamo ignorare questa chiusura di DIV (si riferisce alla chiusura di TutteLeModifiche) // altrimenti segnalo "escoAdesso=true", ovvero "colora il DIV" if (Modifiche[z].indexOf('<div class="printfooter">') == -1) { inDiv = false; escoAdesso = true; } } if ((WhiteList.indexOf("@"+nomeUtente+"@") != -1) || // in Whitelist (BlackList.indexOf("@"+nomeUtente+"@") != -1) || // in Blacklist (nomeUtente.match(/^([0-9]+\.){3}[0-9]+$/))) // Edit di un anonimo { // Se questa modifica apre una serie racchiusa in un div va eliminato il tag di apertura if (Modifiche[z].substr(0,5)=="<div ") { preModifica = Modifiche[z].substr(0,Modifiche[z].indexOf('<',2)); Modifiche[z] = Modifiche[z].substr(Modifiche[z].indexOf('<',2)); } // Se questa modifica appare dopo un div va eliminato il tag di chiusura if (Modifiche[z].substr(0,6)=="</div>") { preModifica = Modifiche[z].substr(0,6); Modifiche[z] = Modifiche[z].substr(6); } // Colora la riga temp = preModifica; if (WhiteList.indexOf("@"+nomeUtente+"@") != -1) temp += '<div style="background-color: #CCFFCC;">'; else if (BlackList.indexOf("@"+nomeUtente+"@") != -1) { if (inDiv == true) { unaRossa = true; tutteVerdi = false; } temp += '<div style="background-color: #FFCCCC;">'; } else // Edit anonimo { if (inDiv == true) unaGialla = true; temp += '<div style="background-color: #FFFFBB;">'; } temp += Modifiche[z]; temp += '</div>'; // Aggiorno "Modifiche[z]" per usarlo nella creazione dei link di gestione liste Modifiche[z] = temp; } else // l'utente non e' ne' in Whitelist ne' in Blacklist e non e' un anonimo if (inDiv == true) tutteVerdi = false; // Aggiungo i link per l'aggiunta/rimozione automatica dalle liste // Li aggiungo solo se non siamo nella prima riga di un DIV e se la riga contiene una modifica if ((Modifiche[z].indexOf("javascript:toggleVisibility") == -1) && (Modifiche[z].indexOf("Speciale:Contributi/") != -1)) { // Decido le azioni da proporre azioneWL = ""; azioneBL = ""; if (WhiteList.indexOf("@"+nomeUtente+"@") != -1) // utente in Whitelist azioneWL = '<a href="javascript:removeFromList(\'White\',\''+nomeUtente+'\')" title="Elimina dalla Whitelist">-wl</a>'; else azioneWL = '<a href="javascript:addToList(\'White\',\''+nomeUtente+'\')" title="Aggiungi alla Whitelist">+wl</a>'; if (BlackList.indexOf("@"+nomeUtente+"@") != -1) // utente in Blacklist azioneBL = '<a href="javascript:removeFromList(\'Black\',\''+nomeUtente+'\')" title="Elimina dalla Blacklist">-bl</a>'; else azioneBL = '<a href="javascript:addToList(\'Black\',\''+nomeUtente+'\')" title="Aggiungi alla Blacklist">+bl</a>'; // Calcolo il punto di inserimento if (nomeUtente.match(/^([0-9]+\.){3}[0-9]+$/)) // edit di un utente anonimo doveScrivere = Modifiche[z].indexOf('<a href="/wiki/Speciale:Contributi/'+nomeUtente); // Vai al link del nome utente else { if (Modifiche[z].indexOf('<a href="/wiki/Utente:') != -1) // se l'utente ha una sua pagina doveScrivere = Modifiche[z].indexOf('<a href="/wiki/Utente:'+nomeUtente+'"'); // Vai al link del nome utente else // la pagina utente e' da creare doveScrivere = Modifiche[z].indexOf('<a href="/w/index.php?title=Utente:'+nomeUtente); // Vai al link del nome utente } doveScrivere = Modifiche[z].indexOf('</a>',doveScrivere) + 4; // Vai alla fine del link del nome utente // Aggiungi i link temp = Modifiche[z].substr(0,doveScrivere); temp += " (" + azioneWL; temp += " " + azioneBL + ")"; temp += Modifiche[z].substr(doveScrivere); Modifiche[z] = temp; } // Se sto uscendo da un DIV calcolo come colorarlo if (escoAdesso == true) { // Colora la riga if ((unaRossa == true) || (tutteVerdi == true) || (unaGialla == true)) { if (unaRossa == true) temp = '<div style="background-color: #FFCCCC;">'; else if (unaGialla == true) temp = '<div style="background-color: #FFFFBB;">'; else temp = '<div style="background-color: #CCFFCC;">'; temp += Modifiche[divCorrente]; temp += '</div>'; Modifiche[divCorrente] = temp; } // Setta i default per il controllo DIV escoAdesso = false; tutteVerdi = true; unaRossa = false; unaGialla = false; inDiv = false; } } // ricrea TutteLeModifiche TutteLeModifiche = Modifiche.join("\n"); // Applica tutti i cambiamenti fatti all'elemento "content" Contenuto.innerHTML = Contenuto.innerHTML.substr(0, tagliatoDa) + TutteLeModifiche; }) // Rimuove un dato utente da una lista function removeFromList(lista,utente) { // leggi il cookie contenuto = GetCookie('wiki'+lista+'List'); // elimina l'utente richiesto temp = contenuto.substr(0,contenuto.indexOf(utente)); temp += contenuto.substr(contenuto.indexOf(utente)+utente.length+1); contenuto = temp; // salva il cookie var cookieExpire = new Date(); // scadenza del cookie cookieExpire.setTime(cookieExpire.getTime() + (12 * 30 * 24 * 60 * 60 * 1000)); // il cookie scade dopo 1 anno SetCookie('wiki'+lista+'List', contenuto, cookieExpire.toGMTString(), '/'); } // Aggiunge un dato utente ad una lista function addToList(lista,utente) { // trasforma gli underscore in spazi while (utente.indexOf("_") != -1) { temp = utente.substr(0,utente.indexOf("_")); temp += " "; temp += utente.substr(utente.indexOf("_")+1); utente = temp; } // leggi il cookie contenuto = GetCookie('wiki'+lista+'List'); // Se l'utente e' gia' inserito esci if (contenuto.indexOf("@"+utente+"@") != -1) return; // aggiunge l'utente richiesto contenuto = "@"+utente+contenuto; // Nella Whitelist aggiunge in ordine alfabetico, nella blacklist aggiunge in cima if (lista == "White") contenuto = '@'+(contenuto.substr(1,contenuto.length-2).split('@').sort().join('@'))+'@'; // salva il cookie var cookieExpire = new Date(); // scadenza del cookie cookieExpire.setTime(cookieExpire.getTime() + (12 * 30 * 24 * 60 * 60 * 1000)); // il cookie scade dopo 1 anno SetCookie('wiki'+lista+'List', contenuto, cookieExpire.toGMTString(), '/'); } // Nei cookie ho salvato la lista in formato testo. Per poter funzionare il controllo devo // codificarla in formato URI (ad esempio sostituendo "û" con "%C3%BB") // devo trasformare i "%40" in "@", @ e' il separatore tra i nomi // devo trasformare i "%20" in underscore (altrimenti non funziona il confronto con white e black list) function correggiTesto(stringa) { // codifica la stringa stringa = encodeURIComponent(stringa); // Trasforma gli "%40" in "@" (altrimenti non funziona il confronto con white e black list), @ e' il separatore tra i nomi while (stringa.indexOf("%40") != -1) { temp = stringa.substr(0,stringa.indexOf("%40")); temp += "@"; temp += stringa.substr(stringa.indexOf("%40")+3); stringa = temp; } // Trasforma i "%20" in underscore (altrimenti non funziona il confronto con white e black list) while (stringa.indexOf("%20") != -1) { temp = stringa.substr(0,stringa.indexOf("%20")); temp += "_"; temp += stringa.substr(stringa.indexOf("%20")+3); stringa = temp; } return stringa; } function enableVFOL() { var scritta = GetCookie('wikiVFOL'); if (scritta == '') // Se il cookie non esiste scritta = "disabilitato"; // per default e' disabilitato // Aggiorna il cookie var cookieExpire = new Date(); // scadenza del cookie cookieExpire.setTime(cookieExpire.getTime() + (12 * 30 * 24 * 60 * 60 * 1000)); // il cookie scade dopo 1 anno if (scritta=="abilitato") { scritta="disabilitato"; SetCookie('wikiVFOL', "disabilitato", cookieExpire.toGMTString(), '/'); // Carica il nodo padre d = document.getElementById('vfol').parentNode; // ed elimina i figli d.removeChild(document.getElementById('vfol1')); d.removeChild(document.getElementById('vfol2')); } else { scritta="abilitato"; SetCookie('wikiVFOL', "abilitato", cookieExpire.toGMTString(), '/'); // Carica il nodo padre var tb = document.getElementById('p-tb').getElementsByTagName('ul')[0]; // E crea i figli addlilink(tb, 'javascript:ModificaListaVFOL("White")', 'Mostra la White List', 'vfol1'); addlilink(tb, 'javascript:ModificaListaVFOL("Black")', 'Mostra la Black List', 'vfol2'); } //E aggiorna la scritta a video document.getElementById('vfol').innerHTML="<a href='javascript:enableVFOL()'>VFonLine "+scritta+"</a>"; } // Carica il contenuto della White/Black List (es:cookie 'wikiWhiteList') nella textarea function mostraListVFOL() { // Leggi il cookie contenuto = GetCookie('wiki'+BlackOrWhite+'List'); // Correggi iniziale e finale contenuto = contenuto.substr(1, contenuto.length -2); WBTextarea = document.getElementById("WBTextarea"); // Mostra la lista trasformando i '@' in '\n' WBTextarea.value = contenuto.split('@').join('\n'); } // Salva il contenuto della textarea nella White/Black List (es: cookie 'wikiWhiteList') function salvaListVFOL() { WBTextarea = document.getElementById("WBTextarea"); testo = WBTextarea.value.split('\n'); //Concateno i nomi usando il carattere '@'. Essendo vietato nei nickname evita ambiguita' elencoNomi = testo.join('@'); // Correggi iniziale e finale elencoNomi = '@' + elencoNomi + '@'; // Aggiorna il cookie var cookieExpire = new Date(); // scadenza del cookie cookieExpire.setTime(cookieExpire.getTime() + (12 * 30 * 24 * 60 * 60 * 1000)); // il cookie scade dopo 1 anno SetCookie('wiki'+BlackOrWhite+'List', elencoNomi, cookieExpire.toGMTString(), '/'); // e chiudi tutto RemoveNode("WBListPopupDiv"); } // Crea il popup utilizzato per modificare la White/Black List function ModificaListaVFOL(tipo) { // memorizza la lista da modificare BlackOrWhite = tipo; //Creo il testo del popup Greeter = "{{big|testo=<b>Modifica della \"" + BlackOrWhite + "List\"</b>{{big|testo=<br />"; var div = document.createElement('div'); div.id = 'WBListPopupDiv'; div.style.position = 'fixed'; div.style.zIndex = 1000; div.style.left = '5px'; div.style.top = '5px'; div.style.backgroundColor = '#FFFFFF'; div.style.borderStyle = 'solid'; div.style.borderWidth = ' medium'; div.style.borderColor = '#000000'; div.style.width = '220px'; var top = document.createElement('div'); top.id = 'WBListPopupTop'; top.style.textAlign = 'right'; top.style.margin = '8px'; top.style.backgroundColor = '#DDDDDD'; // crea il tasto "Close" var a = document.createElement('a'); a.appendChild(document.createTextNode('Close')); a.href = "javascript:void RemoveNode('WBListPopupDiv')"; a.style.margin = '8px'; top.appendChild(a); div.appendChild(top); // crea la textarea var greet = document.createElement('p'); greet.innerHTML = Greeter; greet.style.margin = '10px'; div.appendChild(greet); var form = document.createElement('form'); form.name = "popupForm"; var p = document.createElement('p'); var lista = document.createElement('TEXTAREA'); lista.name = 'WBList'; lista.id = 'WBTextarea'; lista.rows = 10; lista.style.width = '200px'; lista.style.margin = '7px'; p.appendChild(lista); // crea il bottone "OK" var button = document.createElement('input'); button.value = 'OK'; button.type = 'button'; button.style.margin = '8px'; button.setAttribute('onclick', 'salvaListVFOL()'); p.appendChild(button); // crea il bottone "Annulla" var button2 = document.createElement('input'); button2.value = 'Annulla'; button2.type = 'button'; button2.style.margin = '8px'; button2.setAttribute('onclick', 'RemoveNode("WBListPopupDiv")'); p.appendChild(button2); // reimposta il tutto form.appendChild(p); div.appendChild(form); // e lo mostra a video document.body.appendChild(div); div.getElementsByTagName('input')[0].focus(); // e carica la lista mostraListVFOL(); } //