Utente:Alex brollo/memoRegex.js

Notarella: Aroppo pubbreca putisse necessità 'e pulezzà 'a caché d' 'o navigatóre pe vedé 'e cagnamienti.

  • Firefox / Safari: Sprémme 'o buttóne maiuscole e ffà clic ncopp'a Recarreca, o pure spremme Ctrl-F5 o Ctrl-R (⌘-R ncopp'a Mac)
  • Google Chrome: spremme Ctrl-Shift-R (⌘-Shift-R ncopp'a nu Mac)
  • Internet Explorer/edge: Spremme 'o buttóne Ctrl pe' tramente ca faie click ncopp'a Refresh, o pure spremmere Ctrl-F5
  • Opera: Vaje addò 'o Menu → Mpustaziune (Opera → Mpustaziune ncopp' 'o Mac) e po' ncopp'a Privacy & sicurezza → Pulezza date d' 'o browser → Immaggene e file d' 'a cache.
// pulsante
mw.loader.using( [ 'mediawiki.util',
					'oojs-ui-core',
					'ext.wikiEditor'
								 ], function () {
	// for any namespace
	if ( mw.config.get("wgAction")==="edit" ||mw.config.get("wgAction")==="submit")  {
		$(document).ready(function() {

			// bozza funzioni specifiche
			if ( typeof $ != 'undefined' && typeof $.fn.wikiEditor != 'undefined' ) { 
				$( function() {

					// CREA PULSANTE
					var rhButton = new OO.ui.ButtonWidget( { 
						label: 'mR',
						id: 'memoRegex-button-widget',
						framed: false,
						title: 'Attiva F & R con memorizzazione'
					} );
					rhButton.on( 'click', function ( context ) { 
						mostraTrovaSostituisci(); 
					} );

					$( '#wikiEditor-section-advanced' ).append( rhButton.$element );

					// $('[accesskey=y]').removeAttr('accesskey');
					// $('.wikiEditor-ui-toolbar [title="Indenta i versi selezionati [alt-shift-y]"]').attr('accesskey', 'y');
				});}
		});
	}
});


// funzioni per Trova e sostituisci
function find_stringa  (testo, idi, idf, dc, x) {
	
	var idip, idfp, vvalore;
	
	idip = testo.indexOf( idi );
	idfp = testo.indexOf( idf, idip + idi.length ) + idf.length;
	
	if (idip > -1 && idfp > -1) {
		if (x !== "") {
			while ( count( testo.slice( idip, idfp ), x ) > count( testo.slice( idip, idfp ), idf ) ) {
				idfp = testo.indexOf( idf, idfp ) + idf.length;
			}
		}
		if ( dc === false ) {
			vvalore = testo.slice( idip + idi.length, idfp - idf.length );
		} else {
			vvalore = testo.slice( idip, idfp );
		}
	} else {
		vvalore = "";
	}
	return vvalore;
}

function scriviBox(testo, area, ss, se) {
	if (area === undefined || area === "") {
		if (mw.config.get('wgCanonicalNamespace') == "Page" || $("#editBox").length===1) {
			area = 1;
		} else {
			area = 0;
		}
	}
	$('textarea')[area].value = testo;
	// console.log("area:", area);
	if (ss !== undefined && se !== undefined) {
		$('textarea')[area].selectionStart = ss;
		$('textarea')[area].selectionEnd = se;
	}
}
function leggiBox(area) {
	if (area === undefined) {
		if (mw.config.get('wgCanonicalNamespace') == "Page" || $("#editBox").length===1) area = 1;
		else area = 0;
	}
	return $('textarea')[area] === undefined ? '' : $('textarea')[area].value;
}
//TROVA E SOSTITUISCI
//Edit Alex versione 25.01.13
$('body').append($(
	'<div id="findReplace_box" style="display:none;font-size:90%; width:500px;height:165px;position:fixed; z-index:1500;top:0px;right:0px;background-color:white;border:2px solid #0645AD;padding:10px">' +
	'<div style="float:left">Cerca (testo o espressione regolare):</div>' +
	'<div style="float:right"><input type="text" id="findReplace_find" size="30"/></div>' +
	'<div style="clear:both;float:left">Sostituisci con: </div>' +
	'<div style="float:right"><input type="text" id="findReplace_replace" size="30"/></div>' +
	'<div style="clear:both;float:left">Commento: </div>'+
	'<div style="float:right"><input type="text" id="findReplace_doc" size="50"/></div>' +
	'<div style="clear:both;float:left">' +
	'<input type="checkbox" id="findReplace_regex"/><label for="findReplace_regex">Espressione regolare</label><br/>' +
	'<input type="checkbox" id="findReplace_maiusc"/><label for="findReplace_maiusc">Non distinguere maiuscole/minuscole</label><br/>' +
	'<input type="checkbox" id="findReplace_multiriga"/><label for="findReplace_multiriga">Multiriga</label><br/>' +
	'<input type="checkbox" id="findReplace_ricorda"/><label for="findReplace_ricorda">Ricorda questa sostituzione</label></div>' +
	'<div style="float:right;margin-top:60px;"><input type="button" id="findReplace_run" title="Esegui la sostituzione impostata" value="OK" onclick="trovaSostituisci()"/>' +
	'<input type="button" id="findReplace_close" value="Chiudi" title="Nascondi il box" onclick="nascondiTrovaSostituisci()"/></div></div>'));

function mostraTrovaSostituisci() {
	$('#findReplace_box').css("display", "block");
	var t = selection();
	$("#findReplace_find").attr("value", t[1]);
	$("#findReplace_replace").attr("value", t[1]).click();
}

function nascondiTrovaSostituisci() {
	$('#findReplace_box').css("display", "none");
};

function regexRepl(trova, sostituisci, modificatori) {
	if (modificatori === undefined) modificatori = 'g';
	var regex = new RegExp(trova, modificatori);
	var testo = $('[name=wpTextbox1]').val();
	$('[name=wpTextbox1]').val(testo.replace(regex, sostituisci));
};
function trovaSostituisci() {
	var trova = $('#findReplace_find').val();
	var sostituisci = $('#findReplace_replace').val().replace(/\\n/g, '\n'); //trasforma il backslash-n in un "vero" newline
	var commento=$('#findReplace_doc').val();	
	var isRegex = $('#findReplace_regex').is(':checked');
	var isMaiusc = $('#findReplace_maiusc').is(':checked');
	var isMultiriga = $('#findReplace_multiriga').is(':checked');
	var isRicorda = $('#findReplace_ricorda').is(':checked');
	var regexParams = 'g';
	if (!isRegex) {
		//escape dei caratteri speciali delle regex
		trova = trova.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
	}
	if (isMaiusc) {
		regexParams += 'i';
	}
	if (isMultiriga) {
		regexParams += 'm';
	}
	//applica la sostituzione nella pagina corrente
	regex = new RegExp(trova, regexParams);
	/* testo = $('[name=wpTextbox1]').val();
	$('[name=wpTextbox1]').val(testo.replace(regex, sostituisci)); */
	// attivazione su tutti i tre campi se in nsPagina 
	if (mw.config.get("wgCanonicalNamespace")==="Page") {
		for (i=0;i<3;i+=1) {
		scriviBox(leggiBox(i).replace(regex,sostituisci),i);
		}
	} else {
		scriviBox(leggiBox().replace(regex,sostituisci));
	}
	
	/* da sostituire con localStorage*/
	//se l'utente ha spuntato "Ricorda", salva in un cookie
	if (isRicorda) {
		// se localStorage.memoRegex esiste lo carico in mw.memoRegex 
		if (localStorage.memoRegex!==undefined) mw.memoRegex=JSON.parse(localStorage.memoRegex);
		if (mw.memoRegex===undefined) mw.memoRegex={};
		commento=commento.replace("(regex)","");
		if (isRegex) {
			commento+="(regex)";
		}
	
		// aggiorno localStorage["regex"] 
		mw.memoRegex[trova]=[commento,sostituisci,regexParams]; console.log("Passato per riga 549");
		localStorage.memoRegex=JSON.stringify(mw.memoRegex);
		localStorage.memoRegexEdited=true;   
	} 
};


// funzioni specifiche per memoRegex
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);
		paginaFonte=$.ajax({url:"//nap.wikisource.org/w/index.php?action=raw&title="+paginaFonte+"&r="+Math.random(),async:false}).responseText;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);
			alert("Le sostituzioni correlate alla pagina sono state caricate");
		}
		catch(err) {
			alert("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");
	
			}
		});
	};

