[SPIP] ~maj 3.0.10 --> 3.0.14
[lhc/web/www.git] / www / ecrire / plugins / afficher_plugin.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2014 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
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 \***************************************************************************/
12
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
17
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) {
20
21 static $id_input = 0;
22 static $versions = array();
23
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'];
28 $cfg = "";
29 $checkable = ($dir_plugins!==_DIR_PLUGINS_DIST);
30 $nom = plugin_nom($info,$dir_plugins,$plug_file);
31
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";
36 $checkable = false;
37 }
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>";
42 $checkable = false;
43 }
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>";
48 }
49 else
50 $cfg = $actif ? plugin_bouton_config($plug_file,$info,$dir_plugins) : "";
51
52 // numerotons les occurrences d'un meme prefix
53 $versions[$prefix] = $id = isset($versions[$prefix]) ? $versions[$prefix] + 1 : '';
54
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)
60 . $cfg
61 . $erreur
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))
66 . "</div>"
67 ."</li>";
68 }
69
70 function plugin_bouton_config($nom, $infos, $dir)
71 {
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
76 if ($infos['config'])
77 return recuperer_fond("$dir$nom/" . $infos['config'],
78 array('script' => 'configurer_' . $prefix,
79 'nom' => $nom));
80
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>";
86 }
87
88 // sinon prendre le squelette std sur le nom std
89 return recuperer_fond("prive/squelettes/inclure/cfg",
90 array('script' => 'configurer_' . $prefix,
91 'nom' => $nom));
92 }
93
94 // checkbox pour activer ou desactiver
95 // si ce n'est pas une extension
96
97 function plugin_checkbox($id_input, $file, $actif)
98 {
99 $name = substr(md5($file),0,16);
100
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>"
106 . "</div>";
107 }
108
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"));
115 if (!$nom)
116 $nom = PtoBR(propre($info['nom']));
117 }
118 else
119 $nom = typo(attribut_html($info['nom']));
120
121 return trim($nom);
122 }
123
124 // Cartouche Resume
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);
134
135 $nom = plugin_nom($info, $dir_plugins, $plug_file);
136
137 $url = parametre_url($url_page, "plugin", substr($dir,strlen(_DIR_RACINE)));
138
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>";
143 } else $i = '';
144
145 return "<div class='resume'>"
146 . "<h3><a href='$url' rel='info'>"
147 . $nom
148 . "</a></h3>"
149 . " <span class='version'>".$info['version']."</span>"
150 . " <span class='etat'> - "
151 . plugin_etat_en_clair($info['etat'])
152 . "</span>"
153 . "<div class='short'>".$slogan."</div>"
154 . $i
155 . "</div>";
156 }
157
158 function plugin_desintalle($plug_file, $nom, $dir_plugins=null){
159 if (!$dir_plugins)
160 $dir_plugins = _DIR_PLUGINS;
161
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);
166
167 return "<div class='actions'>[".
168 "<a href='$action'
169 onclick='return confirm(\"$text $nom ?\\n$text2\")'>"
170 . $text
171 . "</a>]</div>" ;
172 }
173
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);
178 }
179
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));
187 }
188 return propre($texte);
189 }
190
191
192
193 // http://doc.spip.org/@affiche_bloc_plugin
194 function affiche_bloc_plugin($plug_file, $info, $dir_plugins=null) {
195 if (!$dir_plugins)
196 $dir_plugins = _DIR_PLUGINS;
197
198 $prefix = $info['prefix'];
199 $dir = "$dir_plugins$plug_file/lang/paquet-$prefix";
200
201 $s = "";
202 // TODO: le traiter_multi ici n'est pas beau
203 // cf. description du plugin/_stable_/ortho/plugin.xml
204 $description = "";
205 if (isset($info['description']))
206 $description = plugin_propre($info['description'], $dir);
207
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>';
211 }
212 $s .= "<dd class='desc'>".$description."</dd>\n";
213
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
218 else
219 $a = trim($info['auteur']);
220 if ($a)
221 $s .= "<dt class='auteurs'>" . _T('public:par_auteur') ."</dt><dd class='auteurs'>". PtoBR(propre($a, $dir)) . "</dd>\n";
222 }
223
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";
227 }
228
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
233 else
234 $a = trim($info['licence']);
235 if ($a)
236 $s .= "<dt class='licence'>" . _T('intitule_licence') ."</dt><dd class='licence'>". PtoBR(propre($a, $dir)) . "</dd>\n";
237 }
238
239 $s = "<dl class='description'>$s</dl>";
240
241 //
242 // Ajouter les infos techniques
243 //
244 $infotech = array();
245
246 $version = "<dt>"._T('version')."</dt><dd>".$info['version'];
247 // Version SVN
248 if ($svn_revision = version_svn_courante($dir_plugins.$plug_file))
249 $version .= ($svn_revision<0 ? ' SVN':'').' ['.abs($svn_revision).']';
250 $version .="</dd>";
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>"
257 :'';
258
259 $infotech[] = !$info['necessite'] ? '' :
260 ('<dt>' . _T('plugin_info_necessite') . '</dt><dd>' . join(' ', array_map('array_shift', $info['necessite'])) . '</dd>');
261
262 $s .= "<dl class='tech'>"
263 . join('', $infotech)
264 ."</dl>";
265
266
267 return $s;
268 }
269
270 function formater_credits($infos, $sep=', ') {
271 $texte = '';
272
273 foreach ($infos as $_credit) {
274 if ($texte)
275 $texte .= $sep;
276 // Si le credit en cours n'est pas un array c'est donc un copyright
277 $texte .=
278 (!is_array($_credit))
279 ? PtoBR(propre($_credit))
280 : ($_credit['url'] ? '<a href="' . $_credit['url'] . '">' : '') .
281 $_credit['nom'] .
282 ($_credit['url'] ? '</a>' : '');
283 }
284
285 return $texte;
286 }
287
288 ?>