Un nuovo formato di testo
Non trovando nessun altro formato descritto in maniera approfondita su Internet, ho deciso che per dare corpo a questa sezione avrei scritto una specie di piccolo tutorial su come creare un proprio formato di files. In questa sottosezione, descriverò un nuovo formato di testo che ho pensato per l'occasione e, dopo averne scritto le specifiche, scriverò anche un programma per leggere e scrivere testi in questo formato.
Il concetto
Prima di tutto bisogna pensare a cosa si vuole immagazzinare nel file, e a un modo semplice, ma soprattutto economico in termini di spazio, per
farlo. Come ho detto prima, ho pensato ad un semplice file testuale, che però possa anche contenere i principali elementi di formattazione
(grassetto, corsivo, sottolineato, allineato, colorato, font differente, grandezza, eccetera...). Dopo alcuni tentativi, ripensando al
formato mp3 che avevo già analizzato, ho concluso che la via migliore per scrivere dati di questo tipo sia attraverso blocchi compatti
di informazione, spesso chiamati chunk. Ogni chunk conterrà il testo e tutto ciò che riguarda la sua formattazione.TLT Format Specification
Siccome non sono un megalomane, ho deciso di chiamare questo formato TLT, acronimo per Totem's Lair Text. Ok, ok... forse sono stato
troppo egoista... proseguiamo.L'inizio del file dovrebbe sempre essere costituito dalla stringa "TLT" per indicare che si tratta proprio di questo tipo di file: questo è un comune espediente che si usa per evitare di leggere files a cui è semplicemente stata cambiata l'estensione. Dopo i tre bytes dell'intestazione, cominciano subito i chunk di testo. E' vero che, di solito, le prime informazioni lette non costituiscono il vero contenuto, ma riguardano molto spesso alcune opzioni dell'intero file: dato che in questo caso non abbiamo ancora pensato a quali potrebbero essere, non ci serve altro per ora.
Ogni chunk è preceduto da un byte intero dedicato ai flags di formattazione:
- a : il primo bit rappresenta il grassetto. È 1 se il testo è in grassetto, altrimenti 0
- b : corsivo
- c : sottolineato
- d : rappresenta il colore del font. Dato che il colore non può essere stipato in un solo bit, questo interruttore indicherà che i quattro bytes successivi a questo saranno da leggersi come indicazione del colore, in formato ARGB
- e : rappresenta la grandezza del font. Per gli stessi motivi detti sopra, ci sarà un ulteriore byte che indica la grandezza del font, in punti
- f : rappresenta il font stesso. Sempre per gli stessi motivi, quando questo bit è attivo, il programma che legge il file dovrà
continuare a leggere nei bytes successivi il nome del font. Qui dovrebbe sorgere un dubbio: dato che il nome è una stringa e quindi non
a lunghezza fissa, come si fa ad indicare il numero di bytes da leggere? Semplicemente non lo si fa: presumiamo che questa sia una stringa
a terminatore nullo. Quando si incontrerà il byte
00 , vorrà dire che la stringa è terminata - gg : questi due bit rappresentano l'allineamento. 00 = sinistra; 01 = destra; 10 = centrato; 11 = giustificato
11001010 00001110
In ordine, avremo:- 1 > grassetto
- 1 > corsivo
- 0 > non sottolineato
- 0 > non colorato
- 1 > grandezza differente rispetto a quella normale. Ci sarà un byte in più, accodato a questo, che indica la grandezza.
Nell'esempio, quel byte è
00001110 , ossia 14. Questo font sarà di 14pt - 0 > font standard (Times New Roman, o quello che volete)
- 10 > centrato
00110100 FF FF 00 00 43 6F 75 72 69 65 72 20 4E 65 77 00
Questo è un po' più difficile:- 0 > non grassetto
- 0 > non corsivo
- 1 > sottolineato
- 1 > colorato. I quattro bytes successivi costituiscono il colore del font. In questo caso abbiamo
FF FF 00 00 , ossia rosso puro: Alpha = 255, Red = 255, Green = 0, Blue = 0 - 0 > grandezza di default (12pt)
- 1 > font. Ora ci saranno altri bytes in coda agli ultimi quattro del colore, essi sono:
43 6F 75 72 69 65 72 20 4E 65 77 00 , che costituiscono la stringa a terminatore nullo "Courier New", il nome del font - 00 > allineato a sinistra
| Intestazione chunk | ||||
| Flags | Colore (opzionale) | Grandezza (opzionale) | Nome font (opzionale) | Lunghezza testo |
| 1 byte | 4 bytes | 1 byte | x bytes | 4 bytes |
