3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
6 * Copyright (c) 2001-2014 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
13 if (!defined('_ECRIRE_INC_VERSION')) return;
14 include_spip('inc/charsets');
15 include_spip('inc/texte');
16 include_spip('inc/plugin'); // pour plugin_est_installe
18 // http://doc.spip.org/@ligne_plug
19 function plugins_afficher_plugin_dist($url_page, $plug_file, $checked, $actif, $expose=false, $class_li="item", $dir_plugins=_DIR_PLUGINS
) {
22 static $versions = array();
24 $force_reload = (_request('var_mode')=='recalcul');
25 $get_infos = charger_fonction('get_infos','plugins');
26 $info = $get_infos($plug_file, $force_reload, $dir_plugins);
27 $prefix = $info['prefix'];
29 $checkable = ($dir_plugins!==_DIR_PLUGINS_DIST
);
30 $nom = plugin_nom($info,$dir_plugins,$plug_file);
32 if (!plugin_version_compatible($info['compatibilite'], $GLOBALS['spip_version_branche'],'spip')){
33 $info['slogan'] = _T('plugin_info_non_compatible_spip');
34 $erreur = http_img_pack("plugin-dis-32.png",_T('plugin_info_non_compatible_spip')," class='picto_err'",_T('plugin_info_non_compatible_spip'));
35 $class_li .= " disabled";
38 elseif (isset($info['erreur'])) {
39 $class_li .= " error";
40 $erreur = http_img_pack("plugin-err-32.png",_T('plugin_info_erreur_xml')," class='picto_err'",_T('plugin_info_erreur_xml'))
41 . "<div class='erreur'>" . join('<br >', $info['erreur']) . "</div>";
44 elseif (isset($GLOBALS['erreurs_activation_raw'][$dir_plugins.$plug_file])){
45 $class_li .= " error";
46 $erreur = http_img_pack("plugin-err-32.png",_T('plugin_impossible_activer', array('plugin' => $nom))," class='picto_err'",_T('plugin_impossible_activer', array('plugin' => $nom)))
47 . "<div class='erreur'>" . implode("<br />",$GLOBALS['erreurs_activation_raw'][$dir_plugins.$plug_file]) . "</div>";
50 $cfg = $actif ?
plugin_bouton_config($plug_file,$info,$dir_plugins) : "";
52 // numerotons les occurrences d'un meme prefix
53 $versions[$prefix] = $id = isset($versions[$prefix]) ?
$versions[$prefix] +
1 : '';
55 $class_li .= ($actif?
" actif":"") . ($expose?
" on":"");
56 return "<li id='$prefix$id' class='$class_li'>"
57 . ((!$checkable AND !$checked)
58 ?
'': plugin_checkbox(++
$id_input, $dir_plugins.$plug_file, $checked))
59 . plugin_resume($info, $dir_plugins, $plug_file, $url_page)
62 . (($dir_plugins!==_DIR_PLUGINS_DIST
AND plugin_est_installe($plug_file))
63 ?
plugin_desintalle($plug_file,$nom,$dir_plugins) : '')
64 . "<div class='details'>" // pour l'ajax de exec/info_plugin
65 . (!$expose ?
'' : affiche_bloc_plugin($plug_file, $info, $dir_plugins))
70 function plugin_bouton_config($nom, $infos, $dir)
72 // la verification se base sur le filesystem
73 // il faut donc n'utiliser que des minuscules, par convention
74 $prefix = strtolower($infos['prefix']);
75 // si plugin.xml fournit un squelette, le prendre
77 return recuperer_fond("$dir$nom/" . $infos['config'],
78 array('script' => 'configurer_' . $prefix,
81 // si le plugin CFG est la, l'essayer
82 if (defined('_DIR_PLUGIN_CFG')) {
83 if (include_spip('inc/cfg')) // test CFG version >= 1.0.5
84 if ($cfg = icone_lien_cfg("$dir$nom", "cfg"))
85 return "<div class='cfg_link'>$cfg</div>";
88 // sinon prendre le squelette std sur le nom std
89 return recuperer_fond("prive/squelettes/inclure/cfg",
90 array('script' => 'configurer_' . $prefix,
94 // checkbox pour activer ou desactiver
95 // si ce n'est pas une extension
97 function plugin_checkbox($id_input, $file, $actif)
99 $name = substr(md5($file),0,16);
101 return "<div class='check'>\n"
102 . "<input type='checkbox' name='s$name' id='label_$id_input'"
103 . ($actif?
" checked='checked'":"")
104 . " class='checkbox' value='O' />"
105 . "\n<label for='label_$id_input'>"._T('activer_plugin')."</label>"
109 function plugin_nom($info, $dir_plugins, $plug_file){
110 $prefix = $info['prefix'];
111 $dir = "$dir_plugins$plug_file";
112 // Si dtd paquet, on traite le nom soit par son item de langue soit par sa valeur immediate a l'index "nom"
113 if ($info['dtd'] == "paquet") {
114 $nom = PtoBR(plugin_propre("{$prefix}_nom", "$dir/lang/paquet-$prefix"));
116 $nom = PtoBR(propre($info['nom']));
119 $nom = typo(attribut_html($info['nom']));
125 function plugin_resume($info, $dir_plugins, $plug_file, $url_page){
126 $prefix = $info['prefix'];
127 $dir = "$dir_plugins$plug_file";
128 $slogan = PtoBR(plugin_propre($info['slogan'], "$dir/lang/paquet-$prefix"));
129 // une seule ligne dans le slogan : couper si besoin
130 if (($p=strpos($slogan, "<br />"))!==FALSE)
131 $slogan = substr($slogan, 0,$p);
132 // couper par securite
133 $slogan = couper($slogan, 80);
135 $nom = plugin_nom($info, $dir_plugins, $plug_file);
137 $url = parametre_url($url_page, "plugin", substr($dir,strlen(_DIR_RACINE
)));
139 if (isset($info['logo']) and $i = trim($info['logo'])) {
140 include_spip("inc/filtres_images_mini");
141 $i = inserer_attribut(image_reduire("$dir/$i", 32),'alt','');
142 $i = "<div class='icon'><a href='$url' rel='info'>$i</a></div>";
145 return "<div class='resume'>"
146 . "<h3><a href='$url' rel='info'>"
149 . " <span class='version'>".$info['version']."</span>"
150 . " <span class='etat'> - "
151 . plugin_etat_en_clair($info['etat'])
153 . "<div class='short'>".$slogan."</div>"
158 function plugin_desintalle($plug_file, $nom, $dir_plugins=null){
160 $dir_plugins = _DIR_PLUGINS
;
162 $action = redirige_action_auteur('desinstaller_plugin',"$dir_plugins::$plug_file",'admin_plugin');
163 $text = _T('bouton_desinstaller');
164 $text2 = _T('info_desinstaller_plugin');
165 $file = basename($plug_file);
167 return "<div class='actions'>[".
169 onclick='return confirm(\"$text $nom ?\\n$text2\")'>"
174 function plugin_etat_en_clair($etat){
175 if (!in_array($etat,array('stable','test','experimental')))
176 $etat = 'developpement';
177 return _T('plugin_etat_'.$etat);
180 // http://doc.spip.org/@plugin_propre
181 function plugin_propre($texte, $module='') {
182 // retirer le retour a la racine du module, car le find_in_path se fait depuis la racine
183 if (_DIR_RACINE
AND strncmp($module,_DIR_RACINE
,strlen(_DIR_RACINE
))==0)
184 $module = substr($module,strlen(_DIR_RACINE
));
185 if (preg_match("|^\w+_[\w_]+$|", $texte)) {
186 $texte = _T(($module ?
"$module:" : '') . $texte, array(), array('force' => false));
188 return propre($texte);
193 // http://doc.spip.org/@affiche_bloc_plugin
194 function affiche_bloc_plugin($plug_file, $info, $dir_plugins=null) {
196 $dir_plugins = _DIR_PLUGINS
;
198 $prefix = $info['prefix'];
199 $dir = "$dir_plugins$plug_file/lang/paquet-$prefix";
202 // TODO: le traiter_multi ici n'est pas beau
203 // cf. description du plugin/_stable_/ortho/plugin.xml
205 if (isset($info['description']))
206 $description = plugin_propre($info['description'], $dir);
208 if (isset($info['documentation'])
209 AND $lien = $info['documentation']){
210 $description .= "<p><em class='site'><a href='$lien' class='spip_out'>" . _T('en_savoir_plus') .'</a></em></p>';
212 $s .= "<dd class='desc'>".$description."</dd>\n";
214 if (isset($info['auteur'])){
215 if (is_array($info['auteur']))
216 $a = formater_credits($info['auteur'], ', ');
217 // pour compat mais ne doit plus arriver
219 $a = trim($info['auteur']);
221 $s .= "<dt class='auteurs'>" . _T('public:par_auteur') ."</dt><dd class='auteurs'>". PtoBR(propre($a, $dir)) . "</dd>\n";
224 if (isset($info['credit'])){
225 if ($a = formater_credits($info['credit'], ', '))
226 $s .= "<dt class='credits'>" . _T('plugin_info_credit') ."</dt><dd class='credits'>". PtoBR(propre($a, $dir)) . "</dd>\n";
229 if (isset($info['licence'])) {
230 if (is_array($info['licence']))
231 $a = formater_credits($info['licence'], ', ');
232 // pour compat mais ne doit plus arriver
234 $a = trim($info['licence']);
236 $s .= "<dt class='licence'>" . _T('intitule_licence') ."</dt><dd class='licence'>". PtoBR(propre($a, $dir)) . "</dd>\n";
239 $s = "<dl class='description'>$s</dl>";
242 // Ajouter les infos techniques
246 $version = "<dt>"._T('version')."</dt><dd>".$info['version'];
248 if ($svn_revision = version_svn_courante($dir_plugins.$plug_file))
249 $version .= ($svn_revision<0 ?
' SVN':'').' ['.abs($svn_revision).']';
251 $infotech[] = $version;
252 $infotech[] = "<dt>"._T('repertoire_plugins')."</dt><dd>".joli_repertoire("$dir_plugins$plug_file")."</dd>";
253 // source zip le cas echeant
254 $infotech[] = (lire_fichier($dir_plugins.$plug_file.'/install.log', $log)
255 AND preg_match(',^source:(.*)$,m', $log, $r))
256 ?
'<dt>'._T('plugin_source').'</dt><dd>'.trim($r[1])."</dd>"
259 $infotech[] = !$info['necessite'] ?
'' :
260 ('<dt>' . _T('plugin_info_necessite') . '</dt><dd>' . join(' ', array_map('array_shift', $info['necessite'])) . '</dd>');
262 $s .= "<dl class='tech'>"
263 . join('', $infotech)
270 function formater_credits($infos, $sep=', ') {
273 foreach ($infos as $_credit) {
276 // Si le credit en cours n'est pas un array c'est donc un copyright
278 (!is_array($_credit))
279 ?
PtoBR(propre($_credit))
280 : ($_credit['url'] ?
'<a href="' . $_credit['url'] . '">' : '') .
282 ($_credit['url'] ?
'</a>' : '');