Mise en route du suivi.
[aidenligne_francais_universite.git] / plugins / couteau_suisse / cout_utils.php
1 <?php
2 #-----------------------------------------------------#
3 # Plugin : Couteau Suisse - Licence : GPL #
4 # Auteur : Patrice Vanneufville, 2006 #
5 # Contact : patrice¡.!vanneufville¡@!laposte¡.!net #
6 # Infos : http://www.spip-contrib.net/?article2166 #
7 #-----------------------------------------------------#
8 # Fichier contenant les fonctions utilisees pendant #
9 # la configuration du plugin #
10 #-----------------------------------------------------#
11
12 cs_log("chargement de cout_utils.php et lancement de cs_initialisation...");
13 $GLOBALS['cs_utils']++;
14
15 // $outils : tableau ultra complet avec tout ce qu'il faut savoir sur chaque outil
16 // $cs_variables : tableau de toutes les variables que les outils peuvent utiliser et manipuler
17 // - ces deux tableaux ne sont remplis qu'une seule fois, lors d'une initialisation totale
18 // les hits ordinaires ne se servent que des metas, non des fichiers.
19 // - l'initialisation totale insere en premier lieu config_outils.php
20 global $outils, $cs_variables;
21 $cs_variables = $outils = array();
22 // liste des types de variable
23 $cs_variables['_chaines'] = $cs_variables['_nombres'] = array();
24
25 /*****************/
26 /* COMPATIBILITE */
27 /*****************/
28
29 if (!defined('_DIR_PLUGIN_COUTEAU_SUISSE')){
30 $p=explode(basename(_DIR_PLUGINS)."/",str_replace('\\','/',realpath(dirname(__FILE__))));
31 $p=_DIR_PLUGINS.end($p); if ($p[strlen($p)-1]!='/') $p.='/';
32 define('_DIR_PLUGIN_COUTEAU_SUISSE', $p);
33 }
34 if(defined('_SPIP19100')) {
35 function compacte_css($texte) { return $texte; }
36 function compacte_js($texte) { return $texte; }
37 }
38
39 // SPIP 1.93 a change cette fonction. donc, en attendant mieux...
40 function cs_ajax_action_greffe($idom, $corps, $br='<br />') {
41 return _request('var_ajaxcharset') ? "$br$corps" : "\n<div id='$idom'>$corps\n</div>\n";
42 }
43
44 function cs_suppr_metas_var($meta, $new = false) {
45 global $metas_vars;
46 if (!isset($metas_vars[$meta])) return;
47 if ($new) {
48 if (preg_match(',([0-9A-Za-z_-]*)\(('.'[0-9A-Za-z_-]*=[A-Za-z_:-]+\|[0-9A-Za-z_:=>|-]+'.')\),', $metas_vars[$meta], $reg)) $metas_vars[$new] = $reg[1];
49 else $metas_vars[$new] = $metas_vars[$meta];
50 }
51 unset($metas_vars[$meta]);
52 }
53
54 // on actualise/supprime de vieilles variables creees par les version anterieures du Couteau Suisse
55 function cs_compatibilite_ascendante() {
56 cs_suppr_metas_var('set_options');
57 cs_suppr_metas_var('radio_set_options3');
58 cs_suppr_metas_var('radio_set_options', 'radio_set_options4');
59 cs_suppr_metas_var('radio_type_urls', 'radio_type_urls3');
60 cs_suppr_metas_var('radio_type_urls2', 'radio_type_urls3');
61 cs_suppr_metas_var('radio_filtrer_javascript', 'radio_filtrer_javascript3');
62 cs_suppr_metas_var('radio_filtrer_javascript2', 'radio_filtrer_javascript3');
63 cs_suppr_metas_var('radio_suivi_forums', 'radio_suivi_forums3');
64 cs_suppr_metas_var('desactive_cache');
65 cs_suppr_metas_var('radio_desactive_cache', 'radio_desactive_cache3');
66 cs_suppr_metas_var('target_blank');
67 cs_suppr_metas_var('url_glossaire_externe', 'url_glossaire_externe2');
68 cs_suppr_metas_var('');
69 }
70
71 /*************/
72 /* FONCTIONS */
73 /*************/
74
75 // ajoute un outil a $outils;
76 function add_outil($tableau) {
77 global $outils;
78 static $id; $id = isset($id)?$id + 10:0;
79 if (!isset($tableau['id'])) { $tableau['id']='erreur'.count($outils); $tableau['nom'] = _T('couteauprive:erreur_id'); }
80 $tableau['index'] = $id;
81 $outils[$tableau['id']] = $tableau;
82 }
83
84 // ajoute une variable a $cs_variables et fabrique une liste des chaines et des nombres
85 function add_variable($tableau) {
86 global $cs_variables;
87 $nom = $tableau['nom'];
88 $cs_variables[$nom] = $tableau;
89 // on fabrique ici une liste des chaines et une liste des nombres
90 if($tableau['format']=='nombre') $cs_variables['_nombres'][] = $nom;
91 elseif($tableau['format']=='chaine') $cs_variables['_chaines'][] = $nom;
92 }
93
94 // retourne la valeur 'defaut' (format php) de la variable apres compilation du code
95 // le resultat comporte des guillemets si c'est une chaine
96 function cs_get_defaut($variable) {
97 global $cs_variables;
98 // si la variable n'est pas declaree, serieux pb dans config_outils !
99 if (!isset($cs_variables[$variable])) {
100 spip_log("Erreur - variable '$variable' non declaree dans config_outils.php !");
101 return false;
102 }
103 $variable = &$cs_variables[$variable];
104 $defaut = $variable['defaut'];
105 if(!strlen($defaut)) $defaut = "''";
106 if($variable['format']=='nombre') $defaut = "intval($defaut)";
107 elseif($variable['format']=='chaine') $defaut = "strval($defaut)";
108 //cs_log("cs_get_defaut() - \$defaut[{$variable['nom']}] = $defaut");
109 eval("\$defaut=$defaut;");
110 $defaut2 = cs_php_format($defaut, $variable['format']!='nombre');
111 //cs_log(" -- cs_get_defaut() - \$defaut[{$variable['nom']}] est devenu : $defaut2");
112 return $defaut2;
113 }
114
115 // $type ici est egal a 'options' ou 'fonctions'
116 function ecrire_fichier_en_tmp($infos_pipelines, $type) {
117 global $cs_metas_pipelines;
118 $code = '';
119 if (isset($infos_pipelines['inc_'.$type]))
120 foreach ($infos_pipelines['inc_'.$type] as $inc) $code .= "include_spip('outils/$inc');\n";
121 if (isset($infos_pipelines['code_'.$type]))
122 foreach ($infos_pipelines['code_'.$type] as $inline) $code .= $inline."\n";
123 // on optimise avant...
124 $code = str_replace(array('intval("")',"intval('')"), '0', $code);
125 $code = str_replace("\n".'if(strlen($foo="")) ',"\n\$foo=''; //", $code);
126 // ... en avant le code !
127 $fichier_dest = _DIR_CS_TMP . "mes_$type.php";
128 cs_log("ecrire_fichier_en_tmp($type) : lgr=".strlen($code))." pour $fichier_dest";
129 if(!ecrire_fichier($fichier_dest, '<'."?php\n// Code d'inclusion pour le plugin 'Couteau Suisse'\n++\$GLOBALS['cs_$type'];\n$code?".'>', true))
130 cs_log("ERREUR ECRITURE : $fichier_dest");
131 }
132
133 // installation de $cs_metas_pipelines
134 function set_cs_metas_pipelines_pipeline($infos_pipelines, $pipeline) {
135 global $cs_metas_pipelines;
136 // precaution utile ?
137 $code = '';//"@include(_COUT_FONCTIONS_PHP);\n";
138 if (isset($infos_pipelines[$pipeline])) {
139 $a = &$infos_pipelines[$pipeline];
140 if(is_array($a['inline'])) foreach ($a['inline'] as $inc) $code .= "$inc\n";
141 if(is_array($a['inclure'])) foreach ($a['inclure'] as $inc) $code .= "include_spip('outils/$inc');\n";
142 if(is_array($a['fonction'])) foreach ($a['fonction'] as $fonc) $code .= "if (function_exists('$fonc')) \$flux=$fonc(\$flux);\n\telse spip_log('Erreur - $fonc(\$flux) non definie !');\n";
143 }
144 $cs_metas_pipelines[$pipeline] = $code;
145 cs_log("set_cs_metas_pipelines_pipeline($pipeline) : strlen=".strlen($code));
146 return "# Copie du code code utilise en eval() pour le pipeline '$pipeline(\$flux)'\n$code";
147 }
148
149 // est-ce que $pipe est un pipeline ?
150 function is_pipeline_outil($pipe, &$set_pipe) {
151 if ($ok = preg_match(',^pipeline:(.*?)$,', $pipe, $t)) $set_pipe = trim($t[1]);
152 return $ok;
153 }
154 // est-ce que $pipe est un pipeline inline?
155 function is_pipeline_outil_inline($pipe, &$set_pipe) {
156 if ($ok = preg_match(',^pipelinecode:(.*?)$,', $pipe, $t)) $set_pipe = trim($t[1]);
157 return $ok;
158 }
159
160 // est-ce que $traitement est un traitement ?
161 function is_traitements_outil($traitement, $fonction, &$set_traitements_utilises) {
162 if ($ok = preg_match(',^traitement:([A-Z_]+)/?([a-z]+)?:(pre|post)_([a-zA-Z0-9_-]+)$,', $traitement, $t)) {
163 if(!strlen($t[2])) $t[2] = 0;
164 $set_traitements_utilises[$t[1]][$t[2]][$t[4]][$t[3]][] = $fonction;
165 } elseif ($ok = preg_match(',^traitement:([A-Z]+)$,', $traitement, $t))
166 $set_traitements_utilises[$t[1]][0][0][] = $fonction;
167 return $ok;
168 }
169
170 // lire un fichier php et retirer si possible les balises ?php
171 function cs_lire_fichier_php($file) {
172 $file=find_in_path($file);
173 if ($file && lire_fichier($file, $php)) {
174 if (preg_match(',^<\?php(.*)?\?>$,msi', trim($php), $regs)) return trim($regs[1]);
175 return "\n"."?>\n".trim($php)."\n<"."?php\n";
176 }
177 return false;
178 }
179
180 // retourne une aide concernant les raccourcis ajoutes par l'outil
181 function cs_aide_raccourcis() {
182 global $outils;
183 $aide = array();
184 foreach ($outils as $outil) {
185 // stockage de la liste des fonctions par pipeline, si l'outil est actif...
186 if ($outil['actif']) {
187 $id = $outil['id'];
188 include_spip('outils/'.$id);
189 if (function_exists($f = $id.'_raccourcis')) $aide[] = '<li style="margin: 0.7em 0 0 0;">&bull; ' . $f() . '</li>';
190 elseif (!preg_match(',:aide$,', _T("couteauprive:$id:aide") ))
191 $aide[] = '<li style="margin: 0.7em 0 0 0;">&bull; ' . _T("couteauprive:$id:aide") . '</li>';
192 }
193 }
194 if(!count($aide)) return '';
195 return '<p><b>' . _T('couteauprive:raccourcis') . '</b></p><ul style="list-style-type:none; padding:0; margin: 0; list-style-image: none; list-style-position: outside; ">' . join("\n", $aide) . '</ul>';
196 }
197
198 // retourne une aide concernant les pipelines utilises par l'outil
199 function cs_aide_pipelines() {
200 global $cs_metas_pipelines, $outils, $metas_outils;
201 $aide = array();
202 foreach (array_keys($cs_metas_pipelines) as $pipe) {
203 // stockage de la liste des pipelines et du nombre d'outils actifs concernes
204 $nb=0; foreach($outils as $outil) if($outil['actif'] && isset($outil['pipeline:'.$pipe])) $nb++;
205 if ($nb) $aide[] = _T('couteauprive:outil_nb'.($nb>1?'s':''), array('pipe'=>$pipe, 'nb'=>$nb));
206 }
207 // nombre d'outils actifs
208 $nb=0; foreach($metas_outils as $o) if($o['actif']) $nb++;
209 // nombre d'outils caches
210 $ca = isset($GLOBALS['meta']['tweaks_caches'])?count(unserialize($GLOBALS['meta']['tweaks_caches'])):0;
211 return '<p><b>' . _T('couteauprive:pipelines') . '</b> '.count($aide).'</p><p style="margin-left:1em;">' . join("<br/>", $aide) . '</p>'
212 . '<p><b>' . _T('couteauprive:outils_actifs') . "</b> $nb</p>"
213 . '<p><b>' . _T('couteauprive:outils_caches') . "</b> $ca</p>";
214 }
215
216 // met en forme le fichier $f en vue d'un insertion en head
217 function cs_insert_header($f, $type) {
218 if ($type=='css') {
219 include_spip('inc/filtres');
220 return '<link rel="stylesheet" href="'.url_absolue(direction_css($f)).'" type="text/css" media="projection, screen" />';
221 } elseif ($type=='js')
222 return '<script type="text/javascript" src="'.url_absolue($f).'"></script>';
223 }
224 // sauve la configuration dans un fichier tmp/couteau-suisse/config.php
225 function cs_sauve_configuration() {
226 global $outils, $metas_vars;
227 $metas = $metas_actifs = $variables = $lesoutils = $actifs = array();
228 foreach($outils as $t) {
229 $lesoutils[] = "\t// ".$t['nom']."\n\t'".$t['id']."' => '".join('|', $t['variables']) . "'";
230 if($t['actif']) {
231 $actifs[] = $t['id'];
232 $variables = array_merge($variables, $t['variables']);
233 }
234 }
235 foreach($metas_vars as $i => $v) if($i!='_chaines' && $i!='_nombres') {
236 $metas[] = $temp = "\t'$i' => " . cs_php_format($v, in_array($i, $metas_vars['_chaines']));
237 if(in_array($i, $variables)) $metas_actifs[] = $temp;
238 }
239 $sauve = "// Tous les outils et leurs variables\n\$liste_outils = array(\n" . join(",\n", $lesoutils) . "\n);\n"
240 . "\n// Outils actifs\n\$outils_actifs =\n\t'" . join('|', $actifs) . "';\n"
241 . "\n// Variables actives\n\$variables_actives =\n\t'" . join('|', $variables) . "';\n"
242 . "\n// Valeurs validees en metas\n\$valeurs_validees = array(\n" . join(",\n", $metas) . "\n);\n";
243
244 $sauve .= $temp = "\n######## PACK ACTUEL DE CONFIGURATION DU COUTEAU SUISSE #########\n"
245 . "\n// Attention, les surcharges sur les define() ou les globales ne sont pas specifiees ici\n"
246 . "\$GLOBALS['cs_installer']['"._T('couteauprive:pack')."'] = array(\n\n\t// Installation des outils par defaut\n"
247 . "\t'outils' =>\n\t\t'".join('|', $actifs)."',\n"
248 . "\n\t// Installation des variables par defaut\n"
249 . "\t'variables' => array(\n\t" . join(",\n\t", $metas_actifs) . "\n\t)\n);\n";
250
251 ecrire_fichier(_DIR_CS_TMP.'config.php', '<'."?php\n// Configuration de controle pour le plugin 'Couteau Suisse'\n\n$sauve?".'>');
252 if($_GET['cmd']=='pack') $GLOBALS['cs_pack_actuel'] = $temp;
253 }
254
255 // cree un tableau $infos_pipelines et initialise $cs_metas_pipelines
256 function cs_initialise_includes($count_metas_outils) {
257 global $outils, $cs_metas_pipelines;
258 // toutes les infos sur les pipelines
259 $infos_pipelines = array();
260 // liste des pipelines utilises
261 $pipelines_utilises = array();
262 // liste des pipelines utilises
263 $traitements_utilises = array();
264 // variables temporaires
265 $temp_css = $temp_js = $temp_jq = $temp_jq_init = $temp_filtre_imprimer = array();
266 // pour la fonction inclure_page()
267 include_spip('public/assembler');
268 // inclure d'office outils/cout_fonctions.php
269 if ($temp=cs_lire_fichier_php("outils/cout_fonctions.php"))
270 $infos_pipelines['code_fonctions'][] = $temp;
271 // variable de verification
272 $infos_pipelines['code_options'][] = "\$GLOBALS['cs_verif']=$count_metas_outils;";
273 // parcours de tous les outils
274 foreach ($outils as $i=>$outil) {
275 // stockage de la liste des fonctions par pipeline, si l'outil est actif...
276 if ($outil['actif']) {
277 $inc = $outil['id']; $pipe2 = '';
278 foreach ($outil as $pipe=>$fonc) {
279 if (is_pipeline_outil($pipe, $pipe2)) {
280 // module a inclure
281 $infos_pipelines[$pipe2]['inclure'][] = $inc;
282 // fonction a appeler
283 $infos_pipelines[$pipe2]['fonction'][] = $fonc;
284 // liste des pipelines utilises
285 if (!in_array($pipe2, $pipelines_utilises)) $pipelines_utilises[] = $pipe2;
286 } elseif (is_pipeline_outil_inline($pipe, $pipe2)) {
287 // code inline
288 $infos_pipelines[$pipe2]['inline'][] = $fonc;
289 if (!in_array($pipe2, $pipelines_utilises)) $pipelines_utilises[] = $pipe2;
290 } elseif (is_traitements_outil($pipe, $fonc, $traitements_utilises)) {
291 // rien a faire : $traitements_utilises est rempli par is_traitements_outil()
292 }
293 }
294 // recherche d'un fichier .css, .css.html et/ou .js eventuellement present dans outils/
295 if ($f=find_in_path($_css = "outils/$inc.css")) $cs_metas_pipelines['header'][] = cs_insert_header($f, 'css');
296 if ($f=find_in_path("outils/$inc.js")) $cs_metas_pipelines['header'][] = cs_insert_header($f, 'js');
297 // en fait on peut pas car les balises vont devoir etre traitees et les traitements ne sont pas encore dispo !
298 if ($f=find_in_path("outils/$inc.css.html")) {
299 // ici, cout_fonction.php va etre appele pour traiter les balises du css
300 $GLOBALS['cs_options']++;
301 $f = inclure_page($_css, array('fond'=>$_css));
302 $GLOBALS['cs_options']--;
303 $temp_css[] = $f['texte'];
304 }
305 // recherche d'un code inline eventuellement propose
306 if (isset($outil['code:options'])) $infos_pipelines['code_options'][] = $outil['code:options'];
307 if (isset($outil['code:fonctions'])) $infos_pipelines['code_fonctions'][] = $outil['code:fonctions'];
308 if (isset($outil['code:css'])) $temp_css[] = cs_parse_code_js($outil['code:css']);
309 if (isset($outil['code:js'])) $temp_js[] = cs_parse_code_js($outil['code:js']);
310 if (isset($outil['code:jq_init'])) $temp_jq_init[] = cs_parse_code_js($outil['code:jq_init']);
311 if (isset($outil['code:jq'])) $temp_jq[] = cs_parse_code_js($outil['code:jq']);
312 // recherche d'un fichier monoutil_options.php ou monoutil_fonctions.php pour l'inserer dans le code
313 if ($temp=cs_lire_fichier_php("outils/{$inc}_options.php"))
314 $infos_pipelines['code_options'][] = $temp;
315 if ($temp=cs_lire_fichier_php("outils/{$inc}_fonctions.php"))
316 $infos_pipelines['code_fonctions'][] = $temp;
317 }
318 }
319 // insertion du css pour la BarreTypo
320 if(in_array('BT_toolbox', $pipelines_utilises))
321 $temp_css[] = 'span.cs_BT {background-color:#FFDDAA; font-weight:bold; border:1px outset #CCCC99; padding:0.2em 0.3em;}
322 span.cs_BTg {font-size:140%; padding:0 0.3em;}';
323 // concatenation des css inline, js inline et filtres trouves
324 if (count($temp_css))
325 $cs_metas_pipelines['header'][] = "<style type=\"text/css\">\n"
326 .compacte_css(join("\n", $temp_css))."\n</style>";
327 if (count($temp_jq_init)) {
328 $temp_js[] = "var cs_init = function() {\n".join("\n", $temp_jq_init)."\n}\nif(typeof onAjaxLoad=='function') onAjaxLoad(cs_init);";
329 $temp_jq[] = "cs_init.apply(document);";
330 }
331 if (count($temp_jq))
332 $temp_js[] = "if (window.jQuery) jQuery(document).ready(function(){\n".join("\n", $temp_jq)."\n});";
333 if (count($temp_js))
334 $cs_metas_pipelines['header'][] = "<script type=\"text/javascript\"><!--\n"
335 .compacte_js(join("\n", $temp_js))."\n// --></script>\n";
336 // mise en code des traitements trouves
337 foreach($traitements_utilises as $b=>$balise) {
338 foreach($balise as $p=>$precision) {
339 // ici, on fait attention de ne pas melanger propre et typo
340 if(array_key_exists('typo', $precision) && array_key_exists('propre', $precision)) die(_T('couteauprive:erreur:traitements'));
341 foreach($precision as $f=>$fonction) {
342 // pas d'objet precis
343 if ($f===0) $traitements_utilises[$b][$p][$f] = join("(", array_reverse($fonction)).'(';
344 // un objet precis
345 else {
346 $pre = isset($fonction['pre'])?join('(', $fonction['pre']).'(':'';
347 $post = isset($fonction['post'])?join('(', $fonction['post']).'(':'';
348 $traitements_utilises[$b][$p][$f] = $post.$f.'('.$pre;
349 }
350 }
351 $temp = "\$GLOBALS['table_des_traitements']['$b'][" . ($p=='0'?'':"'$p'") . "]='" . join('(', $traitements_utilises[$b][$p]).'%s';
352 $traitements_utilises[$b][$p] = $temp . str_repeat(')', substr_count($temp, '(')) . "';";
353 }
354 $traitements_utilises[$b] = join("\n", $traitements_utilises[$b]);
355 }
356 if(count($traitements_utilises))
357 $infos_pipelines['code_options'][] = "// Table des traitements\n" . join("\n", $traitements_utilises);
358 // effacement du repertoire temporaire de controle
359 if (@file_exists(_DIR_CS_TMP) && ($handle = @opendir(_DIR_CS_TMP))) {
360 while (($fichier = @readdir($handle)) !== false)
361 if ($fichier[0] != '.') supprimer_fichier(_DIR_CS_TMP.$fichier);
362 closedir($handle);
363 } else spip_log('Erreur - cs_initialise_includes() : '._DIR_CS_TMP.' introuvable !');
364 // installation de $cs_metas_pipelines
365 ecrire_fichier_en_tmp($infos_pipelines, 'options');
366 ecrire_fichier_en_tmp($infos_pipelines, 'fonctions');
367 $code = array();
368 foreach($pipelines_utilises as $pipe) $code[] = set_cs_metas_pipelines_pipeline($infos_pipelines, $pipe);
369 if($nb=count($code))
370 ecrire_fichier(_DIR_CS_TMP . "pipelines.php",
371 '<'."?php\n// Code de controle pour le plugin 'Couteau Suisse' : $nb pipeline(s) actif(s)\n\n".join("\n", $code).'?'.'>');
372 }
373
374 // retire les guillemets extremes s'il y en a
375 function cs_retire_guillemets($valeur) {
376 if (preg_match(',^\'(.*)\'$,ms', trim($valeur), $matches))
377 return str_replace("\'", "'", $matches[1]);
378 if (preg_match(',^"(.*)"$,ms', trim($valeur), $matches))
379 return str_replace('\"', '"', $matches[1]);
380 return $valeur;
381 }
382
383 // met en forme une valeur dans le stype php
384 function cs_php_format($valeur, $is_chaine = true) {
385 $valeur = cs_retire_guillemets($valeur);
386 if(!strlen($valeur)) return $is_chaine?"''":0;
387 if(!$is_chaine) return $valeur;
388 $valeur = str_replace("\\", "\\\\", $valeur);
389 return "'".str_replace("'", "\\'", $valeur)."'";
390 }
391
392 // retourne le code compile d'une variable en fonction de sa valeur
393 function cs_get_code_variable($variable, $valeur) {
394 global $cs_variables;
395 // si la variable n'a pas ete declaree
396 if(!isset($cs_variables[$variable])) return _L("// Variable '$variable' inconnue !");
397 $cs_variable = &$cs_variables[$variable];
398 // mise en forme php de $valeur
399 if(!strlen($valeur)) {
400 if($cs_variable['format']=='nombre') $valeur='0'; else $valeur='""';
401 } else
402 $valeur = cs_php_format($valeur, $cs_variable['format']!='nombre');
403 $code = '';
404 foreach($cs_variable as $type=>$param) if (preg_match(',^code(:(.*))?$,', $type, $regs)) {
405 $eval = '$test = ' . (isset($regs[2])?str_replace('%s', $valeur, $regs[2]):'true') . ';';
406 $test = false;
407 eval($eval);
408 if($test) return str_replace('%s', $valeur, $param);
409 }
410 }
411
412 // remplace les valeurs marquees comme %%toto%% par le code reel prevu par $cs_variables['toto']['code:condition']
413 // attention de bien declarer les variables a l'aide de add_variable()
414 function cs_parse_code_php($code) {
415 global $metas_vars, $cs_variables;
416 while(preg_match(",([']?)%%([a-zA-Z_][a-zA-Z0-9_]*?)%%([']?),", $code, $matches)) {
417 $cotes = $matches[1]=="'" && $matches[3]=="'";
418 $nom = $matches[2];
419 // la valeur de la variable n'est stockee dans les metas qu'au premier post
420 if (isset($metas_vars[$nom])) {
421 $rempl = cs_get_code_variable($nom, $metas_vars[$nom]);
422 } else {
423 // tant que le webmestre n'a pas poste, on prend la valeur (dynamique) par defaut
424 $defaut = cs_get_defaut($nom);
425 $rempl = cs_get_code_variable($nom, $defaut);
426 $code = "/* Valeur par defaut : {$nom} = $defaut */\n" . $code;
427 }
428 if ($cotes) $rempl = str_replace("'", "\'", $rempl);
429 $code = str_replace($matches[0], $matches[1].$rempl.$matches[3], $code);
430 //echo "\nRETURN CODE = $code";
431 }
432 return $code;
433 }
434
435 // remplace les valeurs marquees comme %%toto%% par la valeur reelle de $metas_vars['toto']
436 // + quelques optimisations du code
437 // si cette valeur n'existe pas encore, la valeur utilisee sera $cs_variables['toto']['defaut']
438 // attention de bien declarer les variables a l'aide de add_variable()
439 function cs_parse_code_js($code) {
440 global $metas_vars, $cs_variables;
441 while(preg_match(',%%([a-zA-Z_][a-zA-Z0-9_]*)%%,U', $code, $matches)) {
442 // la valeur de la variable n'est stockee dans les metas qu'au premier post
443 if (isset($metas_vars[$matches[1]])) {
444 $rempl = $metas_vars[$matches[1]];
445 } else {
446 // tant que le webmestre n'a pas poste, on prend la valeur (dynamique) par defaut
447 $rempl = cs_get_defaut($matches[1]);
448 }
449 $code = str_replace($matches[0], $rempl, $code);
450 }
451 return cs_optimise_js($code);
452 }
453
454 // attention : optimisation tres sommaire, pour codes simples !
455 // -> optimise les if(0), if(1), if(false), if(true)
456 function cs_optimise_js($code) {
457 $code = preg_replace(',if\s*\(\s*([^)]*\s*)\)\s*{\s*,imsS', 'if(\\1){', $code);
458 $code = str_replace('if(false){', 'if(0){', $code);
459 $code = str_replace('if(true){', 'if(1){', $code);
460 if (preg_match(',if\(([0-9])\){(.*)$,msS', $code, $regs)) {
461 $temp = $regs[2]; $ouvre = $ferme = -1; $nbouvre = 1;
462 do {
463 if ($ouvre===false) $min = $ferme + 1; else $min = min($ouvre, $ferme) + 1;
464 $ouvre=strpos($temp, '{', $min);
465 $ferme=strpos($temp, '}', $min);
466 if($ferme!==false) { if($ouvre!==false && $ouvre<$ferme) $nbouvre++; else $nbouvre--; }
467 } while($ferme!==false && $nbouvre>0);
468 if($ferme===false) return "/* Erreur sur les accolades : \{$regs[2] */";
469 $temp = substr($temp, 0, $ferme);
470 $rempl = "if($regs[1])\{$temp}";
471 if(intval($regs[1])) $code = str_replace($rempl, "/* optimisation : 'if($regs[1])' */ $temp", $code);
472 else $code = str_replace($rempl, "/* optimisation : 'if($regs[1]) {$temp}' */", $code);
473 }
474 return $code;
475 }
476
477
478 // lance la fonction d'installation de chaque outil actif, si elle existe.
479 // la fonction doit etre ecrite sous la forme monoutil_installe() et placee
480 // dans le fichier outils/monoutil.php
481 function cs_installe_outils() {
482 global $metas_outils;
483 foreach($metas_outils as $nom=>$o) if($o['actif']) {
484 include_spip('outils/'.$nom);
485 if (function_exists($f = $nom.'_installe')) {
486 $f();
487 cs_log(" -- $f() : OK !");
488 }
489 }
490 ecrire_metas();
491 }
492
493 ?>