SPIP-Contrib

SPIP-Contrib

عربي | Deutsch | English | Español | français | italiano | Nederlands

286 Plugins, 197 contribs sur SPIP-Zone, 299 visiteurs en ce moment

Accueil > Documentation > Tutoriaux pour le code de SPIP > Le Compilateur De Squelettes

Le Compilateur De Squelettes

5 octobre 2005

Comment ça marche : le compilateur de squelettes

Là .. on attaque le gros morceau :-)

La fonction calculer_squelette (dans inc-compilo) prend 4 arguments :

  • $squelette : le texte du squelette source
  • $nom : le nom de la fonction principale attendue
  • $gram : l’extension
  • $sourcefile : le nom du fichier squelette source

Voila ce qu’elle fait :

  • défini un tableau $boucles vide. Il contiendra plus tard une entrée par boucle du squelette (ccmStructureTableauBoucle).
  • inclusion de inc-$gram-squel.php3 qui doit définir une fonction phraser (ccmPhraseur)
  • appel de cette fonction ($boucle est passé en argument et peuplé par la fonction) et retour mis dans la variable $racine (=nom de la boucle principale du squelette)
  • init d’un tableau $descr avec les champs nom (le nom de la fonction principale), documents (false) et sourcefile (le nom du fichier sqC)
  • on passe le champ document à true s’il y a une boucle de type documents avec le critère doublons.
  • on établi le lien mère/fille pour les boucles récursives et on appelle calculer_liste dessus
  • pour les autres boucles
    • on récupère son id_table et sa primary_key ainsi que ses jointures (pour les tables spip)
    • on appelle calculer_criteres dessus
    • on appelle calculer_liste dessus
  • on appelle calculer_liste sur la racine
  • dans les 3 cas, le retour de la fonction calculer_liste est mis dans le champ return de la boucle.
  • pour chaque boucle
    • on appelle la fonction de génération de code associée, c’est à dire une fonction boucle_{machin}, sinon boucle_{machin]-dist, sinon boucle_DEFAUT (machin étant le type de la boucle, c’est à dire ARTICLES, MOTS ...). Ces fonctions doivent retourner le corps d’une fonction générant le code de la boucle.
      • la plupart de ces fonctions appellent calculer_boucle qui effectue la génération de code select et la boucle d’itérations associée. À ce moment, le phraseur à déjà analysé les critères de boucle, et mis leur interprétation dans les champs de la structure boucle, mais c’est cette fonctio qui en déduit les éléments de requète et d’itérateur à générer.
    • on affecte au champ return le code de la déclaration d’une fonction :
      • son nom est construit à partir du nom du squelette et de celui de la boucle
      • son code est celui retourné par la fonction boucle_*
      • ses arguments sont fixés
    • si on est en mode debug, on ajoute des trucs au champ return, via la fonction boucle_debug_compile
  • pour chaque boucle, on ajoute son champ return à une chaine de caractère qui constitue donc le code compilé
  • on ajoute un commentaire d’entête à tout le machin et la définition de la fonction principale
  • on retourne le tout.

Bon ... c’est carrément pas clair car il est toujours difficile d’expliquer un code de compilateur, où des fonctions retournent le code d’un corps de fonction à placer dans une chaîne qui devient un fichier source ...
Voila un schéma qui résume un peu ces différentes étapes :

j’ai également une version pdf et la
source xfig que vous pouvez améliorer si ça vous botte.

À plusieurs reprises, on appelle calculer_liste sur une entrée du tableau boucles.
Voila le commentaire de cette fonction :

// Production du code PHP a partir de la sequence livree par le phraseur
// $boucles est passe par reference pour affectation par index_pile.
// Retourne une expression PHP,
// (qui sera argument d'un Return ou la partie droite d'une affectation).

Elle appelle compile_cas puis colle les extraits de codes retournés avec éventuelement des infos de debug.

compile_cas boucle sur les éléments du tableau passé en argument (soit la racine d’un squelette, soit le milieu d’une boucle).
Pour chacun, selon qu’il s’agit d’un texte, un polyglotte (tag <multi>), un include, une boucle, un idiome
(tag <:..:>), ou un champ, on appelle une fonction dédiée à ce cas (calculer_inclure, calculer_champ), ou on génère directement le code correspondant (appel à _T, multi_trad ou texte déspécialisé).
Dans certains cas, des parties avant/apres/sinon sont évaluées via un appel à calculer_liste.
Pour chaque bloc, on génère ensuite un extrait contenant le code seul, ou la construction si/alors/sinon associée à une boucle ou un champ.

Il y a également un appel tout discret à calculer_criteres qui a pourtant son importance : cette fonction parcours
la liste des critères de la boucle, et pour chacun, il appelle une fonction criteres_OP sinon
criteres_OP_dist sinon calculer_critere_DEFAUT ou calculer_critere_parties (dans le cas des critères {1,2} ou {1/3}.
Le « OP » correspond à l’opérateur du critère, c’est à dire un élément isolé lors du parsing (pour plus de détail, voir la fonction
phraser_criteres de inc-html-squel, bon courage ...).

Dernière modification de cette page le 17 juin 2007

Retour en haut de la page

Répondre à cet article

Qui êtes-vous ?
  • [Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici Les choses à faire avant de poser une question (Prolégomènes aux rapports de bugs. )
Ajouter un document

Retour en haut de la page

Ça discute par ici

  • Indexer : La boucle SPHINX

    29 juin 2015 – 14 commentaires

    Avant de commencer Pour comprendre l’intérêt du plugin, nous invitions à lire l’article suivant Indexer : Introduction. La configuration et l’installation du plugin sont expliquées dans l’article suivant : Indexer : Installation et Configuration (...)

  • Métas +

    3 décembre 2016 – 20 commentaires

    Améliorez l’indexation de vos articles dans les moteurs et leur affichage sur les réseaux sociaux grâce aux métadonnées Dublin Core, Open Graph et Twitter Card. Installation Activer le plugin dans le menu dédié. Dans le panel de configuration, (...)

  • Plugin jQuery Vector Maps

    24 septembre 2015 – commentaires

    Ce plugin permet d’avoir des rendus vectoriels (SVG) par l’intermédiaire de la librairie « jQuery Vector Maps » (JQVMAP). L’image SVG affichée est responsive. Préambule Le mode de fonctionnement de la librairie JQVMAP est à consulter sur le site dédié (...)

  • Japibas, squelette responsive

    11 octobre 2013 – 85 commentaires

    Japibas est un squelette responsive, multilingue (français, anglais et espagnol), dont l’habillage conviendrait à un site de type blog ou webzine. Le graphisme est inspiré du template Wordpress Japibas réalisé par Jesper Johansen et distribué sous (...)

  • Wordpress 2 SPIP

    26 mars 2012 – 25 commentaires

    Que fait Wordpress 2 SPIP Il importe un site Wordpress 3.3.1 dans un site SPIP 2.1.12 vierge. Les deux sites doivent être sur la même base de données et les tables Wordpress doivent commencer par wp_ (cas d’une installation Wordpress par défaut). (...)