File HTML Javascript per scrivere testi latini con tastiera dotata di lettere italiane e simboli di uso comune.
Le codifiche Unicode UTF-8 delle vocali latine lunghe brevi, delle legature, delle E/e con dieresi le ho scritte in questa pagina
Ho usato JS Vanilla, cioè solo le istruzioni standard di JS senza ricorso a librerie esterne e framework.
Non vengono letti/modificati file esterni, non sono richieste connessioni a internet durante l'uso.
Per digitare vocali lunghe e brevi ho ideato questo sistema: prima della vocale bisogna digitare un carattere segnalatore scelto dall'utente.
Ad esempio, per le lunghe si può scegliere + e per le brevi -.
Il testo:
Maiuscole lunghe: ....+A....+E....+I....+O....+U....+Y
Maiuscole brevi: ....-A....-E....-I....-O....-U....-Y
Minuscole lunghe: ....+a....+e....+i....+o....+u....+y
Minuscole brevi: ....-a....-e....-i....-o....-u....-y
viene trasformato in:
Maiuscole lunghe: ....Ā....Ē....Ī....Ō....Ū....Ȳ
Maiuscole brevi: ....Ă....Ĕ....Ĭ....Ŏ....Ŭ....Y̆
Minuscole lunghe: ....ā....ē....ī....ō....ū....ȳ
Minuscole brevi: ....ă....ĕ....ĭ....ŏ....ŭ....y̆Analogamente ho risolto per le legature dei dittonghi AE, ae, OE, oe.
Input:
Legature: ....*AE....*ae....*OE....*oe....
Output:
Legature: ....Æ....æ....Œ....œ....
E/e con dieresi:
Input:
..../E..../e....
Output:
....Ë....ë....
Istruzioni per l'uso:
scaricare il file scrivi_latino.txt sul proprio computer;
cambiare l'estensione in "html" o "htm";
aprire il file con il browser;
inserire negli appositi campi (input text) i caratteri segnalatori scelti, non è obbligatorio metterli tutti (legature e dieresi capitano raramente);
confermare i segnalatori con l'apposito bottone;
il testo di partenza (con segnalatori) può essere scritto direttamente nella textarea "Testo input"; può anche essere scritto da un'altra parte e poi copia-incollato nella textarea;
premere il bottone "Conferma testo input", così il testo latinizzato appare nella textarea di output.
Il bottone "Azzera tutto" ripulisce input text, textarea e div e cancella i dati interni; predispone per una nuova elaborazione.
Ho usato elementi div per far apparire messaggi di errore in caso di anomalie dell'input.
Note tecniche sui miei codici Javascript.
Sono molto importanti queste funzioni:
// assegna a num il code point Unicode di s[i]
let num = s.codePointAt(i);
// assegna a car il carattere corrispondente al code point num
let car = String.fromCodePoint(num);
Faccio un uso moderato della programmazione a oggetti, uso molto raramente l'ereditarietà e mai il polimorfismo.
Preferisco la composizione, cioè istanza di un oggetto contenente istanze di altri oggetti specializzati.
L'oggetto Capo (istanza di CapoProg) dirige le operazioni.
I metodi del Capo usano gli oggetti interni per leggere/scrivere dati negli elementi HTML e per effettuare le elaborazioni.
Per evitare troppe complicazioni, ho posto i seguenti vincoli.
Solo il Capo può contenere istanze di altri oggetti, gli altri no.
Ho vietato di nidificare la composizione (oggetto che ne contiene un altro, che ne contiene un altro).
Solo il Capo può accedere agli elementi HTML (input text, textarea, bottoni e div) non direttamente, ma tramite oggetti specializzati posti al proprio interno.
Gli oggetti non Capo non possono comunicare direttamente fra loro, se Oggetto 1 deve passare il risultato delle sue elaborazioni a Oggetto 2 per altre operazioni, la cosa può essere fatta in due modi:
1) Oggetto 1 assegna il valore a una variabile posta all'interno di un metodo del Capo, Oggetto 2 lo legge e lo importa;
2) la variabile di transito può trovarsi all'interno del Capo (nel costruttore).
Anche se Javascript lo consente, ho vietato di aggiungere al volo (durante l'elaborazione) nuove variabili all'interno di un oggetto.
Nella programmazione a eventi (come avviene in interfacce grafiche) il programmatore non può prevedere in anticipo quali operazioni farà l'utente e in che ordine. Bisogna evitare che si attivi un'operazione senza averne fatta prima un'altra obbligatoria. Ad esempio, la conversione in testo latinizzato può essere fatta solo se sono stati prima inseriti e confermati i caratteri segnalatori.
Quindi il Capo contiene anche un'istanza di GestoreOrdineOperazioni; questo oggetto vigila per evitare che si tenti un'operazione senza averne fatta una preliminare necessaria. Il tentativo fa apparire un alert di avvertimento e non produce effetti sui dati.
Il Capo contiene una variabile stringa (this.op_fatta) che memorizza il nome dell'ultima operazione fatta. I metodi azionati dall'utente all'inizio chiedono al gestore ordine operazioni se l'attività richiesta è compatibile con la precedente. Al termine del loro lavoro i metodi aggiornano il valore di this.op_fatta.
Il gestore ordine operazioni contiene al suo interno una mappa; ogni chiave memorizza il nome di un'operazione; ogni valore associato a chiave è un array con l'elenco delle operazioni successive consentite.
Il Capo ha il metodo mostra_dati(), che può essere chiamato in vari punti del codice. Visualizza con console.log() il contenuto delle variabili del Capo. Può essere usato per vedere cosa succede "sotto il cofano" durante le elaborazioni e per individuare eventuali errori.
www.corradodamiano.it