Utente:Alex brollo/zs.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.
// funzione di ricerca binaria; testoBase.substring(p1,p2) viene spezzato a metà, viene scelta la metà
// con match superiore, e vengono restituiti due nuovi puntatori più "stretti"
// Usa la funzione simil(), che restituisce un numero fra 0 e 1 funzione del confronto fra due stringhe
// (viene valutata la presenza di una stringa simile a quella cercata all'interno di una seconda stringa,
// e il numero restituito è indice del grado di somiglianza). Algoritmo originale :-)
// es:
// simil("mentre 'l cor ci duole","Levo la faccia, mentre il cor mi duole,‿\ne pel rossore dè miei chiusi cigli")
// 0.5789473684210527
function zsb(sottostringa,testoBase,p1,p2,nc) {
if (p1==undefined || p2==undefined) {
p1=0;
p2=testoBase.length;
}
if (p1<0) p1=0;
if (p2>testoBase.length) p2=testoBase.length;
testo=testoBase.substring(p1,p2);
lt=testo.length/2+testo.length%2/2;
m0=simil(sottostringa,testo.substring(0,lt),nc);
m1=simil(sottostringa,testo.substring(lt),nc);
if (m0>m1) {
return [p1,lt+p1];
}
else {
return [lt+p1,testo.length+p1];
}
}
// raffinamento della testa e della coda del match: viene esaminato un intorno di 10 caratteri prima e dopo il match
function zse(sottostringa,testoBase,p1,p2,nc) {
var p1=p1-10; if (p1<0) p1=0;
var p2=p2+10; if (p2>testoBase.length) p2=testoBase.length;
var s=simil(sottostringa,testoBase.substring(p1,p2));
if (nc==undefined) nc=4;
for (i=p1;i<p2;i+=1){
if (simil(sottostringa,testoBase.substring(i+1,p2),nc) < s) {
break;
}
else {
p1=p1+1;
}
}
for (i=p2;i>p1;i-=1){
if (simil(sottostringa,testoBase.substring(p1,i-1),nc) < s) {
break;
}
else {
p2-=1;
}
}
return [p1,p2,testoBase.substring(p1,p2)];
}
// ricerca il miglior match di sottostringa dentro testoBase e restituisce i due puntatori inizio-fine del match
function zs(sottostringa,testoBase,nc) {
var p=[0,testoBase.length];
while (p[1]-p[0]>sottostringa.length*2) {
// ricerca binaria
p=zsb(sottostringa,testoBase,p[0],p[1]);
}
// raffinamento testa e coda
p=zse(sottostringa,testoBase,p[0],p[1]);
return [p[0],p[1]];
}
// accetta un testo html e sostituisce i tag con il carattere speciale ‿; restituisce un testo codificato e la
// lista dei tag; esiste una relazione 1:1 fra caratteri e tag e i tag sono ordinati
function codificaHtml(testo){
var l=[];
while(find_stringa(testo,"<",">",1)>""){
var el=find_stringa(testo,"<",">",1);
testo=testo.replace(el,"‿");l.push(el);
}
return[testo,l];
}
// inversa di codificaHtml, riceve un testo codificato e una lista di tag e li risistema
function decodificaHtml(testo,l) {
for (var i=0;i<l.length;i+=1) {
testo=testo.replace("‿",l[i]);
}
return testo;
}
// restituisce il testo html della div id="mw-content-text"
function leggiHtml() {
return $("#mw-content-text").html();
}
// scrive un testo html nella div id="mw-content-text"
function scriviHtml(testoHtml) {
$("#mw-content-text").html(testoHtml);
}
// riceve la stringa testo e due puntatori di sottostringa.
// aggiunge in testa e in coda alla sottostringa un tag span con backgroud-color di evidenziazione #def
// chiude e riapre lo span attorno ai caratteri speciali ‿ (marcatori di tag html)
function evidenzia(testo,ini,fin) {
var selezione=testo.substring(ini,fin);
selezione=selezione.replace(/(‿+)/g,'</span>$1<span style="background.color:#def">');
selezione='<span style="background.color:#def">'+selezione+'</span>';
testo=testo.substring(0,ini)+selezione+testo.substring(fin);
return testo
}