pihpi quando javascritto le stringhe fanno ciao!

Questa sera sono un po’ a caso impegnata in della magica programmazione, che ripulisce la mente e forse purifica l’animo, avendo come effetto collaterale anche quello di far avere al mondo nuovi programmini e progettini… Ed ho appena cacciato fuori un’idea assurda, talmente esoterica ma allo stesso tempo semplice che potrebbe essere forse illegale (ma io la userò comunque, in barba alla lobby del codice pulito). 🐒

Per motivi che ancora non so se andranno a segno, voglio poter fare templating HTML con la stessa sintassi sia da JavaScript che PHP, su stringhe che alla fine sono relativamente semplici, e quindi non ho voglia di aumentare la complessità di entrambi i programmi con librerie di templating particolari per una simile scemenza — e, volendo veramente mantenere la semplicità, voglio che siano in ogni caso normali funzioni del linguaggio a fare le formattazioni, e con la loro sintassi di interpolazione di stringhe, altrimenti l’editor poi non mi da i colori belli e mi viene mal di testa… 🤯

Aggiungiamoci anche il fatto che, per motivi che non mi metto a spiegare, l’unica opzione che davvero posso usare in un caso del genere per JavaScript lato client (HTML5) è uno <script> con dentro funzioni che fanno tipo function coso (id, dentro) { return `<div data-coso="${id}">${dentro}</div>` }… Ed ecco che la soluzione logica su cosa fare in PHP è tanto invisibile quanto precisamente sotto i miei occhi, tanto inappropriata quando calzante a pennello:

function js2php ( $zorp ) { // 😈
  $zorp = str_replace( '`', '\'', $zorp );
  $zorp = str_replace( '}<', '.\'<', $zorp );
  $zorp = str_replace( '}"', '.\'"', $zorp );
  $zorp = str_replace( '>${', '>\'.', $zorp );
  $zorp = str_replace( '"${', '"\'.', $zorp );
  return $zorp; // 💥
}

E quindi, tipo, io eval(js2php(file_get_contents('templating.js')));, e poi da PHP chiamo le funzioni di templating esattamente come farei da JavaScript, quindi in questo caso coso(42, '<img src="cacca.jpg">');!!! Funziona talmente bene che davvero non comprendo come mai la mia qui definita funzione js2php non faccia parte della libreria standard di PHP; anche se, doverosa precisazione, per funzionare così (e rimanere compatibile con JavaScript) la mia funzione coso dovrebbe essere riscritta così: function coso ($id, $dentro) { return `<div data-coso="${$id}">${$dentro}</div>`; }. 😳

Quello che la mia funzione molto grezza fa è modificare giusto quel poco della sintassi JavaScript che non è in comune con PHP, per farla diventare tale, e quindi poter essere poi valutata dall’interprete; il coso di esempio, passandoci dentro, diventa infatti così: function coso ($id, $dentro) { return '<div data-coso="'.$id.'">'.$dentro.'</div>'; }. (L’esercizio sfizioso di commentare sotto questo post che questa soluzione non deve mai essere usata per gestire input non sicuro, visto che usa eval, è lasciato ai lettori; il mio caso d’uso è sicuro.) 💉

Bonus: per evitare di avere funzioni vaganti come proiettili nello scope di esecuzione, si possono ovviamente dichiarare le funzioni dentro una hashmap… la sintassi di creazione è diversa tra PHP e JavaScript, ma basta creare una funzione con lo stesso nome che su PHP fa return []; e su JS return {}, poi l’assegnazione è uguale su tutti e due i linguaggi: map['coso'] = function(...){...};. Insomma, chiamatemi pure imperatrice del riciclo, come scrivo codice monnezza pur di ottimizzare la scrittura dello stesso!!! 💩