Commit | Line | Data |
---|---|---|
c495c100 P |
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;">• ' . $f() . '</li>'; | |
190 | elseif (!preg_match(',:aide$,', _T("couteauprive:$id:aide") )) | |
191 | $aide[] = '<li style="margin: 0.7em 0 0 0;">• ' . _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 | ?> |