Carnet Code SPIP

ccmStructureTableauBoucle

SPIP - Contrib :: Carnet SPIP :: Carnet Code SPIP :: Derniers changements :: Recherche :

ccmStructureTableauBoucle

comment ça marche : le tableau des boucles

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

Les types d’objets

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) :

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) :

- le type Idiome
Il correspond à un tag <:machin:truc|monFiltre:> et contient les champs :

- 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 ?)