Utente:Alex brollo/Unicode combining diacritics

Da Wikisource.
Jump to navigation Jump to search

Comincia l'avventura[modifica]

Raccogliamo le idee...

In http://unicode.org/charts/PDF/U0300.pdf l'elenco dei diacritici combinanti.

Il carattere unicode corrispondente si ottiene, in javascript, come in python: il carattere esadecimale 0300 (accento grave) si rappresenta come "\u0300".

test1="gia\u0300" 
// equivale a
test2="gia"+"\u0300"

Una semplice funzione che aggiunge qualsiasi carattere nella posizione precedente a quella del corsore è:

function comb(codice) {
	var t=selection();
	t[0]=t[0]+codice;
	scriviSel(t);
}

Attivando da console comb("\u0300") con il puntatore sulla o di puntatòre la o diventa ò.

Prima bozza del tool[modifica]

(function($,mw) { var diac=$("<div>").attr("class","diacritici").css({"position":"fixed","border":"1px dotted black","min-width":"50px","min-height":"20px","top":"50px","left":"50px","background-color","white"}).appendTo($("#content");
var diacritici="o o\u0301 o\u0301 o\u0302 o\u0303 o\u0304 o\u0305 o\u0306 o\u0307 o\u0308 o\u0309 o\u030a o\u030b o\u030c o\u030d "+
               "o\u0311 o\u0312 o\u0313 o\u0314 o\u0320 o\u0323 o\u0324 o\u0326 o\u0327 o\u0330 o\u0331 o\u0345 ".split(" ");
for (i=0;i<diacritici.length;i+=1) {
          diac.append($("<span>").text(diacritici[i]));
}

})($,mw)
Selezionando la ò e ricavandole la lunghezza "ò".length si ottiene il valore 2.

Salvando la pagina, rientrando in modifica e riselezionando la ò la sua lunghezza è diventata 1: questo perchè è stata effettuata una "normalizzazione" dell'unicode, che consiste nella sostituzione di tutte le sequenze ricombinanti con il carattere unicode corrispondente, ''se esiste''. Se invece la combinazione non esiste, i due caratteri restano distinti. 

In conclusione, la funzione comb() può essere usata per aggiungere qualsiasi diacritico, anche i più comuni, perchè il processo di normalizzazione li "semplificherà".

== Un passetto in avanti: NFC e NFD ==

Nel procedimento di normalizzazione esistono due possibilità: la composizione e la decomposizione. 

Un carattere come è può essere visto sia come un singolo carattere Unicode o come due caratteri unicode: la e e l'accento grave combinante. Se applico su è (carattere singolo) il metodo str.normalize("NFD") ottengo i due caratteri vocale e diacritico combinante;  se applico sui caratteri risultanti il metodo str.normalize("NFC") ottengo - se esiste - il carattere Unicode singolo corrispondente alla combinazione dei due. 

I software (browser? server?) eseguono normalmente la funzione di ''composizione''. 

Da ciò una strada per modificare un diacritico qualsiasi con un'altro diacritico qualsiasi:
* decompongo;
* sostituisco il diacritico combinante con il diacritico combinante corispondente;
* ricompongo (opzionale: è di default)

Questa funzione, applicata a un carattere c, sostituisce un eventuale diacritico con il diacritico d, e se non è presente lo aggiunge. 
<pre>
function dswap(c,d) {
    var carattere=c.normalize("NFD");
    if (carattere.length>1) carattere=carattere.substring(0,carattere.length-1)+d; else carattere=carattere+d;
    return carattere.normalize("NFC");
}

Da console:

dswap("é","\u0300")
"è"
dswap("e","\u0300")
"è"

Bozza di tool[modifica]

(function($,mw) { 
    var diac=$("<div>")
     .attr("class","diacritici")
     .css({"font-family":"Arial Unicode MS",
           "position":"fixed",
            "border":"1px dotted black",
            "min-width":"50px","max-width":"150px",
            "min-height":"20px",
            "top":"50px",
            "left":"50px",
            "background-color":"white",
            "z-index":"1000"})
     .appendTo($("#content")); 
      diac.draggable(); 

var diacritici=("o|o\u0300|o\u0301|o\u0302|o\u0303|o\u0304|o\u0305|o\u0306|o\u0307|o\u0308|o\u0309|o\u030a|o\u030b|o\u030c|o\u030d|o\u0311|o\u0312|o\u0313|o\u0314|o\u0320|o\u0323|o\u0324|o\u0326|o\u0327|o\u0330|o\u0331|o\u0345").normalize("NFC").split("|");

for (i=0;i<diacritici.length;i+=1) {

          diac.append($("<span>").text(diacritici[i]+" "));

     }


})($,mw)

Questo è interessante[modifica]

$("#myelement").click(function(){sayHello($(this).attr("hasData");});.

qua