Il testo

Mentivo, vi parlerò ancora dell'implementazione.

Non posso che parlarvi dell'implementazione, perché è ciò su cui ho lavorato negli ultimi mesi, mentre voi mi pensavate alternatamente morto o in vacanza ai Caraibi. Ciò che ho appena completato è forse il più contorto e ragionato modulo dell'intero sito: l'interprete del testo. Lo so, non è il modulo più prestigioso, ne' quello più brillante o pieno di lucette colorate, ma dal mio punto di vista è uno di quelli più importanti.

L'interprete rappresenta la mia interfaccia con il sito, il primo impatto quando mi trovo a scrivere qualcosa. Se questo impatto è difficoltoso allora scrivo di meno, o non scrivo per nulla, perché diventa troppo facile trovare di meglio da fare. Non c'è però nessun componente che io possa vedere, nessuna grafica più o meno piacevole, non è un editor visuale o testuale. È soltanto un lungo pezzo di php che legge i miei post e li converte in codice html, seguendo alcune semplici regole.

Le semplici regole hanno richiesto un paio di mesi di lavoro, non contando le varie versioni ed evoluzioni usate in passato.

Flashback!

In principio scrivevo HTML, ed era una palla. A nessuno fa piacere dover scrivere HTML quando scrive qualcosa. “Programmare” un sito è un altro discorso, sia chiaro, ma pensare a ciò che si vuole scrive, scriverlo ed infilarci dentro dell'html è un dolore, come lo è doverlo rileggere. Non è un linguaggio fatto per scrivere testo, ma per annotarlo dopo che è stato scritto —fatico a comprendere come qualcuno possa usarlo per scriverci un libro.

Era un tempo in cui i browser creavano molto più dolore di oggi, le codifiche dei caratteri funzionavano a volte, e dovevi scrivere tutte le lettere accentate usando &agrave; e compagnia. Convertire in automatico con htmlentities avrebbe trasformato troppi caratteri (in particolare < e >), lasciando come Obi-Wan della situazione l'uso estensivo di str_replace.

Aggiungendo replace dopo replace, uno inizia a poter scrivere più decentemente, ma ci sono ancora un sacco di tag ovunque. Alla riscossa arriva la “sintassi wiki” —la chiamo così, anche se precede di decenni qualsiasi wiki. Pochi simboli aggiunti al testo, che vengono convertiti in html in base a semplici espressioni regolari: *grassetto*, /corsivo/, etc. (un po' come il bbcode ma senza l'invasione delle parentesi quadre.)

Una volta che la formattazione più importante è coperta da queste scorciatoie, la leggibilità aumenta di parecchio, ma ancora non ci siamo. Link, sigle, liste, immagini, citazioni: quante cose che ancora richiedono di scrivere codice, in mezzo al testo.

Comprimendo la narrazione, dopo 5 anni avevo una discreta lista di replace ed espressioni regolari che si prendevano cura di eliminare quasi tutto il codice dalle pagine che scrivevo. Bonus: cambiando queste trasformazioni, le modifiche venivano applicate istantaneamente in tutte le pagine del sito! Mi ero imbattuto però in un profondo limite matematico che non mi permetteva di semplificare ulteriormente, nemmeno aggiungendo dozzine di altre regole.

Parser

Quello che volevo fare non era più gestibile via semplice rimpiazzi di testo, e richiedeva qualcosa di più complesso, che è ciò che ho appena completato: un parser per il testo, ed un interprete di comandi e macro che posso definire a piacere, anche all'interno di un testo. Vi evito discussioni troppo profonde, ma elenco un paio di cose di cui avevo bisogno:

Ammetto, ho scritto questa lista solo perché era facile farlo. Ma questo era in fondo lo scopo che mi prefiggevo: rendere lo scrivere per il sito non più faticoso dello scrivere e basta. Si, è un filo contorto vero?

Se volete farvi un'idea più concreta di cosa io stia blaterando, potete guardare il codice sorgente di questa pagina, e poi confrontarlo con il pulitissimo codice html che genera.

Può darsi che un giorno documenti anche il tutto, ma per ora ci sono solo appunti sparsi.

Il resto

Finito questo pezzo, dovrei iniziare il lavoro sul blog, ovvero definirne dimensioni, struttura, pagine e collegamenti fra gli stessi. Ma questo alla prossima puntata.



Warning: Invalid argument supplied for foreach() in /membri2/dreadnaut/meta/include/templates.engine.php on line 158

Warning: Invalid argument supplied for foreach() in /membri2/dreadnaut/meta/include/templates.engine.php on line 158

Warning: Invalid argument supplied for foreach() in /membri2/dreadnaut/meta/include/templates.engine.php on line 158

Warning: Invalid argument supplied for foreach() in /membri2/dreadnaut/meta/include/templates.engine.php on line 158

Warning: Invalid argument supplied for foreach() in /membri2/dreadnaut/meta/include/templates.engine.php on line 158

Warning: Invalid argument supplied for foreach() in /membri2/dreadnaut/meta/include/templates.engine.php on line 158

Warning: Invalid argument supplied for foreach() in /membri2/dreadnaut/meta/include/templates.engine.php on line 158

Warning: Invalid argument supplied for foreach() in /membri2/dreadnaut/meta/include/templates.engine.php on line 158

Warning: Invalid argument supplied for foreach() in /membri2/dreadnaut/meta/include/templates.engine.php on line 158

Warning: Invalid argument supplied for foreach() in /membri2/dreadnaut/meta/include/templates.engine.php on line 158

Warning: Invalid argument supplied for foreach() in /membri2/dreadnaut/meta/include/templates.engine.php on line 158

Warning: Invalid argument supplied for foreach() in /membri2/dreadnaut/meta/include/templates.engine.php on line 158

Warning: Invalid argument supplied for foreach() in /membri2/dreadnaut/meta/include/templates.engine.php on line 158

Warning: Invalid argument supplied for foreach() in /membri2/dreadnaut/meta/include/templates.engine.php on line 158

Warning: Invalid argument supplied for foreach() in /membri2/dreadnaut/meta/include/templates.engine.php on line 158

Warning: Invalid argument supplied for foreach() in /membri2/dreadnaut/meta/include/templates.engine.php on line 158

Warning: Invalid argument supplied for foreach() in /membri2/dreadnaut/meta/include/templates.engine.php on line 158

Warning: Invalid argument supplied for foreach() in /membri2/dreadnaut/meta/include/templates.engine.php on line 158

Warning: Invalid argument supplied for foreach() in /membri2/dreadnaut/meta/include/templates.engine.php on line 158

Warning: Invalid argument supplied for foreach() in /membri2/dreadnaut/meta/include/templates.engine.php on line 158

Warning: Invalid argument supplied for foreach() in /membri2/dreadnaut/meta/include/templates.engine.php on line 158

Warning: Invalid argument supplied for foreach() in /membri2/dreadnaut/meta/include/templates.engine.php on line 158

Warning: Invalid argument supplied for foreach() in /membri2/dreadnaut/meta/include/templates.engine.php on line 158