Utente:Alex brollo/PostOCR.js

'A Wikisource.

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.
/* Correzioni post-OCR automatiche alla creazione di una nuova Pagina  */

mw.loader.using(['ext.proofreadpage.page', 'oojs-ui-core', 'ext.wikiEditor']).done( function () {

    $(document).ready(function() {
      
// Only for NS Paggena
  if ( mw.config.get('wgCanonicalNamespace') === 'Page' && 
      (mw.config.get("wgAction")==="edit" ||mw.config.get("wgAction")==="submit")  ) {
  
      // bozza funzioni specifiche
      if ( typeof $ != 'undefined' && typeof $.fn.wikiEditor != 'undefined' ) { 
        $( function() {

          // CREA PULSANTE
          var fixButton = new OO.ui.ButtonWidget( { 
            label: '’’',
            id: 'postOCR-button-widget',
            framed: false,
            title: 'Appara \'o tiesto'
          } );
          fixButton.on( 'click', function ( context ) { 
            postOCR(); 
          } );

		$( '#wikiEditor-section-advanced' ).append( fixButton.$element );
        });
      }}});
  });
/* disattivo la funzione  newDpl */
/* function newDpl(testo) {
  var r6 = /(.*)<\!--(\d+)\s(\d+)\s(\d+)\s(\d+)\s(\d+)\s(\d+)--\>/; // correggo unexpected escaped character in regex
  var r4 = /(.*)<\!--(\d+)\s(\d+)\s(\d+)\s(\d+)--\>/;               // correggo unexpected escaped character in regex
  var res,riga; 													// dichiaro le variabili per evitare la dichiarazione multipla
  if (r6.test(testo)) {
    testo = testo.split("\n");
    datiPagina = {};
    datiPagina.righe = [];
    for (var i = 0; i < testo.length; i += 1) {
      if (r6.test(testo[i])) {
        res = r6.exec( testo[i] );
        datiPagina.xypagina = [ res[6], res[7] ];
        riga = [ res[2], res[3], res[4], res[5], res[1] ];
        datiPagina.righe.push( riga );
        testo[i] = res[1];
      }
      if (r4.test(testo[i])) {
        res = r4.exec( testo[i] );
        riga = [ res[2], res[3], res[4], res[5], res[1] ];
        datiPagina.righe.push( riga );
        testo[i] = res[1];
      }
    }
    testo = testo.join("\n");
  }
  return testo;
}
*/

/* Correzioni post-OCR automatiche alla creazione di una nuova Pagina  */
function postOCR () {

    var editbox = document.getElementsByName('wpTextbox1')[0];
    // editbox.value = newDpl(editbox.value); //  disattivo la chiamata
    editbox.value = apostrofi(); 
    editbox.value = editbox.value.replace(/ +$/gm, ''); // elimino gli spazi a fine riga
    editbox.value = editbox.value.replace(/’’’/g, '\'\'\'')
      .replace(/(\s|\W)’’(\w+)/g, '$1\'\'$2')
      .replace(/(\b|\W)’’(\W)/g, '$1\'\'$2').replace(/ \n/g, '\n');
    // tento di disabilitare la riunione delle righe spezzate |
    //.replace(/-\n/g, '')
    //.replace(/- \n/g, '');  
    // editbox.value = editbox.value.replace(/([^|])[-¬] *\n([^ \n]*)[ ]*[\n]?/g,"$1$2\n"); // importo da cleanup()
    // questa regex sembra funzionare nei due casi previsti; trasporta nella prima parte della parola spezzata
    // la seconda parte, rispettando l'acapo e eliminando l'eventuale spazio - testata con regex101 in https://regex101.com/r/QoAJBj/1/
    editbox.value = editbox.value.replace(/[-¬] *\n([^ \n]+)( +)|[-¬] *\n([^ \n]+)(\n)/g,"$1$2$3\n");  
    
    // dehyphen(editbox.value) 
    // eseguo temporaneamente dehyphen in attesa di costruire/trovare la regex giusta
    editbox.value = editbox.value.replace(/1’/g, 'l’')
      .replace(/å/g, 'à')
      .replace(/\bdeir\b\s*/g, 'dell’')
      .replace(/\bair\b\s*/g, 'all’')
      .replace(/\bneir\b\s*/g, 'nell’')
      .replace(/\bcoir\b\s*/g, 'coll’')
      .replace(/\bperche\b/g, 'perchè')
      .replace(/\bpoiche\b/g, 'poichè')
      .replace(/\bpiu\b/g, 'più')
      .replace(/\bpiti\b/g, 'più')
      .replace(/\s+([,;.:!?])/g, '$1')
      .replace(/«\s+/g, '«')
      .replace(/\s+»/g, '»')
      .replace(/([bcdfghlmnprstvzBCDFGHLMNPRSTV])’\s+/g, '$1’')
      .replace(/(eh|cb)’/g, 'ch’')
      .replace(/\s+$/, '')
      .replace(/\.\.\./g, '…') // discutibile... a me non piace
      .replace(/fi/g, 'fi')
      .replace(/ſ/g, 's')
      .replace(/U’/g, 'll’');
    console.log("Eseguite correzioni post-OCR automatiche");
}


