[SPIP] ~maj v2.1.25-->2.1.26
[velocampus/web/www.git] / www / plugins / auto / couteau_suisse / couteau_suisse / inc / description_outil.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 if(!defined("_ECRIRE_INC_VERSION")) return;
9
10 include_spip('inc/actions');
11 include_spip('inc/texte');
12 include_spip('inc/layer');
13 include_spip('inc/presentation');
14 include_spip('inc/message_select');
15
16 define('_VAR_OUTIL', '@@CS_VAR_OUTIL@@');
17
18 function cs_ajax_outil_greffe($idom, $corps) {
19 // en fait, ajax uniquement si une modif est demandee...
20 return _request('modif')=='oui'
21 ?'<div class="cs_modif_ok">&gt;&nbsp;'._T('couteauprive:vars_modifiees')."&nbsp;&lt;</div>$corps"
22 :"\n<div id='$idom'>$corps\n</div>\n";
23 }
24
25 // initialise une variable et ne retourne rien si !$modif
26 // sinon, cette fonction retourne le code html qu'il faut pour fabriquer le formulaire de l'outil proprietaire
27 function description_outil_une_variable($index, &$outil, &$variable, &$label, &$modif) {
28 global $cs_variables, $metas_vars;
29 $actif = $outil['actif'];
30 // la valeur de la variable n'est stockee dans les metas qu'au premier post
31 $valeur = isset($metas_vars[$variable])?$metas_vars[$variable]:cs_get_defaut($variable);
32 $valeur = cs_retire_guillemets($valeur);
33 //cs_log(" -- description_outil_une_variable($index) - Traite %$variable% = $valeur");
34 $cs_variable = &$cs_variables[$variable];
35 // autorisations de variables
36 include_spip('inc/autoriser');
37 $cs_variable['disabled'] = $disab
38 = autoriser('configurer', 'variable', 0, NULL, array('nom'=>$cs_variable['nom'], 'outil'=>$outil))?'':' disabled="disabled"';
39 // si ce n'est qu'une simple initialisation, on sort
40 if(!$modif) return '';
41 $nombre = @$cs_variable['format']==_format_NOMBRE;
42 // calcul du commentaire
43 if($actif && isset($cs_variable['commentaire'])) {
44 eval('$comment = '.str_replace('%s',cs_php_format($valeur, !$nombre),$cs_variable['commentaire']).';');
45 if($comment) $comment = "<p>$comment</p>";
46 } else $comment = '';
47 // si la variable necessite des boutons radio
48 if(is_array($radios = &$cs_variable['radio'])) {
49 if(!$actif) {
50 $code = _T($radios[$valeur]);
51 return "<input type=\"hidden\" name=\"$variable\" class=\"cs_hidden_checkbox\" value=\"$code\" />"
52 . $label . (strlen($valeur)?ucfirst($code):'&nbsp;-');
53 }
54 $res = "$label <ul>";
55 $i = 0; $nb = isset($cs_variable['radio/ligne'])?intval($cs_variable['radio/ligne']):0;
56 foreach($radios as $code=>$traduc) {
57 $br = (($nb>0) && ( ++$i % $nb == 0))?'</ul><ul>':'';
58 $res .=
59 "<li><label><input id=\"label_{$variable}_$code\" class=\"cs_input_checkbox\" type=\"radio\""
60 .($valeur==$code?' checked="checked"':'')." value=\"$code\" name=\"$variable\"$disab />"
61 .($valeur==$code?'<b>':'')._T($traduc).($valeur==$code?'</b>':'')
62 ."</label></li>$br";
63 }
64 return $res.'</ul>'.$comment._VAR_OUTIL;
65 }
66 // si la variable necessite un select
67 elseif(is_array($select = &$cs_variable['select'])) {
68 if(!$actif) {
69 $code = _T($select[$valeur]);
70 return "<input type=\"hidden\" name=\"$variable\" class=\"cs_hidden_checkbox\" value=\"$code\" />"
71 . $label . (strlen($valeur)?ucfirst($code):'&nbsp;-');
72 }
73 $res = "$label <select name=\"$variable\"$disab>";
74 foreach($select as $code=>$traduc) {
75 $res .= "<option"
76 .($valeur==$code?' selected="selected"':'')." value=\"$code\">"
77 ._T($traduc)."</option>";
78 }
79 return $res.'</select>'.$comment._VAR_OUTIL;
80 }
81 // ... ou une case a cocher
82 elseif(isset($cs_variable['check'])) {
83 if(!$actif)
84 return $label._T($cs_variable['check'])._T($valeur?'couteauprive:2pts_oui':'couteauprive:2pts_non');
85 return $label.'<label><input type="checkbox" '.($valeur?' checked="checked"':'')." value=\"1\" name=\"$variable\" $disab/>"
86 .($valeur?'<b>':'')._T($cs_variable['check']).($valeur?'</b>':'').'</label>'
87 . $comment._VAR_OUTIL;
88 }
89 // ... ou un textarea ... ou une case input
90 if(!$actif)
91 return $label.'<html>'.(strlen($valeur)?nl2br(echapper_tags($valeur)):'&nbsp;'._T('couteauprive:variable_vide')).'</html>';
92 $len = $nombre?6:0;
93 $width = $len?'':'style="width:98.8%;" ';
94 $lignes = !isset($cs_variable['lignes']) || $nombre?0:strval($cs_variable['lignes']);
95 return $label .
96 ( $lignes < 2
97 // <html></html> empechera SPIP de modifier le contenu des <input> ou <textarea>
98 ?"<html><input name='$variable' value=\""
99 . htmlspecialchars($valeur) . "\" type='text' size='$len' $width $disab/></html>"
100 :"<html><textarea rows='$lignes' name='$variable' $width$disab>"
101 . htmlspecialchars($valeur) . '</textarea></html>'
102 ) . $comment._VAR_OUTIL;
103 }
104
105 // callback sur les labels de zones input ; format : [[label->qq chose]]
106 // regexpr : ,\[\[([^][]*)->([^]]*)\]\],msS
107 function description_outil_input1_callback($matches) {
108 // pas de label : [[->qq chose]]
109 if(!strlen($matches[1])) return "<fieldset><div>$matches[2]</div></fieldset>";
110 // retour a la ligne : [[-->qq chose]]
111 if($matches[1]=='-') return "<fieldset> <div>$matches[2]</div></fieldset>";
112 // format complet : [[label->qq chose]]
113 return "<fieldset><legend>$matches[1]</legend><div>$matches[2]</div></fieldset>";
114 }
115
116 // callback sur les labels de zones input en utilisant _T('couteauprive:label:variable') ; format [[qq chose %variable% qq chose]]
117 // regexpr : ,\[\[((.*?)%([a-zA-Z_][a-zA-Z0-9_]*)%(.*?))\]\],msS
118 // ici, renseignement de la globale $cs_input_variable
119 function description_outil_input2_callback($matches) {
120 global $cs_input_variable;
121 $cs_input_variable[] = $matches[3];
122 return "<fieldset><legend><:label:$matches[3]:></legend><div>$matches[1]</div></fieldset>";
123 }
124
125 function description_outil_liens_callback($matches) {
126 global $outils;
127 $nom = isset($outils[$matches[1]]['nom'])?$outils[$matches[1]]['nom']:couteauprive_T($matches[1].':nom');
128 if(strpos($nom, '<:')!==false) $nom = preg_replace(',<:([:a-z0-9_-]+):>,ie', '_T("$1")', $nom);
129 return '<a href="'.generer_url_ecrire('admin_couteau_suisse', 'cmd=descrip&outil='.$matches[1])
130 ."\" id=\"href_$matches[1]\" onclick=\"javascript:return cs_href_click(this);\">$nom</a>";
131 }
132
133 function description_outil_label_callback($matches) {
134 global $cs_variables;
135 return isset($cs_variables[$matches[1]]['label'])?$cs_variables[$matches[1]]['label']:_T('couteauprive:label:'.$matches[1]);
136 }
137
138 function cs_input_variable_callback($matches) {
139 $a = ' valeur_'.$matches[1].'_';
140 $tmp = str_replace('/',$a, $matches[3]);
141 return "<div class='groupe_{$matches[1]} $a$tmp'>";
142 }
143
144 // remplacement des liens vers un autre outil
145 function description_outil_liens($res) {
146 return strpos($res,'[.->')===false?$res
147 :preg_replace_callback(',\[\.->([a-zA-Z_][a-zA-Z0-9_-]*)\],', 'description_outil_liens_callback', $res);
148 }
149
150 // renvoie la description de $outil_ : toutes les %variables% ont ete remplacees par le code adequat
151 function inc_description_outil_dist($outil_, $url_self, $modif=false) {
152 global $outils, $cs_variables, $metas_vars;
153 $outil = &$outils[$outil_];
154 $actif = $outil['actif'];
155 $index = $outil['index'];
156 //cs_log("inc_description_outil_dist() - Parse la description de '$outil_'");
157 // la description de base est a priori dans le fichier de langue
158 $descrip = isset($outil['description'])?$outil['description']:couteauprive_T($outil['id'].':description');
159 // ajout des variables liees a la barre typo
160 if(defined('_DIR_PLUGIN_PORTE_PLUME')
161 && ( isset($outil['pipeline:porte_plume_barre_pre_charger']) || isset($outil['pipeline:porte_plume_cs_pre_charger'])
162 || isset($outil['pipelinecode:porte_plume_barre_pre_charger']) || isset($outil['pipelinecode:porte_plume_cs_pre_charger']))
163 && count($barres = cs_pp_liste_barres())) {
164 $descrip .= "\n\n@puce@ "._T('couteauprive:barres_typo_intro');
165 $i=0;
166 foreach($barres as $f=>$b) {
167 $nom = "pp_{$b}_$outil[id]";
168 $descrip .= ($i?'[[->':'[[')."%$nom%]]";
169 add_variable( array(
170 'nom' => $nom,
171 'check' => ($b=='edition' || $b=='forum')?'couteauprive:barres_typo_'.$b:$f,
172 'defaut' => 1, // par defaut les boutons seront toujours inseres
173 'label' => $i++?NULL:'@_CS_CHOIX@',
174 ));
175 }
176 }
177 if (strpos($descrip, '<:')!==false) {
178 if(!isset($outil['perso']))
179 // lames natives : reconstitution d'une description eventuellement morcelee
180 // exemple : <:mon_outil:3:> est remplace par _T('couteauprive:mon_outil:description3')
181 $descrip = preg_replace_callback(',<:([a-z_][a-z0-9_-]*):([0-9]*):>,i',
182 create_function('$m','return _T("couteauprive:$m[1]:description$m[2]");'), $descrip);
183 // chaines de langue personnalisees
184 $descrip = preg_replace(',<:([:a-z0-9_-]+):>,ie', '_T("$1")', $descrip);
185 }
186 // envoi de la description en pipeline
187 # list(,$descrip) = pipeline('init_description_outil', array($outil_, $descrip));
188 // globale pour la callback description_outil_input2_callback
189 global $cs_input_variable; $cs_input_variable = array();
190 // remplacement des zones input de format [[label->qq chose]]
191 $descrip = preg_replace_callback(',\[\[([^][]*)->([^]]*)\]\],msS', 'description_outil_input1_callback' , $descrip);
192 // remplacement des zones input de format [[qq chose %variable% qq chose]] en utilisant _T('couteauprive:label:variable') comme label
193 // la fonction description_outil_input2_callback renseigne la globale $cs_input_variable
194 $descrip = preg_replace_callback(',\[\[((.*?)%([a-zA-Z_][a-zA-Z0-9_]*)%(.*?))\]\],msS', 'description_outil_input2_callback', $descrip);
195
196 // initialisation et remplacement des variables de format : %variable%
197 $t = preg_split(',%([a-zA-Z_][a-zA-Z0-9_]*)%,', $descrip, -1, PREG_SPLIT_DELIM_CAPTURE);
198 $res = '';
199 $nb_disabled = $nb_variables = 0; $variables = array();
200 for($i=0;$i<count($t);$i+=2) if(isset($t[$i+1]) && strlen($var=trim($t[$i+1]))) {
201 // si la variable est presente on fabrique le input
202 if(isset($cs_variables[$var])) {
203 $res .= description_outil_une_variable(
204 $index + (++$nb_variables),
205 $outil, $var,
206 $t[$i], $modif);
207 $variables[] = $var;
208 if($cs_variables[$var]['disabled']) ++$nb_disabled;
209 } else {
210 // probleme a regler dans config_outils.php !
211 $temp = $t[$i]."[$var?]"; $res .= $temp;
212 }
213 } else
214 $res .= $t[$i];
215 $outil['variables'] = $variables;
216 $outil['nb_variables'] = $nb_variables;
217 $outil['nb_disabled'] = $nb_disabled;
218
219 // si ce n'est qu'une simple initialisation, on sort
220 if(!$modif) {unset($cs_input_variable); return;}
221
222 // information sur les raccourcis disponibles
223 if($a=cs_aide_raccourci($outil_)) $res .= '<p>@puce@ '._T('couteauprive:detail_raccourcis').'<br /><html>'.$a.'.</html></p>';
224 // envoi de la description courante en pipeline
225 include_spip("cout_define");
226 $res = pipeline('pre_description_outil', array('outil'=>$outil_, 'texte'=>$res, 'actif'=>$actif));
227 $res = $res['texte'];
228 // recherche des blocs <variable></variable> eventuels associes pour du masquage/demasquage
229 foreach($cs_input_variable as $v) {
230 $res = preg_replace_callback(",<($v)\s+valeur=(['\"])(.*?)\\2\s*>,", 'cs_input_variable_callback', $res);
231 $res = str_replace("</$v>", '</div>', $res);
232 }
233 unset($cs_input_variable);
234 // bouton 'Modifier' : en dessous du texte s'il y a plusieurs variables, a la place de _VAR_OUTIL s'il n'y en a qu'une.
235 // attention : on ne peut pas modifier les variables si l'outil est inactif
236 if($actif) {
237 $bouton = "<input type='submit' class='fondo' style='margin-left:1em;' value=\"".($nb_variables>1?_T('couteauprive:modifier_vars_0'):_T('bouton_modifier'))."\" />";
238 if($nb_variables>1) $res .= "<div class=\"cs_bouton\">$bouton</div>";
239 else $res = str_replace(_VAR_OUTIL, $bouton, $res);
240 }
241 $res = "\n<div id='cs_inner_outil-$index' >" . str_replace(array('<ul></ul>',_VAR_OUTIL),'',$res) . '</div>';
242 // si des variables sont trouvees ?
243 if($nb_variables) {
244 $variables = urlencode(serialize($variables));
245 // syntaxe : ajax_action_auteur($action, $id, $script, $args='', $corps=false, $args_ajax='', $fct_ajax='')
246 $res = ajax_action_auteur('description_outil', $index, $url_self, "modif=oui&cmd=descrip&outil={$outil['id']}",
247 "\n<input type='hidden' value='$variables' name='variables' /><input type='hidden' value='$outil_' name='outil' />" . $res);
248 }
249 //cs_log(" FIN : inc_description_outil_dist({$outil['id']}) - {$outil['nb_variables']} variables(s) trouvee(s)");
250 // remplacement en deux passes des labels en doublon
251 for($i=0;$i<2;$i++) if(strpos($res,'<:label:')!==false)
252 $res = preg_replace_callback(',<:label:([a-zA-Z_][a-zA-Z0-9_-]*):>,', 'description_outil_label_callback', $res);
253 // remplacement des blocs avec style. ex : <q2>bla bla</q2>
254 $res = preg_replace(',</q(\d)>,','</div>', preg_replace(',<q(\d)>,','<div class="q$1">', $res));
255 // remplacement des inputs successifs sans label : [[%var1%]][[->%var2%]] ou [[%var1%]][[-->%var2%]]
256 $res = preg_replace(',(<br />)?</fieldset><fieldset>( ?<div>),', '$2', $res);
257 // remplacement de diverses constantes
258 $res = str_replace(array('@puce@', '@_CS_CHOIX@','@_CS_ASTER@','@_CS_PLUGIN_JQUERY192@'),
259 array(definir_puce(), _T('couteauprive:votre_choix'), '<sup>(*)</sup>', defined('_SPIP19300')?'':_T('couteauprive:detail_jquery3')), $res);
260 // remplacement des constantes qui restent de forme @_CS_XXXX@
261 if(strpos($res,'@_CS')!==false)
262 $res = preg_replace_callback(',@(_CS_[a-zA-Z0-9_]+)@,',
263 create_function('$matches','return defined($matches[1])?constant($matches[1]):(\' (\'._T(\'couteauprive:outil_inactif\').\')\');'), $res);
264 // remplacement des liens vers un autre outil
265 $res = description_outil_liens($res);
266
267 // envoi de la description finale en pipeline
268 # list(,$res) = pipeline('post_description_outil', array($outil_, $res));
269 return cs_ajax_outil_greffe("description_outil-$index", $res);
270 }
271 ?>