Specimen OpenOffice

In OpenOffice Writer basta cliccare sul pulsante del font per ottenere la lista completa di tutti i tipi di carattere installati sul computer, e ciascun nome è scritto nel font medesimo in maniera tale da ottenere al volo una visione di insieme. Ma se uno vuole inserire la lista in un documento la cosa sembra più complicata, perché non c’è modo di copiare l’elenco dei font e salvarlo da qualche parte conservandone l’impaginazione. In realtà si tratta di un compito semplice, se si utilizzano le macro.
Le righe decisive sono queste tre:
 

doc=thisComponent
finestra=doc.getCurrentController().getFrame().getContainerWindow()
fonts()=finestra.getFontDescriptors()


La prima serve per accedere al documento, la seconda per acquisire le proprietà della finestra in cui si sta lavorando, e la terza invece è quella che prende la lista completa dei font installati e la memorizza in un array che qui abbiamo chiamato Fonts.

A questo punto basta impostare un ciclo while per inserire nel documento i nomi di tutti i font:
 

while i<n
doc.text.insertString(cursore, fonts(i).name , False)
doc.text.insertControlCharacter(cursore, com.sun.star.text.ControlCharacter.LINE_BREAK, False)
wend


La prima riga del ciclo scrive il nome del font all’interno del documento (ovviamente dobbiamo avere prima creato e posizionato il cursore, e inizializzato le variabili i e n), mentre la seconda serve per aggiungere un invio tra una riga e l’altra. Con questo sistema tutti i nomi vengono scritti nello stesso tipo di carattere, quello attualmente in uso nel documento. Se vogliamo che ogni nome di font sia scritto nel font medesimo dobbiamo aggiungere una riga all’inizio del ciclo (prima dell’inserimento):

cursore.charFontName=fonts(i).name

Comunque questo sistema è molto rudimentale: scorrendo la lista si può osservare che alcuni nomi ricorrono quattro volte, una dopo l’altra, e sono anche impaginati nello stesso modo. Questo perché viene considerato un font a sé non ciascun nome che compare nel menu a tendina di Writer, ma ciascun file che si trova nell’apposita cartella del sistema operativo. Visto che il Times New Roman è composto di quattro file (Regular, Italic, Bold e Bold Italic) ecco che compare quattro volte nella stessa lista. Lo stile è lo stesso perché la caratteristica Bold o Italic non fa parte del nome, ma è memorizzata a parte. Se vogliamo visualizzare anche lo stile dobbiamo tenere conto di due caratteristiche che per i Font Descriptors della finestra si chiamano Slant e Weight, mentre il cursore li chiama Char Font Name e Char Posture. 
Quindi, per ciascun font dobbiamo inserire anche queste due righe, prima dell’InsertString:

Cursore.CharPosture=Fonts(i).slant
Cursore.CharWeight=Fonts(i).weight


Non è che sul web se ne sia parlato molto di tutto ciò. La guida migliore in assoluto è forse quella scritta da Pitonyak. Non solo perché è l’unica che ho trovato ma perché mi pare scritta da un addetto ai lavori, che segue le convenzioni relative alla programmazione in OpenOffice Basic (a differenza di quello che faccio io, che mi preoccupo solo che lo script funzioni, senza necessariamente rendermi conto nel dettaglio di cosa fa e come).

Comunque, volendo movimentare un po’ la pagina, ho deciso di impostare il programma in maniera tale da restituire un output simile al famoso specimen di Caslon: nome in piccolo in maiuscoletto in caratteri standard, e specimen del font con frase in latino scritta da Cicerone in persona. Il codice che è venuto fuori è il seguente (scusate se non ho rispettato le convenzioni sui nomi delle variabili eccetera. Basta che funziona...)

(Attenzione: questo script sovraccarica il documento. Potete eseguirlo in OpenOffice solo se vi assumete tutte le responsabilità per eventuali effetti imprevisti che potrebbero verificarsi. Maggiori informazioni in coda a questo post). 
 
Sub Specimen

dim doc
dim finestra
dim cursore
dim fonts
dim i
dim n
dim frase

doc=thisComponent
finestra=doc.getCurrentController().getFrame().getContainerWindow()
fonts()=finestra.getFontDescriptors()

cursore=doc.text.createTextCursor()
n=Ubound(Fonts())
i=1
frase="Quousque tandem abutere, Catilina, patientia nostra?"


while i<n
 

cursore.charFontName="Times New Roman"
cursore.charposture=0
cursore.charweight=100
cursore.charHeight=6
cursore.charCaseMap=1
doc.text.insertString(cursore, fonts(i).name , False)
doc.text.insertControlCharacter(cursore, com.sun.star.text.ControlCharacter.LINE_BREAK, False)

cursore.charFontName=fonts(i).name
cursore.charposture=fonts(i).slant
cursore.charweight=fonts(i).weight
cursore.charHeight=12
cursore.charCaseMap=0
doc.text.insertString(cursore, frase, False)
doc.text.insertControlCharacter(cursore, com.sun.star.text.ControlCharacter.LINE_BREAK, False)
doc.text.insertControlCharacter(cursore, com.sun.star.text.ControlCharacter.LINE_BREAK, False)

i=i+1


wend
 

End Sub



E questo è il risultato... ripetuto per decine di pagine


