Version 3 — Mars 2007 — NicolasR
Il s’agit de la structure de données construite par le ccmPhraseur, et lue par ccmCompilateurDeSquelettes pour en déduire le code d’un squelette compilé.
Cette structure est donc le pivot entre deux phases et à l’intéret d’isoler fortement les deux phases.
C’est à dire que si on veut écrire le phraseur autrement, utiliser une autre grammaire de squelettes, ou compiler le résultat différemment, il suffit de modifier l’un des 2 maillons en respectant cette structure intermédiaire.
En fait, il y a deux éléments importants, renvoyés par la fonction phraser
: le tableau $boucles
listant les boucles, et le tableau $racine
listant les éléments de premier niveau du squelette.
Ces tableaux contiennent des objets correspondant aux blocs successifs du squelette. Chaque objet contient éventuellement des objets représentant les éléments de ce bloc (partie avant/après/milieu/sinon d’une boucle ou d’un champ).
ces objets sont du type Boucle, Champ, Idiome, Polyglotte ou Texte.
On va prendre un exemple concret, histoire de s’y retrouver, un squelette article.html
simpliste (téléchargeable ici) :
<html><body>
DEBUT<br/>
<B_principale>
avant<br/>
<BOUCLE_principale(ARTICLES){id_article}{doublons}{par titre}{inverse}>
#ID_ARTICLE : [ avant (#TITRE|strtr{'e', 'E'}) apres ]<br/>
</BOUCLE_principale>
apres<br/>
</B_principale>
sinon<br/>
<//B_principale>
FIN
<BOUCLE_racine(RUBRIQUES){racine}>
<br/>#ID_RUBRIQUE : #TITRE
<B_arbo><UL>
<BOUCLE_arbo(RUBRIQUES){id_parent}{par id_rubrique}{tous}>
<LI>#ID_RUBRIQUE : #TITRE
<BOUCLE_rec(boucle_arbo)>gni ?</BOUCLE_rec>.<br/><//B_rec>
</BOUCLE_arbo>
</UL></B_arbo>
</BOUCLE_racine>
<multi>un[en]one[de]eins</multi>
</body></html>
On y trouve successivement du texte (tag html/body), la boucle « principale », du texte, la boucle « racine », du texte.
La variable $racine
contient donc 5 éléments : 3 objets de la classe Texte et 2 de la classe Boucle.
Un dump de son contenu est ici
Le tableau $boucles
contient 4 objets de la classe Boucle représentant les 4 boucles du squelette
Un dump de son contenu est ici
[Erreur...4][Erreur...5][Erreur...6][Erreur...7][Erreur...8][Erreur...9][Erreur...10]
toutes ces classes ont un champ « type » pour les différencier (l’opérateur instanceOf c’est trop facile ;-) et un champ « ligne » qui contient le numéro de ligne correspondant dans le squelette (pour le debug).
- le type Boucle
Il correspond à l’ensemmble d’une boucle, et c’est le cas le plus complexe. Il contient les champs suivants (à chacun, je note la valeur q’uil a dans le cas de la boucle arbo de l’exemple) :
<BOUCLE
) (_arbo
: notez que le ’_’ est inclus)_racine
)<UL>
), apres=idem avec le </UL>
,<LI>
, champ ID_RUBRIQUE
, texte :
,TITRE
, texte « retour à la ligne », boucle _rec
et texte « retour à la ligne »),null
)rubriques
)null
)id_parent
, l’autre à l’opérateur par
et le champ param contenant un tableau d’un élément,id_rubrique
(on adore les toroirs ;-))null
)null
tous les 3)true
)false
)date
)false
)false
)false
)null
)null
)null
)false
)Les champs select, from ... sont peuplés par la génération de code elle même et non par le parsing, c’est pourquoi ils sont vides
à la sortie du phraseur.
- le type Champ
Il correspond à une balise seule ou conditionnelle du genre [avant(#machin*|filtre1{params})apres]
et contient les champs suivants (à chacun, je note la valeur qu’il a dans le cas de la balise #TITRE
de l’exemple) :
TITRE
)*
) (false
)strtr
) etstrtr
et {'e', 'E'}
)- le type Idiome
Il correspond à un tag <:machin:truc|monFiltre:>
et contient les champs :
[Erreur...13][Erreur...14][Erreur...15][Erreur...16]- le type Polyglotte
Il correspond à un tag <multi>
et contient uniquement le champ « traductions » dont les clés sont des langues et les valeurs les traductions associées.
- le type Texte
C’est le plus simple : il correspond à un extrait de texte brut et contient les champs « texte », ainsi que « avant » et « apres » qui sont inutilisés (à mon avis ?)