[SPIP] +2.1.12
[velocampus/web/www.git] / www / plugins / auto / couteau_suisse / couteau_suisse / inc / description_outil.php
diff --git a/www/plugins/auto/couteau_suisse/couteau_suisse/inc/description_outil.php b/www/plugins/auto/couteau_suisse/couteau_suisse/inc/description_outil.php
new file mode 100644 (file)
index 0000000..270f4ca
--- /dev/null
@@ -0,0 +1,271 @@
+<?php
+#-----------------------------------------------------#
+#  Plugin  : Couteau Suisse - Licence : GPL           #
+#  Auteur  : Patrice Vanneufville, 2006               #
+#  Contact : patrice¡.!vanneufville¡@!laposte¡.!net   #
+#  Infos : http://www.spip-contrib.net/?article2166   #
+#-----------------------------------------------------#
+if(!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip('inc/actions');
+include_spip('inc/texte');
+include_spip('inc/layer');
+include_spip('inc/presentation');
+include_spip('inc/message_select');
+
+define('_VAR_OUTIL', '@@CS_VAR_OUTIL@@');
+
+function cs_ajax_outil_greffe($idom, $corps)   {
+       // en fait, ajax uniquement si une modif est demandee...
+       return _request('modif')=='oui'
+               ?'<div class="cs_modif_ok">&gt;&nbsp;'._T('couteauprive:vars_modifiees')."&nbsp;&lt;</div>$corps"
+               :"\n<div id='$idom'>$corps\n</div>\n";
+}
+
+// initialise une variable et ne retourne rien si !$modif
+// sinon, cette fonction retourne le code html qu'il faut pour fabriquer le formulaire de l'outil proprietaire
+function description_outil_une_variable($index, &$outil, &$variable, &$label, &$modif) {
+       global $cs_variables, $metas_vars;
+       $actif = $outil['actif'];
+       // la valeur de la variable n'est stockee dans les metas qu'au premier post
+       $valeur = isset($metas_vars[$variable])?$metas_vars[$variable]:cs_get_defaut($variable);
+       $valeur = cs_retire_guillemets($valeur);
+//cs_log(" -- description_outil_une_variable($index) - Traite %$variable% = $valeur");
+       $cs_variable = &$cs_variables[$variable];
+       // autorisations de variables
+       include_spip('inc/autoriser');
+       $cs_variable['disabled'] = $disab 
+               = autoriser('configurer', 'variable', 0, NULL, array('nom'=>$cs_variable['nom'], 'outil'=>$outil))?'':' disabled="disabled"';
+       // si ce n'est qu'une simple initialisation, on sort
+       if(!$modif) return '';
+       $nombre = @$cs_variable['format']==_format_NOMBRE;
+       // calcul du commentaire
+       if($actif && isset($cs_variable['commentaire'])) {
+               eval('$comment = '.str_replace('%s',cs_php_format($valeur, !$nombre),$cs_variable['commentaire']).';');
+               if($comment) $comment = "<p>$comment</p>";
+       } else $comment = '';
+       // si la variable necessite des boutons radio
+       if(is_array($radios = &$cs_variable['radio'])) {
+               if(!$actif) {
+                       $code = _T($radios[$valeur]);
+                       return "<input type=\"hidden\" name=\"$variable\" class=\"cs_hidden_checkbox\" value=\"$code\" />"
+                               . $label . (strlen($valeur)?ucfirst($code):'&nbsp;-');
+               }
+               $res = "$label <ul>";
+               $i = 0; $nb = isset($cs_variable['radio/ligne'])?intval($cs_variable['radio/ligne']):0;
+               foreach($radios as $code=>$traduc) {
+                       $br = (($nb>0) && ( ++$i % $nb == 0))?'</ul><ul>':''; 
+                       $res .=
+                               "<li><label><input id=\"label_{$variable}_$code\" class=\"cs_input_checkbox\" type=\"radio\""
+                               .($valeur==$code?' checked="checked"':'')." value=\"$code\" name=\"$variable\"$disab />"
+                               .($valeur==$code?'<b>':'')._T($traduc).($valeur==$code?'</b>':'')
+                               ."</label></li>$br";
+               }
+               return $res.'</ul>'.$comment._VAR_OUTIL;
+       }
+       // si la variable necessite un select
+       elseif(is_array($select = &$cs_variable['select'])) {
+               if(!$actif) {
+                       $code = _T($select[$valeur]);
+                       return "<input type=\"hidden\" name=\"$variable\" class=\"cs_hidden_checkbox\" value=\"$code\" />"
+                               . $label . (strlen($valeur)?ucfirst($code):'&nbsp;-');
+               }
+               $res = "$label <select name=\"$variable\"$disab>";
+               foreach($select as $code=>$traduc) {
+                       $res .= "<option"
+                               .($valeur==$code?' selected="selected"':'')." value=\"$code\">"
+                               ._T($traduc)."</option>";
+               }
+               return $res.'</select>'.$comment._VAR_OUTIL;
+       }
+       // ... ou une case a cocher
+       elseif(isset($cs_variable['check'])) {
+               if(!$actif)
+                       return $label._T($cs_variable['check'])._T($valeur?'couteauprive:2pts_oui':'couteauprive:2pts_non');
+               return $label.'<label><input type="checkbox" '.($valeur?' checked="checked"':'')." value=\"1\" name=\"$variable\" $disab/>"
+                       .($valeur?'<b>':'')._T($cs_variable['check']).($valeur?'</b>':'').'</label>'
+                       . $comment._VAR_OUTIL;
+       }
+       // ... ou un textarea ... ou une case input
+       if(!$actif)
+               return $label.'<html>'.(strlen($valeur)?nl2br(echapper_tags($valeur)):'&nbsp;'._T('couteauprive:variable_vide')).'</html>';
+       $len = $nombre?6:0;
+       $width = $len?'':'style="width:98.8%;" ';
+       $lignes = !isset($cs_variable['lignes']) || $nombre?0:strval($cs_variable['lignes']);
+       return $label .
+               ( $lignes < 2
+                       // <html></html> empechera SPIP de modifier le contenu des <input> ou <textarea>
+                       ?"<html><input name='$variable' value=\""
+                               . htmlspecialchars($valeur) . "\" type='text' size='$len' $width $disab/></html>"
+                       :"<html><textarea rows='$lignes' name='$variable' $width$disab>"
+                               . htmlspecialchars($valeur) . '</textarea></html>'
+               ) . $comment._VAR_OUTIL;
+}
+
+// callback sur les labels de zones input ; format : [[label->qq chose]]
+// regexpr : ,\[\[([^][]*)->([^]]*)\]\],msS
+function description_outil_input1_callback($matches) {
+       // pas de label : [[->qq chose]]
+       if(!strlen($matches[1])) return "<fieldset><div>$matches[2]</div></fieldset>";
+       // retour a la ligne : [[-->qq chose]]
+       if($matches[1]=='-') return "<fieldset> <div>$matches[2]</div></fieldset>";
+       // format complet : [[label->qq chose]]
+       return "<fieldset><legend>$matches[1]</legend><div>$matches[2]</div></fieldset>";
+}
+
+// callback sur les labels de zones input en utilisant _T('couteauprive:label:variable') ; format [[qq chose %variable% qq chose]]
+// regexpr : ,\[\[((.*?)%([a-zA-Z_][a-zA-Z0-9_]*)%(.*?))\]\],msS
+// ici, renseignement de la globale $cs_input_variable
+function description_outil_input2_callback($matches) {
+       global $cs_input_variable;
+       $cs_input_variable[] = $matches[3];
+       return "<fieldset><legend><:label:$matches[3]:></legend><div>$matches[1]</div></fieldset>";
+}
+
+function description_outil_liens_callback($matches) {
+       global $outils;
+       $nom = isset($outils[$matches[1]]['nom'])?$outils[$matches[1]]['nom']:couteauprive_T($matches[1].':nom');
+       if(strpos($nom, '<:')!==false) $nom = preg_replace(',<:([:a-z0-9_-]+):>,ie', '_T("$1")', $nom);
+       return '<a href="'.generer_url_ecrire('admin_couteau_suisse', 'cmd=descrip&outil='.$matches[1])
+               ."\" id=\"href_$matches[1]\" onclick=\"javascript:return cs_href_click(this);\">$nom</a>";
+}
+
+function description_outil_label_callback($matches) { 
+       global $cs_variables; 
+       return isset($cs_variables[$matches[1]]['label'])?$cs_variables[$matches[1]]['label']:_T('couteauprive:label:'.$matches[1]);
+}
+
+function cs_input_variable_callback($matches) {
+       $a = ' valeur_'.$matches[1].'_';
+       $tmp = str_replace('/',$a, $matches[3]);
+       return "<div class='groupe_{$matches[1]} $a$tmp'>";
+}
+
+// remplacement des liens vers un autre outil
+function description_outil_liens($res) {
+       return strpos($res,'[.->')===false?$res
+               :preg_replace_callback(',\[\.->([a-zA-Z_][a-zA-Z0-9_-]*)\],', 'description_outil_liens_callback', $res);
+}
+
+// renvoie la description de $outil_ : toutes les %variables% ont ete remplacees par le code adequat
+function inc_description_outil_dist($outil_, $url_self, $modif=false) {
+       global $outils, $cs_variables, $metas_vars;
+       $outil = &$outils[$outil_];
+       $actif = $outil['actif'];
+       $index = $outil['index'];
+//cs_log("inc_description_outil_dist() - Parse la description de '$outil_'");
+       // la description de base est a priori dans le fichier de langue
+       $descrip = isset($outil['description'])?$outil['description']:couteauprive_T($outil['id'].':description');
+       // ajout des variables liees a la barre typo
+       if(defined('_DIR_PLUGIN_PORTE_PLUME') 
+        && ( isset($outil['pipeline:porte_plume_barre_pre_charger']) || isset($outil['pipeline:porte_plume_cs_pre_charger'])
+               || isset($outil['pipelinecode:porte_plume_barre_pre_charger']) || isset($outil['pipelinecode:porte_plume_cs_pre_charger']))
+        && count($barres = cs_pp_liste_barres())) {
+               $descrip .= "\n\n@puce@ "._T('couteauprive:barres_typo_intro');
+               $i=0;
+               foreach($barres as $f=>$b) {
+                       $nom = "pp_{$b}_$outil[id]";
+                       $descrip .= ($i?'[[->':'[[')."%$nom%]]";
+                       add_variable( array(
+                               'nom' => $nom,
+                               'check' => ($b=='edition' || $b=='forum')?'couteauprive:barres_typo_'.$b:$f,
+                               'defaut' => 1, // par defaut les boutons seront toujours inseres
+                               'label' => $i++?NULL:'@_CS_CHOIX@',
+                       ));
+               }
+       }
+       if (strpos($descrip, '<:')!==false) {
+               if(!isset($outil['perso']))
+                       // lames natives : reconstitution d'une description eventuellement morcelee
+                       // exemple : <:mon_outil:3:> est remplace par _T('couteauprive:mon_outil:description3')
+                       $descrip = preg_replace_callback(',<:([a-z_][a-z0-9_-]*):([0-9]*):>,i', 
+                               create_function('$m','return _T("couteauprive:$m[1]:description$m[2]");'), $descrip);
+               // chaines de langue personnalisees
+               $descrip = preg_replace(',<:([:a-z0-9_-]+):>,ie', '_T("$1")', $descrip);
+       }
+       // envoi de la description en pipeline
+#      list(,$descrip) = pipeline('init_description_outil', array($outil_, $descrip));
+       // globale pour la callback description_outil_input2_callback
+       global $cs_input_variable;      $cs_input_variable = array();
+       // remplacement des zones input de format [[label->qq chose]]
+       $descrip = preg_replace_callback(',\[\[([^][]*)->([^]]*)\]\],msS', 'description_outil_input1_callback' , $descrip);
+       // remplacement des zones input de format [[qq chose %variable% qq chose]] en utilisant _T('couteauprive:label:variable') comme label
+       // la fonction description_outil_input2_callback renseigne la globale $cs_input_variable
+       $descrip = preg_replace_callback(',\[\[((.*?)%([a-zA-Z_][a-zA-Z0-9_]*)%(.*?))\]\],msS', 'description_outil_input2_callback', $descrip);
+
+       // initialisation et remplacement des variables de format : %variable%
+       $t = preg_split(',%([a-zA-Z_][a-zA-Z0-9_]*)%,', $descrip, -1, PREG_SPLIT_DELIM_CAPTURE);
+       $res = '';
+       $nb_disabled = $nb_variables = 0; $variables = array();
+       for($i=0;$i<count($t);$i+=2) if(isset($t[$i+1]) && strlen($var=trim($t[$i+1]))) {
+               // si la variable est presente on fabrique le input
+               if(isset($cs_variables[$var])) {
+                       $res .= description_outil_une_variable(
+                               $index + (++$nb_variables),
+                               $outil, $var,
+                               $t[$i], $modif);
+                       $variables[] = $var;
+                       if($cs_variables[$var]['disabled']) ++$nb_disabled;
+               } else {
+                       // probleme a regler dans config_outils.php !
+                       $temp = $t[$i]."[$var?]"; $res .= $temp;
+               }
+       } else 
+               $res .= $t[$i];
+       $outil['variables'] = $variables;
+       $outil['nb_variables'] = $nb_variables;
+       $outil['nb_disabled'] = $nb_disabled;
+
+       // si ce n'est qu'une simple initialisation, on sort
+       if(!$modif) {unset($cs_input_variable); return;}
+
+       // information sur les raccourcis disponibles
+       if($a=cs_aide_raccourci($outil_)) $res .= '<p>@puce@ '._T('couteauprive:detail_raccourcis').'<br /><html>'.$a.'.</html></p>';
+       // envoi de la description courante en pipeline
+       include_spip("cout_define");
+       $res = pipeline('pre_description_outil', array('outil'=>$outil_, 'texte'=>$res, 'actif'=>$actif));
+       $res = $res['texte'];
+       // recherche des blocs <variable></variable> eventuels associes pour du masquage/demasquage
+       foreach($cs_input_variable as $v) {
+               $res = preg_replace_callback(",<($v)\s+valeur=(['\"])(.*?)\\2\s*>,", 'cs_input_variable_callback', $res);
+               $res = str_replace("</$v>", '</div>', $res);
+       }
+       unset($cs_input_variable);
+       // 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.
+       // attention : on ne peut pas modifier les variables si l'outil est inactif
+       if($actif) {
+               $bouton = "<input type='submit' class='fondo' style='margin-left:1em;' value=\"".($nb_variables>1?_T('couteauprive:modifier_vars_0'):_T('bouton_modifier'))."\" />";
+               if($nb_variables>1) $res .= "<div class=\"cs_bouton\">$bouton</div>";
+                       else $res = str_replace(_VAR_OUTIL, $bouton, $res);
+       }
+       $res = "\n<div id='cs_inner_outil-$index' >" . str_replace(array('<ul></ul>',_VAR_OUTIL),'',$res) . '</div>';
+       // si des variables sont trouvees ?
+       if($nb_variables) {
+               $variables = urlencode(serialize($variables));
+               // syntaxe : ajax_action_auteur($action, $id, $script, $args='', $corps=false, $args_ajax='', $fct_ajax='')
+               $res = ajax_action_auteur('description_outil', $index, $url_self, "modif=oui&cmd=descrip&outil={$outil['id']}", 
+                       "\n<input type='hidden' value='$variables' name='variables' /><input type='hidden' value='$outil_' name='outil' />"     . $res);
+       }
+//cs_log(" FIN : inc_description_outil_dist({$outil['id']}) - {$outil['nb_variables']} variables(s) trouvee(s)");
+       // remplacement en deux passes des labels en doublon
+       for($i=0;$i<2;$i++) if(strpos($res,'<:label:')!==false) 
+               $res = preg_replace_callback(',<:label:([a-zA-Z_][a-zA-Z0-9_-]*):>,', 'description_outil_label_callback', $res);
+       // remplacement des blocs avec style. ex : <q2>bla bla</q2>
+       $res = preg_replace(',</q(\d)>,','</div>', preg_replace(',<q(\d)>,','<div class="q$1">', $res));
+       // remplacement des inputs successifs sans label : [[%var1%]][[->%var2%]] ou [[%var1%]][[-->%var2%]]
+       $res = preg_replace(',(<br />)?</fieldset><fieldset>( ?<div>),', '$2', $res);
+       // remplacement de diverses constantes
+       $res = str_replace(array('@puce@', '@_CS_CHOIX@','@_CS_ASTER@','@_CS_PLUGIN_JQUERY192@'),
+               array(definir_puce(), _T('couteauprive:votre_choix'), '<sup>(*)</sup>', defined('_SPIP19300')?'':_T('couteauprive:detail_jquery3')), $res);
+       // remplacement des constantes qui restent de forme @_CS_XXXX@
+       if(strpos($res,'@_CS')!==false) 
+               $res = preg_replace_callback(',@(_CS_[a-zA-Z0-9_]+)@,', 
+                       create_function('$matches','return defined($matches[1])?constant($matches[1]):(\' (\'._T(\'couteauprive:outil_inactif\').\')\');'), $res);
+       // remplacement des liens vers un autre outil
+       $res = description_outil_liens($res);
+
+       // envoi de la description finale en pipeline
+#      list(,$res) = pipeline('post_description_outil', array($outil_, $res));
+       return cs_ajax_outil_greffe("description_outil-$index", $res);
+}
+?>
\ No newline at end of file