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.
