MediaWiki:Gadget-RegexMenuFramework.js

Da Wikisource.

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.
if (mw.config.get('wgCanonicalNamespace') != 'Index' && (mw.config.get("wgAction") == 'edit' || mw.config.get("wgAction") == 'submit')) {
	$(document).ready(function() {

		// importazione di xml2text - chiamato da cleanup()
		//importScript("Utente:Alex brollo/xml2text.js");

		// inizializzazione di localStorage.memoRegex come oggetto vuoto se indefinito
		if (localStorage.memoRegex===undefined) {
			localStorage.memoRegex=JSON.stringify({});
		}
		if (localStorage.memoRegexEdited===undefined) {
			localStorage.memoRegexEdited=false;   // nota: viene salvato come stringa "false"
		}

		/*****************************/
		/* Script:  [[m:User:Pathoschild/Scripts/Regex menu framework]]
		  * RegexMenuFramework: creates a sidebar menu of user-defined regex tools
		  * Documentation: [[m:User:Pathoschild/Scripts/Regex menu framework]]
		  * Written by: Pathoschild
		  * 
		  <source lang="javascript"><nowiki>
		*/

		lt = function(testo, caratteri) {
			if (caratteri===undefined) caratteri = " ;:*#'-—(";
			while (testo.length > 0 && (caratteri.indexOf(testo.substr(0, 1)) > -1 || testo.substr(0, 4) == "{{R|")) {
				if (testo.substr(0, 4) == "{{R|") {
					var r = find_stringa(testo, "{{R|", "}}", 1, "{{");
					testo = testo.replace(r, "");
				} else {
					testo = testo.substr(1);
				}
			}
			return testo;
		};

		inizialeMaiuscola = function() {
			var txt = leggiBox();
			txt = txt.split("\n");
			for (var i = 0; i < txt.length; i += 1) {
				var riga = lt(txt[i]);
				var rigaNew = riga.substr(0, 1).toLocaleUpperCase() + riga.substr(1);
				if (riga != rigaNew) {
					txt[i] = txt[i].replace(riga, rigaNew);
				}
			}
			txt = txt.join("\n");
			scriviBox(txt);
		};

		rmflinks = function() {
			if (mw.config.get("wgServer") === "//it.wikisource.org") {
				$("#p-regex h3").html('Strumenti per la rilettura &nbsp;&nbsp;&nbsp;(<a href="//it.wikisource.org/wiki/Aiuto:Strumenti_per_la_rilettura" target="_blank">Aiuto</a>)');
				/*  disattivo "importa dati"  
				if (mw.config.get("wgPageName").indexOf("Modulo:Dati/") === 0) {
					regexTool('importa dati', 'parseIndice()', 'Importa i dati dalla pagina Indice');
				}
				*/
				 var sh_bold=function() {incapsula("'''","'''");};
				 var sh_ital=function() {incapsula("''","''");};
				 var sh_center=function() {incapsula("{{centrato|","}}");};
				 var sh_right=function() {incapsula("{{a destra|","}}");};
				 var sh_apostrofo=function() {incapsula("","’");};
				 var sistema=function () {
					var t=selection(); 
					var l1=[]; 
					var l2=[]; 
					var testo=t[1].split("\n"); 
					for (i=0;i<testo.length;i+=1) {
						var l=testo[i].split("|");
						l1.push(l[0]); 
						l2.push(l[1]);
					}
						
					t[1]=l1.join("\n")+"\n"+l2.join("\n"); 
					scriviBox(t.join("\n"));
					return false;
				};
				shortcut.add("Ctrl+B",sh_bold);
				shortcut.add("Ctrl+I",sh_ital);
				shortcut.add("Ctrl+E",sh_center);
				shortcut.add("Ctrl+R",sh_right);
				shortcut.add("Ctrl+Alt+D",sistema);
				shortcut.add("Ctrl+Alt+'",sh_apostrofo);
				// nuova funzione switch toggle box immagine
				shortcut.add("Ctrl+Down",function() {$(".prp-page-image").toggle();});
				//nuova funzione switch altezza box di edit
				shortcut.add("Ctrl+Up",function () {
				    if ($("#wpTextbox1").attr("rows")==="8") 
					   $("#wpTextbox1").attr("rows","25"); 
				    else 
				    	$("#wpTextbox1").attr("rows","8");
				});
				regexTool('Trova & sostituisci', 'mostraTrovaSostituisci()', 'Trova e sostituisci');
				// regexTool('AutoreCitato', 'acrepl()', "normalizza AutoreCitato trasformandolo in chiamata a due parametri");
				regexTool('Elimina riga 1 Alt+5', 'rimuoviPrimaRiga()', 'Cancella la prima riga della pagina');
				shortcut.add("Alt+5", rimuoviPrimaRiga);
				regexTool('Aggiusta paragrafi Alt+6', 'aggiustaParagrafi()',
					"Aggiunge una riga vuota dopo le righe che terminano con punteggiatura di fine paragrafo");
				shortcut.add("Alt+6", aggiustaParagrafi);
				regexTool('PostOCR Alt+7', 'cleanup()', "Corregge piccole imperfezioni del testo prodotto da OCR e riunisce le parole spezzate a fine riga");
				shortcut.add("Alt+7", cleanup);
				regexTool('Unisci linee Alt+8', 'joinLines()', "Riunione delle linee dei paragrafi esclusi alcuni casi speciali (poem e altri)");
				shortcut.add("Alt+8", joinLines);
				regexTool('AutoPt', 'autoPt()', "Aggiunge il template Pt, prevalentemente utilizzato per le parole spezzate a fine pagina");
				shortcut.add("Alt+9", newRi);
				regexTool('Converti é ->è', 'convertiAcuti()',
					"Converte le lettere é in lettere è, rispettando le convenzioni ortografiche correnti nei testi non recenti");
				regexTool('Spostamento note', 'toggleNote()', "Sposta le note dal corpo del testo a fine testo e viceversa per facilitare la rilettura");
				regexTool('Numero riga ogni 3', 'numeroRiga(2, 3)',
					"Aggiunge la numerazione dei versi al <poem></poem> in cui ti trovi, inserendo il numero ogni 3 versi");
				regexTool('Numero riga ogni 4', 'numeroRiga(2, 4)',
					"Aggiunge la numerazione dei versi al <poem></poem> in cui ti trovi, inserendo il numero ogni 4 versi");
				regexTool('Numero riga ogni 5', 'numeroRiga(2, 5)',
					"Aggiunge la numerazione dei versi al <poem></poem> in cui ti trovi, inserendo il numero ogni 5 versi");
				regexTool('Num. riga ogni fine strofa', 'numeroRiga(1)',
					"Aggiunge la numerazione dei versi al <poem></poem> in cui ti trovi, numerando il verso finale di ogni strofa.");
				regexTool('Elimina tutti gli {{R}}', 'numeroRiga(0)', "Rimuove la numerazione dei versi");
				regexTool('Virgolette', 'Virgolette()',
					'Converte le doppie virgolette dattilografiche "" in doppie virgolette tipografiche “” (una seconda chiamata alla funzione inverte le virgolette)');
				
				regexTool('Iniziale maiuscola', 'inizialeMaiuscola()', "Rende maiuscola la lettera iniziale di versi e righe");
			} else { // fuori da it.wikisource.org
				regexTool('trova & sostituisci', 'mostraTrovaSostituisci()', 'Trova e sostituisci');
				regexTool('elimina riga 1 Alt+5', 'rimuoviPrimaRiga()', 'Cancella la prima riga della pagina');
				shortcut.add("Alt+5", rimuoviPrimaRiga);
				regexTool('aggiusta paragrafi Alt+6', 'aggiustaParagrafi()',
					"Aggiunge una riga vuota dopo le righe che terminano con punteggiatura di fine paragrafo");
				shortcut.add("Alt+6", aggiustaParagrafi);
				regexTool('postOCR Alt+7', 'cleanup()', "Corregge piccole imperfezioni del testo prodotto da OCR e riunisce le parole spezzate a fine riga");
				shortcut.add("Alt+7", cleanup);
				regexTool('unisci linee Alt+8', 'joinLines()', "Riunione delle linee dei paragrafi esclusi alcuni casi speciali (poem e altri)");
				shortcut.add("Alt+8", joinLines);
				regexTool('RigaIntestazione Alt+9', 'newRi()', "Aggiunge il template RigaIntestazione");
				shortcut.add("Alt+9", newRi);
				/*regexTool('Numero riga ogni 3', 'numeroRiga(2, 3)',
					"Aggiunge la numerazione dei versi al <poem></poem> in cui ti trovi, inserendo il numero ogni 3 versi");
				regexTool('Numero riga ogni 4', 'numeroRiga(2, 4)',
					"Aggiunge la numerazione dei versi al <poem></poem> in cui ti trovi, inserendo il numero ogni 4 versi");
				regexTool('Numero riga ogni 5', 'numeroRiga(2, 5)',
					"Aggiunge la numerazione dei versi al <poem></poem> in cui ti trovi, inserendo il numero ogni 5 versi");
				regexTool('Num. riga ogni fine strofa', 'numeroRiga(1)',
					"Aggiunge la numerazione dei versi al <poem></poem> in cui ti trovi, numerando il verso finale di ogni strofa.");
				regexTool('Elimina tutti gli {{R}}', 'numeroRiga(0)', "Rimuove la numerazione dei versi");
				regexTool('converti é ->è', 'convertiAcuti()',
					"Converte le lettere é in lettere è, rispettando le convenzioni ortografiche correnti nei testi non recenti");
				regexTool('virgolette', 'Virgolette()',
					'Converte le doppie virgolette dattilografiche "" in doppie virgolette tipografiche “” (una seconda chiamata alla funzione inverte le virgolette)');
				*/
				regexTool('spostamento note', 'toggleNote()', "Sposta le note dal corpo del testo a fine testo e viceversa per facilitare la rilettura");
				regexTool('iniziale maiuscola', 'inizialeMaiuscola()', "Rende maiuscola la lettera iniziale di versi e righe");
			}
		};

		addTemplateTesto = function() {
			var textbox = document.getElementsByName('wpTextbox1')[0];
			r = textbox.value.split("\n");
			for (i = 0; i < r.length; i += 1) {
				if (r[i].indexOf("    ") === 0) {
					r[i] = r[i].replace("    ", "* {{testo|") + "}}";
				}
			}
			textbox.value = r.join("\n");
		};

		/* sposto apostrofi() in Common.js per renderla disponibile globalmente */
		/* alterna due visualizzazioni delle note in edit: "normale" e "a fondo pagina" */
		toggleNote = function() {
			// alert("Versione prova su vector.js");
			var editbox = document.getElementsByName('wpTextbox1')[0];
			if (editbox.value.indexOf("<sup>nota</sup>") == -1) { // note in posizione regolare       
				lista = produciLista(editbox.value, "<ref", '</' + 'ref>', 1);
				lista = jQuery.grep(lista, function (n, i) {
					return (n.indexOf('<ref ' + 'follow=') == -1);
				});
				for (i = 0; i < lista.length; i += 1) {
					editbox.value = editbox.value.replace(lista[i], "<sup>nota</sup>");
					editbox.value = editbox.value + "\n" + lista[i];
				}
				
			} else { //presenza di marcatori
				marks = count(editbox.value, '<ref' + '>') + count(editbox.value, '<ref ' + 'name=') + count(editbox.value, '<ref ' + 'group=');
				refs = count(editbox.value, "<sup>nota</sup>");
				if (marks != refs) { // verifica parità   
					alert("ATTENZIONE: discordanza fra numero delle <br />note (" + marks + ") e numero dei segnaposti (" + refs + "). Controllare!");
					return;
				}
				lista = produciLista(editbox.value, "<ref", '</' + 'ref>', 1);
				lista = jQuery.grep(lista, function (n, i) {
					return (n.indexOf('<ref ' + 'follow=') == -1);
				});
				editbox.value = editbox.value.replace(/\n<ref/g, "<ref");
				
				for (i = 0; i < lista.length; i += 1) {
					editbox.value = editbox.value.replace(lista[i], "");
				}
				for (i = 0; i < lista.length; i += 1) {
					editbox.value = editbox.value.replace("<sup>nota</sup>", lista[i]);
				}
			}
		};

		applicaPoem = function() {
			var textbox = document.getElementsByName('wpTextbox1')[0];
			textbox.value = '<poem>' + textbox.value.replace(/\s+$/, "").replace(/^\s+/, "") + '</poem>\n';
		};

		convertiAcuti = function() {
			textbox = document.getElementsByName('wpTextbox1')[0];
			textbox.value = textbox.value.replace(/é/g, "è");
		};

		//escape all punctuation!!!!!!
		// = / < > 
		// Sperimentale. Per i testi in prosa: aggiunge un secondo acapo alle righe che terminano con i caratteri .?!
		aggiustaParagrafi = function() {
			textbox = document.getElementsByName('wpTextbox1')[0];
			testo = textbox.value;
			poems = produciLista(testo, "<poem>", "</poem>", 1);
			for (i = 0; i < poems.length; i += 1) {
				testo = testo.replace(poems[i], "[#" + i + "#]");
			}
			testo = testo.replace(/ \n/g, "\n").replace(/([\.\?\!»:]\n)([^\n])/g, '$1\n$2');
			for (i = 0; i < poems.length; i += 1) {
				testo = testo.replace("[#" + i + "#]", poems[i]);
			}
			textbox.value = testo;
			updatePreview();
		};

		// rimuovi prima riga della pagina
		rimuoviPrimaRiga = function() {
			var editbox = document.getElementsByName('wpTextbox1')[0];
			if (editbox.value.substring(0, 6) == "<poem>") {
				editbox.value = editbox.value.replace(/<poem\>.+\n/, "<poem>");
			} else {
				editbox.value = editbox.value.replace(/.+\n+/, "\n");
			}
		};

		mhy = function() {
			var editbox = document.getElementsByName('wpTextbox1')[0];
			testo = editbox.value;
			if (testo.indexOf("\u200d") != -1) {
				testo = testo.replace(/\u200d/g, "-\n");
			} else {
				testo = testo.replace(/-\n/g, "\u200d");
			}
			editbox.value = testo;
		};

		joinLines= function() {
			// eliminazione acapo che esclude sia i testi <poem> che le righe che iniziano con  ";:#*" (liste html)
			var editbox = document.getElementsByName('wpTextbox1')[0];
            var poemNumber=0;
            var listaGlobale=[]
			// fase 1: codifica
			if (editbox.value.indexOf("<poem") != -1) {
				lista = produciLista(editbox.value, "<poem", "</poem>", 1);
                listaGlobale=[].concat(lista)
                poemNumber=lista.length;
				for (i = 0; i <= lista.length - 1; i = i + 1) {
					marcatore = "###" + i + "###";
					editbox.value = editbox.value.replace(lista[i], marcatore);
				}
			}
			editbox.value=editbox.value.replace("{{Poem", "{{poem").replace("{{Mlb", "{{mlb");
            if (editbox.value.indexOf("{{poem") != -1) {
				lista = produciLista(editbox.value, "{" + "{poem", "}}", 1,"{{");
                listaGlobale=listaGlobale.concat(lista);
				for (i = 0; i <= lista.length - 1; i = i + 1) {
					marcatore = "###" + (i+poemNumber) + "###";
					editbox.value = editbox.value.replace(lista[i], marcatore);
                    
				}
			}
			if (editbox.value.indexOf("{{mlb") != -1) {
				lista = produciLista(editbox.value, "{" + "{mlb", "}}", 1,"{{");
                listaGlobale=listaGlobale.concat(lista);
				for (i = 0; i <= lista.length - 1; i = i + 1) {
					marcatore = "###" + (i+poemNumber) + "###";
					editbox.value = editbox.value.replace(lista[i], marcatore);
                    
				}
			}
            
			// fase2: eliminazione acapo singoli, con conservazione dei multipli
			//if (mw.config.get("wgTitle").indexOf("Trattato di archeologia (Gentile).djvu")==-1) {
			editbox.value = editbox.value.replace(/([^>}\n])\n([^<\n\:\;\*\#\|\{])/g, '$1 $2'); //linux
			editbox.value = editbox.value.replace(/([^>}\r\n])\r\n([^<\r\n\:\;\*\#\|\{])/g, '$1 $2'); //windows
			//    }
			// eliminazione sequenze di spazi, sostituiti da spazio singolo
			editbox.value = editbox.value.replace(/  +/g, ' ');
            // sostituzione spazio dopo marcatore
            editbox.value=editbox.value.replace(/### /g,"###\n");
			// fase 3: decodifica
			if (editbox.value.indexOf("###0###") != -1) {
				for (i = 0; i <= listaGlobale.length - 1; i = i + 1) {
					marcatore = "###" + i + "###";
					editbox.value = editbox.value.replace(marcatore, listaGlobale[i]);
				}
			}
			// fase 4: sistemazione a capo attorno a poem
			//editbox.value=editbox.value.replace(/ <poem>/g,"\n<poem>").replace(/<\/poem> /g,"</poem>\n");
            editbox.value=editbox.value.replace(/### /g,"###\n");
			updatePreview();
		};
		cleanup = function() {
			newRi();
			var tl=""; 
			var testo="";
			if (mw.memoRegexRun!==undefined) mw.memoRegexRun();
			
			var editbox = document.getElementsByName('wpTextbox1')[0];
			/* converte l'eventuale xml in testo - SPERIMENTALE
			if (mw.config.get("wgCanonicalNamespace")==="Page") 
			    try {testoXml();} 
			    catch(err) {console.log("Errore in chiamata testoXml");}
			*/
			console.log("cleanup modificato");
			if(count(leggiBox(),"{")!==count(leggiBox(),"}")) {
				alert("Caratteri {} sbilanciati: correggi e ripeti");return;
			}
			if(count(leggiBox(),"<")!==count(leggiBox(),">")) {
				alert("Caratteri <> sbilanciati: correggi e ripeti (sostituisci eventuali <> necessarti con entità html)");return;
			}
			if(count(leggiBox(),"[")!==count(leggiBox(),"]")) {
				alert("Caratteri [] sbilanciati: correggi e ripeti");return;
			}
			// elimina il soft hyphen C£ AD
			
			editbox.value = editbox.value.replace(/­/g, '');
			// sostituisce i caratteri ― (unicode & #8213;) (tossico) con — (unicode & #8212;) 
			editbox.value = editbox.value.replace(/―/g, '—');
			// sostituisce i caratteri -- con —
			editbox.value = editbox.value.replace(/--/g, '—');
			// recupero dei codici commento html
			editbox.value = editbox.value.replace(/<!—/g, '<!--');
			editbox.value = editbox.value.replace(/—>/g, '-->');
			// remove trailing whitespace at the end of each line
			editbox.value = editbox.value.replace(/ +\n/g, '\n');
			// remove trailing whitespace at the end of input
			editbox.value = editbox.value.replace(/\s+$/g, '');
			//join words that are hyphenated across a line break as -,¬
			dehyphen();
			// remove unwanted spaces around punctuation marks
			editbox.value = editbox.value.replace(/ ([;:\?!,])/g, '$1');
			//OCR fixes
			// convert i9 to 19, etc.
			// editbox.value = editbox.value.replace(/[il]([0-9])/g, '1$1');
			// "^V", "AV", "\\" to "W"
			editbox.value = editbox.value.replace(/\^V/g, 'W');
			editbox.value = editbox.value.replace(/\AV[a-z]/g, 'W');
			editbox.value = editbox.value.replace(/\\\\/g, 'W');
			// remove "\ufffd" and "^"
			//editbox.value = editbox.value.replace(/[\ufffd^]/g, '');
			// remove "\ufffd" only
			editbox.value = editbox.value.replace(/[\ufffd]/g, '');
			// "U" -> "ll" when preceded by a lowercase letter.
			editbox.value = editbox.value.replace(/([a-z])U/g, '$1ll').replace(/([bcdfghlmnprstvzBCDFGHLMNPRSTV]’)([^\s])/g, "$1 $2"); //aggiungo uno spazio dopo gli apostrofi tipografici
			// apostrofi dattilografici->tipografici
			apostrofi(editbox);
			// 1’ in l’, spazio adiacente ad apostrofo dopo consonante, lista di scannos comuni
			editbox.value = editbox.value.replace(/([^\d]+)1’/g, '$1l’')
				.replace(/ clie /g, ' che ')
				.replace(/ »/g, '»')
				.replace(/« /g, '«')
				.replace(/([bcdfghlmnprstvz])’ ([^bcdfglmnprstvz])/gi, '$1’$2')
				.replace(/ r /g, ' l’')
				.replace(/ ’1 /g, ' ’l ')
				// .replace(/ T /g, ' l’')
				.replace(/eh’/g, 'ch’')
				.replace(/eh’ /g, 'ch’')
				.replace(/ alia /g, ' alla ')
				.replace(/ delia /g, ' della ')
				//.replace(/ cosi /g,' così ')
				.replace(/ deir /g, ' dell’')
				// .replace(/ air /g, ' all’')
				.replace(/ neir /g, ' nell’')
				//.replace(/ piu /g, ' più ')
				//.replace(/Piu /g, 'Più ')
				.replace(/fi/g, 'fi')
				.replace(/`/g, '’')
				.replace(/“ /g, '“')
				.replace(/ ”/g, '”');
			//RunningHeader(false);
			updatePreview();
		};
		mw.cleanup=cleanup;
		
		/* nuova funzione per il recupero numero verso dalla pagina precedente */
		function ultVerso(testo) {
	
		var rigaUltimoPoem=0;
		var rigaUltimoR=0;
		var ultimoVerso=0;
		var r=/^ *<center>|^ *{{center\||^ *{{centrato\||^ *{{vc\|| *{{r-|^ *{{ct\|/i;
		// normalizzo </poem> su nuova riga 
		testo=testo.replace(/([^\n])(<\/poem>)/g,"$1\n$2");
		// splitto in righe
		testo=testo.split("\n");
		// cerco l'ultimo </poem>
		for (i=testo.length-1;i>-1;i-=1){
			if ((/<\/poem>/).test(testo[i])) break;
		}
		if (i===-1) return 0;
		// cerco indietro l'ultimo R
		rigaUltimoPoem=i;
		for (i=rigaUltimoPoem-1;i>-1;i-=1){
			if ((/{{r\|/i).test(testo[i])) break;
		}
		if (i===-1) return 0;
	
		rigaUltimoR=i;
		ultimoVerso=testo[i].match(/{{r\|(\d+)/i)[1]*1;
		// conto le righe verso fino a </poem>
		for (i=rigaUltimoR+1;i<rigaUltimoPoem;i+=1) {
			if (!(r.test(testo[i]) || $.trim(testo[i])==="")) ultimoVerso+=1;
		}
		return ultimoVerso;
	}
		
		
		/* sotto-funzione di numeroRiga()
		 * aggiunge il numero num alla riga line
		 */
		scriviNumero = function(line, num) {
			var str = line;
			var n = 0;
			//salta gli spazi ad inizio riga
			while (str.charAt(0) && str.charAt(0) == ' ') {
				str = str.substring(1);
				n++;
			}
			//salta gli ":" ad inizio riga
			while (str.charAt(0) && str.charAt(0) == ':') {
				str = str.substring(1);
				n++;
			}
			if (n > 0) line = line.substring(0, n) + "{{R|" + num + "}}" + line.substring(n);
			else line = "{{R|" + num + "}}" + line;
			return line;
		};

		/* aggiunge il numero di riga
		 * con mod=1 mette il numero ogni ultimo verso del paragrafo
		 * con mod=2 mette il numero ogni x righe
		 * 
		 * TODO: escludere le righe con {{Centrato}}
		 */
		numeroRiga = function(mod, x) {
			var testoCasella = document.getElementById("wpTextbox1").value;
			// cancella tutti gli R //
			if (mod === 0) {
				while (find_stringa(testoCasella, "{{R|", "}}", 1) !== "") {
					testoCasella = testoCasella.replace(find_stringa(testoCasella, "{{R|", "}}", 1), '');
				}
				while (find_stringa(testoCasella, "{{r|", "}}", 1) !== "") {
					testoCasella = testoCasella.replace(find_stringa(testoCasella, "{{r|", "}}", 1), '');
				}
				document.getElementById("wpTextbox1").value = testoCasella;
				return;
			}
			//esci se manca il poem
			if (testoCasella.indexOf("<poem") == -1 || testoCasella.indexOf("</poem>") == -1) {
				console.log("uscita 1");
				return;
			}
			//prende il poem in cui si trova il cursore
			var pos = document.getElementById("wpTextbox1").selectionStart;
			begin = testoCasella.substring(0, pos + 6).lastIndexOf("<poem");
			if (begin == -1) {
				console.log("uscita 2");
				return;
			}
			end = testoCasella.substring(begin).indexOf("</poem>") + testoCasella.substring(0, begin).length;
			var prima = testoCasella.substring(0, begin + 6);
			var dopo = testoCasella.substring(end);
			//scomponi il testo in singole righe
			var lines = testoCasella.substring(begin + 6, end).split("\n");
			var num = 1;
			var center = false;
			/* algoritmo vecchio 
			//solo in namespace Pagina, fai scegliere all'utente da che numero partire (l'ultimo numero della pagina prima)
			if (mw.config.get("wgCanonicalNamespace") == "Page") {
				//se questo è il primo poem della pagina, proponi di continuare dall'ultimo numero; altrimenti proponi 1
				if (begin == testoCasella.indexOf("<poem>")) {
					verso = mw.util.getParamValue('verso');
					if (!verso) {
						if (typeof testoPagPrec != 'undefined' && typeof ultimoV != 'undefined') verso = ultimoV();
						else verso = "1";
					}
					// aggiunta di Alex brollo: si esegue solo se esistono la funzione ultimoV e la variabile testoPagPrec
				} else verso = "1";
				num = parseInt(prompt("da che numero parto?", verso));
			}*/
			/* algoritmo nuovo Alex 13.07.2016 */
			//solo in namespace Pagina, fai scegliere all'utente da che numero partire (l'ultimo numero della pagina prima)
			if (mw.config.get("wgCanonicalNamespace") == "Page") {
				//se questo è il primo poem della pagina, proponi di continuare dall'ultimo numero; altrimenti proponi 1
				verso=ultVerso(testoPagPrec[1])+1;
				
				num = parseInt(prompt("da che numero parto?", verso));
			}
			num--;
			/* algoritmo vecchio
			for (var i = 0; i < lines.length; i++) {
				//non considerare il testo dentro <center></center>
				if (lines[i].toLowerCase().lastIndexOf("<center>") > -1) center = true;
				//salta le righe vuote, o centrate, o marcate con {{r-}}
				if (!center && lines[i].replace(/\s/g, "") !== "" && lines[i].toLowerCase().indexOf("{{r-}}") == -1) {
					num++;
					//in modalita' 1, controlla che la prossima riga sia l'ultima o una riga bianca
					if (mod == 1 && (i + 1 >= lines.length || lines[i + 1].replace(/\s/g, "") === "")) {
						lines[i] = scriviNumero(lines[i], num);
					}
					if (mod == 2 && num % x === 0) {
						lines[i] = scriviNumero(lines[i], num);
					}
				}
				if (lines[i].toLowerCase().lastIndexOf("</center>") > -1) center = false;
			} */
			/* algoritmo nuovo Alex 13.07.2016 */
			var r=/^ *<center>|^ *{{center\||^ *{{centrato\||^ *{{vc\|| *{{r-|^ *{{ct\|/i;
			for (var i = 0; i < lines.length; i++) {
				//non considerare il testo dentro <center></center>
				// if (lines[i].toLowerCase().lastIndexOf("<center>") > -1) center = true;
				//salta le righe vuote, o centrate, o marcate con {{r-}}
				if (!(r.test(lines[i]) || $.trim(lines[i])==="")) {
					num++;
					//in modalita' 1, controlla che la prossima riga sia l'ultima o una riga bianca
					if (mod == 1 && (i + 1 >= lines.length || lines[i + 1].replace(/\s/g, "") === "")) {
						lines[i] = scriviNumero(lines[i], num);
					}
					if (mod == 2 && num % x === 0) {
						lines[i] = scriviNumero(lines[i], num);
					}
				}
				if (lines[i].toLowerCase().lastIndexOf("</center>") > -1) center = false;
			}
			//rimetti insieme le righe
			var out = lines[0];
			for (i = 1; i < lines.length; i++) {
				out = out + "\n" + lines[i];
			}
			document.getElementById("wpTextbox1").value = prima + out + dopo;
			//modifica il link alla prossima pagina, in modo da "ricordarsi" a che verso siamo arrivati
			if (mw.config.get("wgCanonicalNamespace") == "Page" && mw.config.get("wgAction") != 'history' && $("#ca-next span a").length) {
				mw.loader.using('ext.proofreadpage.page', function () {
					setURLVar($("#ca-next span a"), "verso", num + 1);
					act = $("#editform").attr("action");
				});
			}
		};

		Virgolette = function(av, cv) {
			if (av === undefined) {
				av = "“";
			}
			if (cv === undefined) {
				cv = "”";
			}
		//	if (! ("editbox" in window)) {
				editbox = document.getElementsByName('wpTextbox1')[0];
		//  }
		/* codifico editbox  e carico il testo codificato in testo*/
		  
			var tl = codifica(editbox.value);
			var testo = tl[0];
			/*  qui routine virgolette */
			// virgolette rette - virgolette tipografiche
			if (testo.indexOf('\"') > -1) {
				testo = testo.replace(/[“„”«»‘‚]/g, '"'); // trasformo tutte le virgolette in rette
				apri = true;
				while (testo.indexOf('\"') != -1) {
					if (apri) {
						testo = testo.replace('\"', av);
						apri = false;
					} else {
						testo = testo.replace('\"', cv);
						apri = true;
					}
				}
			} else {
				posAperta = testo.indexOf(av);
				if (posAperta == -1) {
					posAperta = 10000;
				}
				posChiusa = testo.indexOf(cv);
				if (posChiusa == -1) {
					posAperta = 10000;
				}
				if (posAperta < posChiusa) {
					apri = false;
				} else {
					apri = true;
				}
				testo = testo.replace(/[“„”«»‘‚]/g, '"');
				while (testo.indexOf('\"') != -1) {
					if (apri) {
						testo = testo.replace('\"', av);
						apri = false;
					} else {
						testo = testo.replace('\"', cv);
						apri = true;
					}
				}
			}
			editbox.value = decodifica(testo, tl[1]);
		};

		//TROVA E SOSTITUISCI
		//Edit Alex versione 25.01.13
		$('body').append(
			'<div id="findReplace_box" class="box" style="display:none;">' +
			'<div class="box-title">Trova & Sostituisci<span class="icon-close findReplace_box_close"></span></div>' +
			'<div class="box-main">' +
			'<div class="width-50">Cerca (testo o espressione regolare):</div>' +
			'<div class="width-50"><input type="text" id="findReplace_find" size="30"/></div>' +
			'<div class="width-50">Sostituisci con: </div>' +
			'<div class="width-50"><input type="text" id="findReplace_replace" size="30"/></div>' +
			'<div class="width-50">Commento: </div>'+
			'<div class="width-50"><input type="text" id="findReplace_doc" size="30"/></div>' +
			'<div>' +
			'<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 (<a target="_blank" href="/wiki/Aiuto:MemoRegex">MemoRegex</a>)</label></div>' +
			'<div class="text-right">'+
			'<input id="findReplace_next" type="button" class="btn blue" value="Trova successivo" /> '+
			'<input id="findReplace_box_ok" type="button" class="btn blue" value="Applica" /> '+
			'<input type="button" class="btn blue findReplace_box_close" value="Chiudi" /></div></div>');

		$('#findReplace_box_ok').click(function(e) {
			trovaSostituisci();
		});
		
		$('#findReplace_next').click(function(e) {
			//try {trovasucc();} catch {mw.alertMessage("Pulsante non abilitato (test)");}
			if ( window.trovaSucc == undefined)  {mw.alertMessage("Pulsante non abilitato (test)");}
			else trovaSucc();
		});
		
		$('.findReplace_box_close').click(function(e) {
			nascondiTrovaSostituisci();
		});
		$('#findReplace_box').draggable({
		    create: function( event, ui ) {
		        $(this).css({
		            right: '10px',
		            top: '10px'
		        });
		    }
		});

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

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

		regexRepl = function(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));
		};

		trovaSostituisci = function() {
			var trova = $('#findReplace_find').val();
			var sostituisci = $('#findReplace_replace').val()
				.replace(/\\n/g, '\n').replace(/\\t/g, '\t'); //abilita \n e \t come caratteri speciali newline e tab
			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));
			}
			updatePreview();
			/* 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 generali per la creazione del menu
		var rmf_globals = {};
		/****************
		 *** config tools
		 ****************/
		regexTool = function(name, functionname, descrizione) {
			if (!descrizione) {
				descrizione = name;
			}
			if (mw.config.get("wgServer") === "//it.wikisource.org") {
				newButton({
					nome: name,
					funzione: functionname,
					messaggio: descrizione,
					classe: "buttonRfm",
					stile: "display:none",
					azione: "es"
				});
			}
			if (mw.config.get('skin') == "monobook") {
				var voce = $('<li><a href="javascript:' + functionname + '" title="' + descrizione + '">' + name + '</a></li>');
				$("#p-regex").append(voce);
				return;
			}
			var newline = document.createElement('li');
			var newlink = document.createElement('a');
			newlink.setAttribute('href', 'javascript:' + functionname);
			newlink.setAttribute('title', descrizione);
			newlink.setAttribute('class', 'sidebar-link');
			newlink.appendChild(document.createTextNode(name));
			newline.appendChild(newlink);
			toollist.appendChild(newline);
		};

		/*** create menu
		 ****************/
		rfmenu = function(rfmconfig) {
			/* get elements */
			// note: these must be global.
			editbox = document.getElementById('wpTextbox1');
			editreason = document.getElementById('wpSummary');
			if (mw.config.get('skin') == 'monobook') {
				$('<div class="portlet"><h3><a href="javascript:rmflinks()">Strumenti accessori</a></h3><div class="pBody"><ul id="p-regex"></ul></div>').insertAfter(
					$("#p-tb"));
				return;
			}
			try {
				//sidebar = document.getElementById('p-logo').parentNode;
				sidebar = document.getElementById('p-navigation').parentNode;
			} catch (err) {
				console.log('Regex menu framework rfmenu() aborted due to unknown error. This (rare) issue will be fixed in the eventual rewrite.');
				return;
			}

			/* create menu */
			var container = document.createElement('div');
			if (mw.config.get('skin') == 'vector'||mw.config.get('skin') == 'vector-2022') container.setAttribute('class', 'portal persistent vector-menu vector-menu-portal');
			container.setAttribute('id', 'p-regex');
			sidebar.appendChild(container);
			var header = document.createElement('h3');
			header.setAttribute('class','vector-menu-heading  vector-menu-heading-label');
			header.appendChild(document.createTextNode('Strumenti per la rilettura'));
			container.appendChild(header);
			var toolbox = document.createElement('div');
			toolbox.setAttribute('class', 'vector-menu-content');
			container.appendChild(toolbox);
			toollist = document.createElement('ul');
			toollist.setAttribute('class', 'vector-menu-content-list');
			toolbox.appendChild(toollist);
			/* load user-defined sidebar links */
			rmflinks();
		};

		rfmenu();
	});
}