/*Chiamata senza parametri corregge gli apostrofi nel box di default (wpTextbox1[0] in ns0, wpTextbox1[1] in nsPagina.
In rari casi può essere forzata l'azione su un box non di default (box="0","1","2" ) */
function newApostrofi(box) {
	var testo;
	if (box === undefined) {
		testo = leggiBox();
	} else {
		testo = leggiBox(box);
	}
	var testoCod = codifica(testo);
	testoCod[0] = testoCod[0].replace(/'/g, '’').replace(/’’’’’/g, "'''''").replace(/’’’’/g, "''''").replace(/’’’/g, "'''").replace(/’’/g, "''");
	testo = decodifica(testoCod[0], testoCod[1]);
	if (box === undefined) {
		scriviBox(testo);
	} else {
		scriviBox(testo, box);
	}
}

//Sostituisce tutti gli apostrofi dattilografici in tipografici, ma rispetta gli apostrofi di marckup wiki e gli apostrofi
//contenuti in: math, {{{}}}, {{}}, [[]], [], http:..... 
function apostrofi(editbox) {
	if (editbox === undefined) {
		editbox = document.getElementsByName('wpTextbox1')[0];
	}
	var testoCod = codifica(editbox.value);
	testoCod[0] = testoCod[0].replace(/'/g, '’').replace(/’’’’’/g, "'''''").replace(/’’’’/g, "''''").replace(/’’’/g, "'''").replace(/’’/g, "''");
	return decodifica(testoCod[0], testoCod[1]);
}

function codifica(testo) {
	var l = [];
	// gestione {{poem..}}
    var poem="";
    var lista=produciLista(testo,"{{poem","}}",1,"{{");
    if (lista.length>0) {
        for (i=0;i<lista.length;i+=1) {
            poem=lista[i].replace("{{poem","<#poem>").replace(/}}$/,"</#poem>");
            testo=testo.replace(lista[i],poem);
        }
    }
    // fine gestione {{poem..}}
	var res = ss(testo, l, "<math", "</math>", "");
	res = ss(res[0], res[1], "<!--", "-->", "<");
	res = ss(res[0], res[1], "{", "}", "{");
	res = ss(res[0], res[1], "[", "]", "[");
	res = ss(res[0], res[1], "<", ">", "<");
	res = ss(res[0], res[1], "http://", " ", "");
	res = ss(res[0], res[1], "https://", " ", "");
	return res;
}

function ss(testo, l, tagi, tagf, x) {
	while (find_stringa(testo, tagi, tagf, 1) > "") {
		var el = find_stringa(testo, tagi, tagf, 1, tagi);
		testo = testo.replace(el, "###el" + l.length + "###");
		l.push(el);
	}
	return [testo, l];
}




// La funzione decodifica() riceve un testo codificato e la lista degli elementi protetti e restituisce un testo 
// con gli elementi protetti risistemati al loro posto; è complementare a codifica()
function decodifica(testo, l) {
	for (i = l.length - 1; i > -1; i = i - 1) {
		testo = testo.replace("###el" + i + "###", l[i]);
	}
	// gestione {{poem ... }}
	testo=testo.replace(/<#poem>/g,"{{poem").replace(/<\/#poem>/g,"}}");
return testo;
}