Per provare il codice, basta copiarlo e cliccare poi in OpenOffice Writer su Strumenti, Macro, Organizza Macro, OpenOffice.org Basic, Modifica, quindi incollarlo in coda alla pagina delle macro. Infine, si apre un documento vuoto, si clicca su Strumenti, Esegui Macro, si cerca tra i vari moduli quella chiamata Specimen e poi si clicca sul pulsante Esegui. A quel punto la pagina si popolerà delle varie scritte di prova. Se sul vostro computer sono installati parecchi font bisogna attendere anche più di un minuto mentre le varie pagine vengono sistemate. 

Lo so, il codice è un po’ rozzo, ma funziona. Tutte le righe che iniziano con Dim non sono altro che le dichiarazioni generiche delle variabili che andremo a usare nel programma (volendo fare le cose precise si potrebbe essere più dettagliati nelle definizioni).
Doc serve per accedere al documento, Finestra per ottenere accesso alla lista dei font, che viene immagazzinata nell’array Fonts. Il Cursore ci serve per poter scrivere nel documento. La variabile N è il numero di font installati, la variabile I è un contatore che ci servirà per inserire una scritta dopo l’altra. La variabile Frase, ovviamente, è la frase che verrà scritta con ciascuno dei font.

Arriviamo al ciclo While: la prima parte è per il nome del font, la seconda è per la frase di prova. Per visualizzare il nome del font ho scelto di utilizzare il Times New Roman, in corpo 6 (charHeight), peso normale (charWeight=100), tutto in maiuscolo (charCaseMap=1), versione regolare (charposture=0). Inserisco il nome del font, poi un carattere di invio, e poi inizio a lavorare sulla frase specimen. Imposto il carattere da usare con il nome che ho appena stampato (charFontName=fonts(i).name), l’inclinazione tale e quale a quella dichiarata dal file in questione (charposture=fonts(i).slant) e anche il peso uguale a quello del file (queste indicazioni non sono incluse nel nome del file ma devono essere caricate a parte). A questo punto ingrandisco il corpo, utilizzando un normale 12, e reimposto il charCaseMap a 0: questo significa togliere il tutto-maiuscolo che ho usato sopra, in maniera tale che le maiuscole della frase di prova restino maiuscole, e le minuscole restino minuscole. Quindi inserisco la frase di prova e vado a capo due volte.
Aggiorno il contatore I per iniziare il ciclo successivo, che si ripete fino a quando la I non è diventata uguale a N. Insomma, per tutti i font della lista. 

Manca qualcosa? In effetti sì, volevo anche dividere il testo su tre colonne, senonché... sembra che nessuno abbia mai spiegato in parole semplici sul web come si fa. C’è un solo codice abbastanza intricato per chi non è del settore che non ho copiato e incollato perché a me interessa capire i vari passaggi. In effetti OpenOffice dà anche la possibilità di registrare delle macro. Purtroppo la mia versione è difettosa da questo punto di vista, per cui quando divido il tutto in tre capisce cosa sto cercando di fare, ma memorizza una macro che non esegue nessuna operazione.
Non mi pare che impostare tre colonne sia un compito così avanzato, dovrebbe essere alla portata di tutti, roba di due o tre righe. Se qualcuno ha la soluzione è pregato di condividerla.
In mancanza di una macro, bisogna farlo a mano: menu  Formato, Colonne, scegliere il numero e non dimenticarsi di distanziarle ed eventualmente inserirci una riga di separazione.

Possibile seccatura: i font che vengono restituiti dalla macro che ho messo a punto non vengono presentati in ordine alfabetico. Ma se non sbaglio una formula per ordinare la lista viene fornita nel pdf di Pitonyak. Serve solo un po’ di tempo per studiarsela e integrarla col resto del programma. 

Altro aspetto necessariamente da migliorare: il nome del font visualizzato resta lo stesso sia per la versione Regular che per le versioni Italic, Bold e Bold Italic. Ma anche questo non è un ostacolo insormontabile.

*

Ho dovuto aggiungere un disclaimer perché in effetti mi sono reso conto che OpenOffice si trova un po’ in difficoltà a gestire il file che viene fuori da questo script. Infatti se provo ad aggiungere qualche lettera nelle prime righe del file possono passare vari secondi prima che le lettere compaiano sullo schermo. Il problema non si verifica se provo a scrivere in coda al file, o in un’altra finestra. Idem se esporto la pagina in pdf non riscontro problemi di sorta. Evidentemente però il software non è entusiasta di dover gestire decine di pagine con una ventina di font diversi ciascuna (più gli ulteriori cambi per aggiungerci i nomi). Quindi ci mette un po’ di tempo a riadattare tutti i contenuti. Almeno io l’ho interpretata così. Del resto chi ha provato ad impaginare troppe fotografie in un unica pagina o in un unico documento lo sa che la cosa mette un po’ in difficoltà questo software.
C’è anche un’altra questione che potrebbe influire: alcuni font (anche presi da Google) possono essere difettosi. Quando sono usati da soli sono precisi, ma quando sono usati in un documento con altri font le lettere si comportano in maniera strana, comparendo più indietro o più in basso di dove dovrebbero comparire.
Quindi mi è parso giusto aggiungere la precisazione: lo script non ha creato nessun guaio irreparabile sul mio computer, però non escludo che altri computer possano reagire diversamente.
Comunque, la logica del programma credo che non faccia una piega: se invece di arrivare fino a N eseguo il ciclo solo per una decina o una ventina di font, non si crea nessun genere di sovraccarico.
Diciamo che ho voluto un po’ strafare, ma l’ispirazione era derivata dal celebre specimen di William Caslon in cui erano ragguppati in un unico foglio almeno 45 font diversi, più varie decorazioni e un assaggio delle varie diverse dimensioni delle lettere realizzate dal noto incisore britannico settecentesco.

Commenti

Post più popolari