wiki:fr/preprocesseur
developer.jelix.org is not used any more and exists only for history. Post new tickets on the Github account.
developer.jelix.org n'est plus utilisée, et existe uniquement pour son historique. Postez les nouveaux tickets sur le compte github.

Le préprocesseur

Comme il est indiqué dans fr/sources, les sources de Jelix doivent passer par un préprocesseur avant de pouvoir être utilisées. Le préprocesseur va générer un fichier source final, à partir du contenu et de directives d'un fichier source initial. Ces directives indiquent au préprocesseur ce qu'il faut ou pas inclure dans le source final, en fonction de valeurs des variables d'environnement existantes.

Note : il peut travailler sur n'importe quel fichier "texte", que ce soit un fichier XML, PHP, HTML, texte etc..

Les directives

Une directive commence toujours par un # sur une ligne, sans caractères blanc avant le #. Le # est suivit par un nom de directive, puis éventuellement par d'autres paramètres.

#ifdef, #ifndef, #else, #elifdef, #endif

Permet de tester l'existante ou non d'une variable d'environnement. Elles sont accompagnées par un #endif et par un éventuel #else

   $rox = new MyObject();
#ifdef PROD_VERSION
   $foo = funcA($rox);
#else
   if(is_empty($foo)){
       trigger_error('foo undefined !',E_USER_ERROR);
   }else{    
      $foo = funcA($rox);
   }
#endif
   $foo->bar();

Si la variable d'environnement PROD_VERSION existe, alors le fichier source généré sera le suivant :

   $rox = new MyObject();
   $foo = funcA($rox);
   $foo->bar();

Sinon il sera :

   $rox = new MyObject();
   if(is_empty($foo)){
       trigger_error('foo undefined !',E_USER_ERROR);
   }else{    
      $foo = funcA($rox);
   }
   $foo->bar();

#ifndef test la non existance d'une variable d'environnement.

#expand

Permet d'afficher le contenu d'une ou plusieurs variables d'environnement. La directive est suivie par une ligne de code traditionnelle. À l'endroit où l'on veut insérer une variable d'environnement, on y met son nom encadré par deux caractères soulignés de chaque coté (deux avant, deux après).

#expand define ('JELIX_VERSION', '__LIB_VERSION__');

Si LIB_VERSION vaut "1.0" alors le code source généré sera

define ('JELIX_VERSION', '1.0');

#define, #undef

#define permet de définir de nouvelle variable à la volée ou de changer la valeur d'une variable d'environnement. Tandis que #undef détruit une variable.

#include, #includephp

Permet d'inclure le contenu d'un fichier dans un autre.

Exemple d'un fichier A :

aaaa

#include fichierB.txt

bbbb

Et le fichier B :

cccc
dddd

Alors le résultat du traitement du fichier A par le préprocesseur sera :

aaaa

cccc
dddd

bbbb

À noter que le chemin du fichier à inclure est relatif à celui du fichier qui inclus.

La différence entre include et includephp, est que le second enlève la balise <?php du début du fichier inclus, et le ?> de la fin.

Utilisation du préprocesseur

En ligne de commande

Le préprocesseur doit être lancé en ligne de commande avec le script build/preprocess.php. Il accepte en paramètres le chemin du fichier source initial et le chemin du fichier source final.

php build/preprocess.php lib/jelix/init.php ../../cible/lib/jelix/init.php

Pour spécifier des variables d'environnement, il faut faire un export (linux/mac) ou un set (windows) :

export LIB_VERSION=1.0
php build/preprocess.php lib/jelix/init.php ../../cible/lib/jelix/init.php

Dans un autre script

Si vous voulez utiliser le préprocesseur dans un de vos scripts, il faut inclure et appeler sa classe. Exemple :

include ('preprocessor.lib.php');

// les variables qui sont utilisés dans le fichier à analyser
$variables = array(
 'nom'=>'valeur',
 'FOO'=>'bar'
};

$sourcefile="test.txt";

try{
    $proc = new jPreProcessor();
    $proc->setVars($variables);
    $contenuResultat = $proc->parseFile($sourcefile);

}catch(Exception $e){
  echo $e;
  exit(1);
}

file_put_contents('newtest.txt', $contenuResultat);

Ici le résultat est mis dans un fichier newtest.txt, mais bien sûr vous pouvez en faire ce que vous voulez.


Retour au sommaire

Last modified 12 years ago Last modified on Nov 7, 2006, 10:27:16 PM