MediaWiki:Gadget-memoRegex.js

Nota: dopo aver pubblicato, potrebbe essere necessario pulire la cache del proprio browser per vedere i cambiamenti.

  • Firefox / Safari: tieni premuto il tasto delle maiuscole Shift e fai clic su Ricarica, oppure premi Ctrl-F5 o Ctrl-R (⌘-R su Mac)
  • Google Chrome: premi Ctrl-Shift-R (⌘-Shift-R su un Mac)
  • Internet Explorer / Edge: tieni premuto il tasto Ctrl e fai clic su Aggiorna, oppure premi Ctrl-F5
  • Opera: premi Ctrl-F5.
mw.memoRegex=JSON.parse(localStorage.memoRegex);

// caricamento dell'oggetto memoRegex per selezione di codice in modalità edit
mw.caricaRegex=function () {
	var memo=JSON.parse(localStorage.memoRegex);
	var toAdd=JSON.parse(selection()[1]); 
	for (var m in toAdd) {
		memo[m]=toAdd[m];
	}
	
	localStorage.memoRegex=JSON.stringify(memo);
	mw.memoRegex=JSON.parse(localStorage.memoRegex);
	// alert("Le sostituzioni selezionate sono state caricate");
};

// lancio della serie di regex su header. body, footer
mw.memoRegexRun=function () {
	var testo="";
	testo=$("#wpTextbox1").val();
	$.each(mw.memoRegex,function(index,value) {
		
		// verifica se corre sectionEdit e se è attiva una section con  nome
		if (mw.sectionEdit && mw.sectionEdit.name!=="") {
			// verifica se nel commento esiste un prefisso/suffisso, e se corrisponde alla section attiva
			if (test(value[0],mw.sectionEdit.name)) {
				testo=testo.replace(RegExp(index,value[2]),value[1]);
			}
		// altrimenti esegui
		} else {
			testo=testo.replace(RegExp(index,value[2]),value[1]);
		}
		
		
	});
	$("#wpTextbox1").val(testo);
	if (mw.config.get("wgCanonicalNamespace")==="Page") {
		testo=$("#wpHeaderTextbox").val();
		$.each(mw.memoRegex,function(index,value) {
			testo=testo.replace(RegExp(index,value[2]),value[1]);
		});
		$("#wpHeaderTextbox").val(testo);
		testo=$("#wpFooterTextbox").val();
		$.each(mw.memoRegex,function(index,value) {
			testo=testo.replace(RegExp(index,value[2]),value[1]);
		});
		$("#wpFooterTextbox").val(testo);
	}
};

