[SPIP] v3.2.1-->v3.2.2
[lhc/web/www.git] / www / ecrire / plugins / infos_plugin.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2019 *
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 /**
14 * Calculs des informations contenues dans un plugin.xml
15 *
16 * @package SPIP\Core\Plugins
17 **/
18
19 if (!defined('_ECRIRE_INC_VERSION')) {
20 return;
21 }
22
23 // lecture d'un texte ecrit en pseudo-xml issu d'un fichier plugin.xml
24 // et conversion approximative en tableau PHP.
25 function plugins_infos_plugin($desc, $plug = '', $dir_plugins = _DIR_PLUGINS) {
26 include_spip('inc/xml');
27 $arbre = spip_xml_parse($desc);
28
29 $verifie_conformite = charger_fonction('verifie_conformite', 'plugins');
30 $verifie_conformite($plug, $arbre, $dir_plugins);
31
32 include_spip('inc/charsets');
33
34 // On renvoie la DTD utilisee
35 $ret['dtd'] = "plugin";
36
37 if (isset($arbre['categorie'])) {
38 $ret['categorie'] = trim(spip_xml_aplatit($arbre['categorie']));
39 }
40 if (isset($arbre['nom'])) {
41 $ret['nom'] = charset2unicode(spip_xml_aplatit($arbre['nom']));
42 }
43 if (isset($arbre['icon'])) {
44 $ret['logo'] = trim(spip_xml_aplatit($arbre['icon']));
45 }
46 if (isset($arbre['auteur'])) {
47 $ret['auteur'][] = trim(spip_xml_aplatit($arbre['auteur']));
48 } // garder le 1er niveau en tableau mais traiter le multi possible
49 if (isset($arbre['licence'])) {
50 $ret['licence'][] = trim(spip_xml_aplatit($arbre['licence']));
51 }
52 if (isset($arbre['version'])) {
53 $ret['version'] = trim(spip_xml_aplatit($arbre['version']));
54 }
55 if (isset($arbre['version_base'])) {
56 $ret['schema'] = trim(spip_xml_aplatit($arbre['version_base']));
57 }
58 if (isset($arbre['etat'])) {
59 $ret['etat'] = trim(spip_xml_aplatit($arbre['etat']));
60 }
61
62 $ret['description'] = $ret['slogan'] = "";
63 if (isset($arbre['slogan'])) {
64 $ret['slogan'] = trim(spip_xml_aplatit($arbre['slogan']));
65 }
66 if (isset($arbre['description'])) {
67 $ret['description'] = trim(spip_xml_aplatit($arbre['description']));
68 }
69
70 if (isset($arbre['lien'])) {
71 $ret['documentation'] = trim(join(' ', $arbre['lien']));
72 if ($ret['documentation']) {
73 // le lien de doc doit etre une url et c'est tout
74 if (!tester_url_absolue($ret['documentation'])) {
75 $ret['documentation'] = "";
76 }
77 }
78 }
79
80 if (isset($arbre['options'])) {
81 $ret['options'] = $arbre['options'];
82 }
83 if (isset($arbre['fonctions'])) {
84 $ret['fonctions'] = $arbre['fonctions'];
85 }
86 if (isset($arbre['prefix'][0])) {
87 $ret['prefix'] = trim(array_pop($arbre['prefix']));
88 }
89 if (isset($arbre['install'])) {
90 $ret['install'] = $arbre['install'];
91 }
92 if (isset($arbre['meta'])) {
93 $ret['meta'] = trim(spip_xml_aplatit($arbre['meta']));
94 }
95
96 $necessite = info_plugin_normalise_necessite(isset($arbre['necessite']) ? $arbre['necessite'] : '');
97 $ret['compatibilite'] = isset($necessite['compatible']) ? $necessite['compatible'] : '';
98 $ret['necessite'] = $necessite['necessite'];
99 $ret['lib'] = $necessite['lib'];
100 $ret['utilise'] = info_plugin_normalise_utilise(isset($arbre['utilise']) ? $arbre['utilise'] : '');
101 $ret['procure'] = info_plugin_normalise_procure(isset($arbre['procure']) ? $arbre['procure'] : '');
102 $ret['chemin'] = info_plugin_normalise_chemin(isset($arbre['path']) ? $arbre['path'] : '');
103
104 if (isset($arbre['pipeline'])) {
105 $ret['pipeline'] = $arbre['pipeline'];
106 }
107
108 $extraire_boutons = charger_fonction('extraire_boutons', 'plugins');
109 $les_boutons = $extraire_boutons($arbre);
110 $ret['menu'] = $les_boutons['bouton'];
111 $ret['onglet'] = $les_boutons['onglet'];
112
113 $ret['traduire'] = isset($arbre['traduire']) ? $arbre['traduire'] : '';
114
115 if (isset($arbre['config'])) {
116 $ret['config'] = spip_xml_aplatit($arbre['config']);
117 }
118 if (isset($arbre['noisette'])) {
119 $ret['noisette'] = $arbre['noisette'];
120 }
121
122 if (isset($arbre['erreur'])) {
123 $ret['erreur'] = $arbre['erreur'];
124 if ($plug) {
125 spip_log("infos_plugin $plug " . @join(' ', $arbre['erreur']));
126 }
127 }
128
129 return $ret;
130 }
131
132
133 /**
134 * Normaliser les description des balises `necessite`
135 *
136 * Ajoute les clés
137 * - 'nom' (= id)
138 * - 'compatibilite' (= version)
139 *
140 * @note
141 * Un attribut de nom "id" à une signification particulière en XML
142 * qui ne correspond pas à l'utilissation qu'en font les plugin.xml.
143 *
144 * Pour éviter de complexifier la lecture de paquet.xml
145 * qui n'est pour rien dans cette bévue, on doublonne l'information
146 * sous les deux index "nom" et "id" dans l'arbre de syntaxe abstraite
147 * pour compatibilité, mais seul le premier est disponible quand on lit
148 * un paquet.xml, "id" devant être considéré comme obsolète.
149 *
150 * @param array $necessite
151 * Liste des necessite trouvés pour le plugin
152 * @return array
153 * Liste des necessite modifiés.
154 */
155 function info_plugin_normalise_necessite($necessite) {
156 $res = array('necessite' => array(), 'lib' => array());
157
158 if (is_array($necessite)) {
159 foreach ($necessite as $need) {
160 $id = $need['id'];
161 $v = isset($need['version']) ? $need['version'] : '';
162
163 // Necessite SPIP version x ?
164 if (strtoupper($id) == 'SPIP') {
165 $res['compatible'] = $v;
166 } else {
167 if (preg_match(',^lib:\s*([^\s]*),i', $id, $r)) {
168 $res['lib'][] = array('nom' => $r[1], 'id' => $r[1], 'lien' => $need['src']);
169 } else {
170 $res['necessite'][] = array('id' => $id, 'nom' => $id, 'version' => $v, 'compatibilite' => $v);
171 }
172 }
173 }
174 }
175
176 return $res;
177 }
178
179 /**
180 * Normaliser la description des utilise
181 *
182 * Ajoute les clés
183 * - 'nom' (= id)
184 * - 'compatibilite' (= version)
185 *
186 * @param array $utilise
187 * Liste des utilise trouvés pour le plugin
188 * @return array
189 * Liste des utilise modifiés.
190 */
191 function info_plugin_normalise_utilise($utilise) {
192 $res = array();
193
194 if (is_array($utilise)) {
195 foreach ($utilise as $need) {
196 $id = $need['id'];
197 $v = isset($need['version']) ? $need['version'] : '';
198 $res[] = array('nom' => $id, 'id' => $id, 'version' => $v, 'compatibilite' => $v);
199 }
200 }
201
202 return $res;
203 }
204
205 /**
206 * Normaliser la description des procurations
207 *
208 * Ajoute la cle 'nom' (= id)
209 *
210 * @param array $procure
211 * Liste des procure trouvés pour le plugin
212 * @return array
213 * Liste des procure modifiés.
214 */
215 function info_plugin_normalise_procure($procure) {
216 $res = array();
217
218 if (is_array($procure)) {
219 foreach ($procure as $need) {
220 $id = $need['id'];
221 $v = $need['version'];
222 $res[] = array('nom' => $id, 'id' => $id, 'version' => $v);
223 }
224 }
225
226 return $res;
227 }
228
229 /**
230 * Normaliser la description du chemin
231 *
232 * Ajoute le clés 'path' (= dir)
233 *
234 * @param array $chemins
235 * Liste des chemins trouvés pour le plugin
236 * @return array
237 * Liste des chemins modifiés.
238 */
239 function info_plugin_normalise_chemin($chemins) {
240 $res = array();
241
242 if (is_array($chemins)) {
243 foreach ($chemins as $c) {
244 $c['path'] = $c['dir'];
245 $res[] = $c;
246 }
247 }
248
249 return $res;
250 }