User:Alex brollo bis/memoRegex.js

From Wikisource
Jump to navigation Jump to search

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
(function (mw, $) {
  /* creazione box F&R */
  // var alex={};
  // Caricamento da pagina di default: Index talk
  var alex={};
  
  if(mw.alex===undefined) {
  	mw.alex={};
  }
  // funzione accessibile in namespace globale
  alex.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");
      var indexTalkName = "Index_talk:" + (/.+:(.+)\//).exec(paginaFonte)[1];
      var indexTalkRaw = $.ajax({
        url: mw.config.get("wgServer") +
          "/w/index.php?action=raw&title=" + indexTalkName,
        async: false
      }).responseText;
      console.log(paginaFonte);
      var codiceMemoregex = mw.alex.findStringa(indexTalkRaw, '{"', '"]}', 1);
      // console.log(codiceMemoregex);
      var memo = {};

      try {
        memo = JSON.parse(codiceMemoregex);
        localStorage.memoRegex = JSON.stringify(memo);
        alex.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 o memoRegex presenta errori"
        );
        localStorage.memoRegex = "{}";
      }
      // in ns diversi da nsPagina, tenta di caricare in modo additivo le regex contenuto in un testo selezionato
    } else {
      if(selection()[1] !== "") {
        alex.caricaRegex();
      }


    }

  };
  
// funzione globale 
	mw.alex.mostraTrovaSostituisci= function () {
		$('#findReplace_box').css("display", "block");
		var t = mw.alex.getSelection();
		
	// carica selezione in trova solo se breve (pewr evitare di caricarla in caso di sostituzioni selettive)	
		if (t[1].length<15) {
			$("#findReplace_find").attr("value", t[1]);
			$("#findReplace_replace").attr("value", t[1]).click();
		} else {
			$("#findReplace_find").click();
		}
	};
	