// caricamento dell'oggetto memoRegex da pagina remota di default (nDiscussioni_indice correlato alla pagina corrente)
mw.caricaRegexRemoto = function () {
	// se siamo in nsPagina tenta di caricare una memoRegex memorizzata in Discussioni indice
	if (mw.config.get("wgCanonicalNamespace") == "Page") {
		var paginaFonte = mw.config.get("wgPageName");
		paginaFonte = "Index_talk:"+(/.+:(.+)\//).exec(paginaFonte)[1]; //console.log(paginaFonte);
		$.ajax({
			url: "//it.wikisource.org/w/index.php?action=raw&title="+paginaFonte+"&r="+Math.random(),
		}).done(function(paginaFonte) {
			//console.log(paginaFonte);
			var codiceMemoregex = find_stringa(paginaFonte,'{"','"]}',1); //console.log(codiceMemoregex);
			var memo = {};
			
			try {
				memo = JSON.parse(codiceMemoregex);
				localStorage.memoRegex = JSON.stringify(memo);
				mw.memoRegex = JSON.parse(localStorage.memoRegex);
				mw.alertMessage("MemoRegex", "Le sostituzioni correlate alla pagina sono state caricate");
			}
			catch(err) {
				mw.alertMessage("MemoRegex", "La pagina Discussioni indice non esiste/non contiene memoRegex");
				localStorage.memoRegex = "{}";
			}
		});
	// in ns diversi da nsPagina, tenta di caricare in modo additivo le regex contenuto in un testo selezionato
	} else {
		if (selection()[1]!=="") {
			mw.caricaRegex();
		}
	}
};

// funzione generica di salvataggio di pagina remota
mw.salvaPagina = function (title,text,summary) {
	new mw.Api().postWithToken( 'edit', {
		action: 'edit',
		title: title,
		summary: summary,
		text: text,
	}).done(function( data ) {
        if ( data && data.edit && data.edit.result == 'Success' ) {
			console.log("OK, pagina " + title + " salvata");
		}
	});
};

mw.doSalvaRegex = function(paginaFonte, testoPaginaFonte) {
	regexFormattato = localStorage.memoRegex.replace(/("\],)/g,"$1\n");
	regexOld = find_stringa(testoPaginaFonte,'{"','"]}',1); 
	if (regexOld !== "") {
		testoPaginaFonte = testoPaginaFonte.replace(regexOld,regexFormattato);
	} else {
		testoPaginaFonte += "\n== memoRegex ==\n<nowiki>"+regexFormattato+"</nowiki>\n";
	}
	mw.salvaPagina(paginaFonte, testoPaginaFonte, "salvataggio memoregex");
	mw.alertMessage("MemoRegex", "Regex have been saved into "+paginaFonte);
};

// salvataggio memoRegex su pagina remota (nsDiscussioni_indice)
mw.salvaRegexRemoto = function() {
	if (mw.config.get("wgCanonicalNamespace") == "Page") {
		var paginaFonte = mw.config.get("wgPageName");
		paginaFonte = "Index talk:"+(/.+:(.+)\//).exec(paginaFonte)[1]; //console.log(paginaFonte);
		$.ajax({
			url: mw.config.get("wgServer")+"/w/index.php?action=raw&title="+paginaFonte
		}).done(function(response) {
			mw.doSalvaRegex(paginaFonte, response);
		}).fail(function() {
			mw.doSalvaRegex(paginaFonte, "");
		});
	} else {
		mw.alertMessage("MemoRegex", "Routine can only be called from nsPage");
	}
};

// funzione generica di creazione di bottoni in "bottoniera"
function newButton(nome, funzione, azione, messaggio) { 
// azione è una stringa composta da v,e,s,h rispettivamente view,edit,submit,history
// se nome è un oggetto svolgilo
	var p;
	if (typeof(nome) === "string") {
		p = {
			nome: nome,
			funzione: funzione,
			azione: azione,
			messaggio: messaggio
		};
	} else {
		p = nome;
	}
	if (p.messaggio===undefined) p.messaggio="Nessun aiuto registrato";
	if (p.classe===undefined) p.classe="baseButton";
	if (p.stile===undefined) p.stile="background-color: #f0f0f0; border: 1px solid #d0d0d0; padding: 3px 6px;"+
	"display: inline-block; font-size: 12px;  margin: 0;  cursor: pointer;  border-radius:4px;";
	if (p.namespaces!==undefined) {
		var listaNamespaces=p.namespaces.split("|");
		for (var i=0; i<listaNamespaces.length; i+=1) {
			listaNamespaces[i]=$.trim(listaNamespaces[i]); 
			if (["ns0", "Main", "Principale"].indexOf(listaNamespaces[i]) !== -1) {
				listaNamespaces[i] === "";
			}
		}
		if ($.inArray(mw.config.get('wgCanonicalNamespace'),p.namespaces.split(","))==-1) return;
	}
// Passo 1: se newtatooo non esiste, lo crea
	if ($("#newtattoo").length===0) creaBottoniera();
	// fine se azione=history
	if (mw.config.get('wgAction') === "history") {
		return;
	}
	// normalizzazione function
	if (p.funzione.indexOf("(") === -1 && p.funzione.indexOf(")") === -1) {
		p.funzione += "()";
	}
	// default: bottone presente in view, edit, 
	if (p.azione === undefined) {
		p.azione = "ves";
	}
		// messaggio di default
	if (p.messaggio === undefined) {
		p.messaggio = "Nessun messaggio di aiuto registrato";
	}
	// valutazione condizione di visualizzazione
	if (mw.config.get('wgAction') === "edit" && p.azione.indexOf("e") === -1) {
		return;
	}
	if (mw.config.get('wgAction') === "view" && p.azione.indexOf("v") === -1) {
		return;
	}
	if (mw.config.get('wgAction') === "submit" && p.azione.indexOf("s") === -1) {
		return;
	}
	// caso pulsante=immagine
	var html = "";
	if (p.nome.substring(0, 2) == "//") {
		html = '<img class="'+p.classe+'" style="'+p.stile+'" src="' + p.nome + '" onclick="' + p.funzione + '" title="' + p.messaggio +'"';
		if (p.ondblclick!==undefined) html+=' ondblclick="'+p.ondblclick+'"';
		html+='/>';
	}
	// caso pulsante=label
	else {
		html = '<button class="'+p.classe+'" style="'+p.stile+'" type="button" title="' + p.messaggio + '" onclick="' + p.funzione +'"';
		if (p.ondblclick!==undefined) html+=' ondblclick="'+p.ondblclick+'"';
		html+='><small>' + p.nome + '</small></button>';                
	}
	$("#newtattoo").append($(html));
	return false;
}
/* funzione di creazione della bottoniera 
Dopo l'esecuzione, esiste #newtattoo        */
function creaBottoniera() {
	$('#' + (mw.user.options.get('skin') === 'modern' ? 'mw_' : '') + 'content')
	.append('<div id="newtattoo" align="right" style="position:fixed;bottom:0; right:0; background-color:white; border: 1px solid; border-color:#F0F0F0; z-index:1500;"></div>');
}

/*
Confronta il suffisso o il prefisso di un nome di sezione nel commento
di una regex, con il nome della sezione corrente; restituisce true o false.

Per indicare un prefisso: --testo
Per indicare un suffisso: testo--

*/
function test(commento,sezione) {
   	var r_pref=/ (\w+)--/;
	var r_suff=/--(\w+)/;
	var ok=false;
	if (r_pref.test(commento) || r_suff.test(commento)) {
		if (r_pref.test(commento)) {
			if (RegExp("^"+r_pref.exec(commento)[1]).test(sezione)) ok=true;
		} else {
			if (r_suff.test(commento)) {
				if (RegExp(r_suff.exec(commento)[1]+"$").test(sezione)) ok=true;
			}
		}
	} else ok=true;
	return ok;
}
// comandi lanciati al momento del caricamento della pagina corrente
// newButton("regex up","mw.caricaRegex","es","Carica le sostituzioni selezionate");
newButton("salva regex", "mw.salvaRegexRemoto","es","Scarica sulla pagina Discussioni indice le sostituzioni attive");
newButton("carica regex", "mw.caricaRegexRemoto","es","Allinea memoRegex alla pagina Discussioni indice");
newButton("esegui regex", "mw.memoRegexRun","es","Esegue le sostituzioni memorizzate");
if (mw.config.get("wgCanonicalNamespace")==="Page" && mw.config.get("wgAction")==="edit" ) {
     // caricamento del nome base pagina corrente
     localStorage.currentBasePage=(/.+?:(.+)\/\d+$/m).exec(mw.config.get("wgPageName"))[1];
     // se localStorage.currentRegexBasePage non è definito definiscilo
     if (localStorage.currentRegexBasePage===undefined) {
     	localStorage.currentRegexBasePage=localStorage.currentBasePage;
     }
     // se le regex memorizzate sono relative a un'altra BasePage carica le regex appropriate
     if (localStorage.currentRegexBasePage!==localStorage.currentBasePage) {
     	localStorage.currentRegexBasePage=localStorage.currentBasePage;
     	mw.caricaRegexRemoto();
     }
}