Comment ça marche : le phraseur de squelettes
Le compilateur de squelette inclu un fichier inc-$gram-squel.php3
qui doit définir une fonction phraser
.
On peut donc définir son propre phraseur et le mettre en place simplement en surchargeant la valeur de cette variable gram.
Pour l’instant, on va se contenter de décrire la seule version dispo en standard ;-)
La fonction phraser
prend 4 arguments :
- le texte du squelette à parser (ou un extrait quand on parse un sous ensemble)
- l’id d’un éventuel parent ( ?)
- la structure de boucles (en passage par référence)
- le nom de la fonction à générer ( ?)
- le numéro de ligne où commence l’analyse (1 par défaut)
Le code est « à tiroir » : on analyse certains éléments, et pour chacun, on effectue l’analyse d’autres trucs à l’intérieur.
Dans la fonction phraser elle même, on fait deux choses :
- pour chaque début de boucle qu’on repère, on l’analyse :
- isole les parties avant, après ... pour construire les structures Boucle
- pour chacun, on rappelle récursivement
phraser
dessus - on appelle
phraser_champs_etendus
sur la partie avant - on retire tout le texte qu’on vient de passer pour recommencer avec un texte qui démarre après cette boucle
- on appelle
phraser_champs_etendus
pour parser la fin
En clair, on isole les boucle et on appelle phraser_champs_etendus
sur tous les bouts qu’on a découpé.
Dans phraser_champs_etendus
, on ne fait qu’appeler phraser_champs_interieurs
après avoir définir un
séparateur (une suite de caractères dont on vérifie qu’elle n’apparait nulle part dans le texte (qui a dit que c’était moche ;-))
Dans phraser_champs_interieurs
: heu ... là, je sèche ! j’y comprend rien.
En gros, on appelle phraser_champs_exterieurs
qui appelle phraser_inclure
qui appelle phraser_idiomes
qui appelle phraser_champs
qui appelle phraser_polyglotte
, ouf.
Arrivé là, je crois qu’on à fait le tour, à part phraser_critere
appelé dans l’analyse de boucle de phraser
et qui appelle lui même phraser_critere_infixe
, ainsi que phraser_args
appelé à divers endroits pour
analyser des arguments du type filtres je suppose.
L’important est de comprendre le principe général : on isole des éléments d’un type donné, on en déduit les parties avant, dans et après et
pour chacune, on appelle une analyse d’un autre type d’élément.
Donc, si on veut par exemple ajouter le type d’élément <PHP>
évoqué à une époque pour inclure du php uniquement évalué lors de l’évaluation du squelette (et non à chaque appel), il faudrait remplacer les appels à un des phraser_xyz
par des
appels à phraser_php
, dans lequel on appelerait phraser_xyz
sur les parties entre chaque bloc php.
Ainsi, on s’insère dans l’enchaînement, le plus dur étant de se mettre à un niveau qui assure qu’on ne va pas louper de morceaux.
Par exemple, l’appel à phraser_polyglotte
est assez bas dans la pile car à l’intérieur de ce tag, on n’accepte pas de
boucles ou de champs. On ne risque donc pas de couper un bloc multi en deux à cause d’un élément détecté avant.
Aucune discussion
Ajouter un commentaire
Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :
Merci d’avance pour les personnes qui vous aideront !
Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.
Suivre les commentaires : |