alex.save = function (title,text,summary) {
		var api = new mw.Api();
		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");
				 
			} else {
				alert("Errore nel salvataggio della pagina");
			}
		});
	};
  
  
  
  
 
 	// Inizializzazione memoRegex
	if (localStorage.memoRegex===undefined) {
		localStorage.memoRegex=JSON.stringify({});
	} 	
	alex.memoRegex=JSON.parse(localStorage.memoRegex);
	if (mw.config.get("wgCanonicalNamespace")==="Page" && mw.config.get("wgAction")==="edit" ) {
	     // caricamento del nome base pagina corrente
	     localStorage.currentBasePage=(/.+?:(.+)\/.+$/m).exec(mw.config.get("wgPageName"))[1];
	     // se localStorage.currentRegexBasePage non è definito definiscilo
	     if (localStorage.currentRegexBasePage===undefined || localStorage.currentRegexBasePage!==localStorage.currentBasePage) {
	     	localStorage.currentRegexBasePage=localStorage.currentBasePage;
			localStorage.memoRegex=JSON.stringify({});
			alex.caricaRegexRemoto();
	     }
     }
 
 
 
  $('body').append(
    '<div id="findReplace_box" style="display:none;font-size:90%;width:500px;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:0">'+
	'<input id="trovaSostituisci" type="button" value="Esegui" />' +
	'<input id="memoRegexRun" type="button" value="Esegui tutte" />' +
	'<input id="salvaRegexRemoto" type="button" value="Salva" />' +
	'<input id="caricaRegexRemoto" type="button" value="Carica" />' +
    '<input id="nascondiTrovaSostituisci" type="button" value="Chiudi" /></div>'
  );
  
  
  /* attivazione - funzioni bottoni  */
  $("#memoRegexRun").click(function () {
    alex.memoRegexRun();
  });
  
  $("#salvaRegexRemoto").click(function () {
    alex.salvaRegexRemoto();
  });
  
  $("#caricaRegexRemoto").click(function () {
    alex.caricaRegexRemoto();
  }); 
  
  $("#trovaSostituisci").click(function () {
    trovaSostituisci();
  });
  
  $("#nascondiTrovaSostituisci").click(function () {
    $('#findReplace_box').toggle();
  });
  
  $("#findReplace_replace").focus(function () {

    // var find=$("#findReplace_find").val();
    // caricamento valori se già memorizzati
    if(alex.memoRegex[$("#findReplace_find").val()] !== undefined) {
      $("#findReplace_replace").val(alex.memoRegex[$("#findReplace_find")
        .val()][1]);
      $("#findReplace_doc").val(alex.memoRegex[$("#findReplace_find").val()]
        [0]);
      $("#findReplace_maiusc").prop("checked", alex.memoRegex[$(
        "#findReplace_find").val()][2].indexOf("i") !== -1);
      $("#findReplace_multiriga").prop("checked", alex.memoRegex[$(
        "#findReplace_find").val()][2].indexOf("m") !== -1);
      $("#findReplace_regex").prop("checked", alex.memoRegex[$(
        "#findReplace_find").val()][0].indexOf("(regex)") !== -1);


    } else {
      //$("#findReplace_replace").val($("#findReplace_find").val());
      $("#findReplace_maiusc").prop("checked", false);
      $("#findReplace_multiriga").prop("checked", false);
      $("#findReplace_regex").prop("checked", false);
      $("#findReplace_ricorda").prop("checked", false);
    }

  });

  alex.mostraTrovaSostituisci = function () {
    $('#findReplace_box').css("display", "block");
    var t =mw.alex.getSelection();

    // carica selezione in trova solo se breve (pewr evitare di caricarla in caso di sostituzioni selettive)	
    if(t[1].length < 15) {
      $("#findReplace_find").attr("value", t[1]);
      $("#findReplace_replace").attr("value", t[1]).click();
    } else {
      $("#findReplace_find").click();
    }
  };

  function regexRepl(trova, sostituisci, modificatori) {
    if(modificatori === undefined) modificatori = 'g';
    var regex = new RegExp(trova, modificatori);
    var testo = $('#wpTextbox1').val();
    $('#wpTextbox1').val(testo.replace(regex, sostituisci));
  }

  function trovaSostituisci() {
    var trova = $('#findReplace_find').val();
    var sostituisci = $('#findReplace_replace').val().replace(/\\n/g, '\n').replace(
      /\\t/g, '\t'); //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 testo = "";
    var testoNew = "";
    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
    var regex = new RegExp(trova, regexParams);


    //var regexl ={"trova":[trova,sostituisci,regexParams]}; 
    /// se non esiste selezione....
    if(mw.alex.getSelection()[1] === "") {
      testo = $("#wpTextbox1").val();
      $("#wpTextbox1").val(testo.replace(regex, sostituisci));
      testo = $("#wpHeaderTextbox").val();
      $("#wpHeaderTextbox").val(testo.replace(regex, sostituisci));
      testo = $("#wpFooterTextbox").val();
      $("#wpFooterTextbox").val(testo.replace(regex, sostituisci));
    } else {
      testo =mw.alex.getSelection();
      testo[1] = testo[1].replace(regex, sostituisci);
     mw.alex.writeSelection(testo);
      console.log(testo, regex, alex.activeElement);
    }


    //se l'utente ha spuntato "Ricorda", salva in una variabile localStorage
    if(isRicorda) {
      // se localStorage.memoRegex esiste lo carico in alex.memoRegex 
      if(localStorage.memoRegex !== undefined) alex.memoRegex = JSON.parse(
        localStorage.memoRegex);
      if(alex.memoRegex === undefined) alex.memoRegex = {};
      // aggiorno localStorage["regex"] 
      commento = commento.replace("(regex)", "");

      if(isRegex) {
        commento += "(regex)";
      }
      alex.memoRegex[trova] = [commento, sostituisci, regexParams];
      localStorage.memoRegex = JSON.stringify(alex.memoRegex);
      localStorage.memoRegexEdited = "true";

    }

  }

  // funzione basePageName


  alex.basePageName = function () {
    var basePageName = "";
    if(mw.config.get("wgCanonicalNamespace") == "Page") basePageName = mw.config
      .get("wgPageName").match(/.*:(.+)\//)[1];
    if(mw.config.get("wgCanonicalNamespace") === "Index" || mw.config.get(
        "wgCanonicalNamespace") === "Index talk") basePageName = mw.config.get(
      "wgPageName").match(/.*:(.+)/)[1];
    return basePageName;
  };


  // lancio sostituzioni; le memoRegex sono riservate al nsPage
  alex.memoRegexRun = function () {



    var testo =mw.alex.getSelection();
    var partialSubs = true;
    if(testo[1].length === 0) {
      testo = $("#wpTextbox1").val();
      partialSubs = false;
    }

    if(partialSubs) {
      $.each(alex.memoRegex, function (index, value) {
        testo[1] = testo[1].replace(RegExp(index, value[2]), value[1]);
      });
     mw.alex.writeSelection(testo);
    } else {

      $.each(alex.memoRegex, function (index, value) {
        testo = testo.replace(RegExp(index, value[2]), value[1]);
      });
      $("#wpTextbox1").val(testo);
      if(mw.config.get("wgCanonicalNamespace") === "Page") {
        testo = $("#wpHeaderTextbox").val();
        $.each(alex.memoRegex, function (index, value) {
          testo = testo.replace(RegExp(index, value[2]), value[1]);
        });
        $("#wpHeaderTextbox").val(testo);
        testo = $("#wpFooterTextbox").val();
        $.each(alex.memoRegex, function (index, value) {
          testo = testo.replace(RegExp(index, value[2]), value[1]);
        });
        $("#wpFooterTextbox").val(testo);
      }
    }
 
  };

  // caricamento manuale da pagina
  alex.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);
    alex.memoRegex = JSON.parse(localStorage.memoRegex);
    //	alert("Le sostituzioni selezionate sono state caricate");
  };


  
  // salvataggio regex remoto
  alex.salvaRegexRemoto = function () {
    if(mw.config.get("wgCanonicalNamespace") === "Page") {
      var paginaFonte = localStorage.currentBasePage;
      var regexOld = ""
      var testoPaginaFonte = "";
      var regexFormattato = ""
      paginaFonte = "Index talk:" + paginaFonte;
      try {
        testoPaginaFonte = $.ajax({
          url: mw.config.get("wgServer") +
            "/w/index.php?title=" + paginaFonte+"&action=raw",
          async: false
        }).responseText;
      } catch (err) {
        console.log("No Index talk page");
        testoPaginaFonte="";
      }
      regexFormattato = localStorage.memoRegex.replace(/("\],)/g, "$1\n")
      var regexOld = mw.alex.findStringa(testoPaginaFonte, '{"', '"]}', 1);
      if(regexOld !== "") {

        testoPaginaFonte = testoPaginaFonte.replace(regexOld, regexFormattato);
      } else {
        testoPaginaFonte += "\n== memoRegex ==\n<nowiki>" + regexFormattato +
          "</nowiki>\n"
      }
      alex.save(paginaFonte, testoPaginaFonte, "salvataggio memoregex");
      alert("Regex have been saved into " + paginaFonte);
    } else {
      alert("Routine can only be called from nsPage");
    }

  }
})(mediaWiki,jQuery);