// 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);
		var regexOld="";
		var testoPaginaFonte="";
		var regexFormattato="";
		//paginaFonte="Index talk:"+paginaFonte;
		testoPaginaFonte = $.ajax({url:mw.config.get("wgServer")+"/w/index.php?action=raw&title="+paginaFonte,async:false}).responseText;
		var errore=find_stringa(testoPaginaFonte,"<!DOCTYPE html>","</html>",1);
		if (errore!=="") {
			testoPaginaFonte=testoPaginaFonte.replace(errore,"");
		}
		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");
		alert("Regex have been saved into "+paginaFonte);
	} else {
		alert("Routine can only be called from nsPage");
	}
	
};

/*'<div style="clear:both;float:left">Commento: </div>'+
	'<div style="float:right"><input type="text" id="findReplace_doc" size="50"/></div> */

$("#findReplace_box").append($('<div style="clear:both;float:left">Gestione memoRegex </div>'+
    '<div style="float:right"><input type="button" id="findReplace_save" title="Salva le sostituzioni correnti" value="save" onclick="mw.salvaRegexRemoto()"/>' +
	' <input type="button" id="findReplace_load"  value="load" title="Forza la ricarica delle sostituzioni memorizzate" onclick="mw.caricaRegexRemoto()"/>' +
	' <input type="button" id="findReplace_run"  value="run" title="Esegui tutte le sostituzioni correnti" onclick="mw.memoRegexRun()"/></div>'));

if (mw.config.get("wgCanonicalNamespace")==="Page" && (mw.config.get("wgAction")==="edit" || mw.config.get("wgAction")==="submit") ) {
     // Elimino il find & replace rotto
     $(".group-search").remove();
     // 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();
     	
     	
     }
}