--- /dev/null
+<?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">> '._T('couteauprive:vars_modifiees')." <</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):' -');
+ }
+ $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):' -');
+ }
+ $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)):' '._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