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!!! 💩