[SPIP] v3.2.1-->v3.2.2
[lhc/web/www.git] / www / ecrire / plugins / infos_paquet.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 if (!defined('_ECRIRE_INC_VERSION')) {
14 return;
15 }
16
17 /**
18 * lecture d'un texte conforme a la DTD paquet.dtd
19 * et conversion en tableau PHP identique a celui fourni par plugin.xml
20 * manque la description
21 *
22 * @param $desc
23 * @param string $plug
24 * @param string $dir_plugins
25 * @return array
26 */
27 function plugins_infos_paquet($desc, $plug = '', $dir_plugins = _DIR_PLUGINS) {
28 static $process = array( // tableau constant
29 'debut' => 'paquet_debutElement',
30 'fin' => 'paquet_finElement',
31 'text' => 'paquet_textElement'
32 );
33
34 $valider_xml = charger_fonction('valider', 'xml');
35 $vxml = $valider_xml($desc, false, $process, 'paquet.dtd', "utf-8");
36 if (!$vxml->err) {
37 // On veut toutes les variantes selon la version de SPIP
38 if (!$plug) {
39 return $vxml->versions;
40 }
41
42 // compatibilite avec l'existant:
43 $tree = $vxml->versions['0'];
44
45 // l'arbre renvoie parfois un tag vide... etrange. Pas la peine de garder ca.
46 if (isset($tree['']) and !strlen($tree[''])) {
47 unset($tree['']);
48 }
49
50 $tree['slogan'] = $tree['prefix'] . "_slogan";
51 $tree['description'] = $tree['prefix'] . "_description";
52 paquet_readable_files($tree, "$dir_plugins$plug/");
53 if (!$tree['chemin']) {
54 $tree['chemin'] = array(array('path' => ''));
55 } // initialiser par defaut
56
57 // On verifie qu'il existe des balises spip qu'il faudrait rajouter dans
58 // la structure d'infos du paquet en fonction de la version spip courante
59 if (count($vxml->versions) > 1) {
60 $vspip = $GLOBALS['spip_version_branche'];
61 foreach ($vxml->versions as $_compatibilite => $_version) {
62 if (($_version['balise'] == 'spip')
63 and (plugin_version_compatible($_compatibilite, $vspip, 'spip'))
64 ) {
65 // on merge les sous-balises de la balise spip compatible avec celles de la
66 // balise paquet
67 foreach ($_version as $_index => $_balise) {
68 if ($_index and $_index != 'balise') {
69 $tree[$_index] = array_merge($tree[$_index], $_balise);
70 }
71 }
72 }
73 }
74 }
75
76 return $tree;
77 }
78 // Prendre les messages d'erreur sans les numeros de lignes
79 $msg = array_map('array_shift', $vxml->err);
80 // Construire le lien renvoyant sur l'application du validateur XML
81 $h = $GLOBALS['meta']['adresse_site'] . '/'
82 . substr("$dir_plugins$plug/", strlen(_DIR_RACINE)) . 'paquet.xml';
83
84 $h = generer_url_ecrire('valider_xml', "var_url=$h");
85 $t = _T('plugins_erreur', array('plugins' => $plug));
86 array_unshift($msg, "<a href='$h'>$t</a>");
87
88 return array('erreur' => $msg);
89 }
90
91 /**
92 * Verifier le presence des fichiers remarquables
93 * options/actions/administrations et peupler la description du plugin en consequence
94 *
95 * @param array $tree
96 * @param string $dir
97 * @return void
98 */
99 function paquet_readable_files(&$tree, $dir) {
100 $prefix = strtolower($tree['prefix']);
101
102 $tree['options'] = (is_readable($dir . $f = ($prefix . '_options.php'))) ? array($f) : array();
103 $tree['fonctions'] = (is_readable($dir . $f = ($prefix . '_fonctions.php'))) ? array($f) : array();
104 $tree['install'] = (is_readable($dir . $f = ($prefix . '_administrations.php'))) ? array($f) : array();
105 }
106
107 /**
108 * Appeler le validateur, qui memorise le texte dans le tableau "versions"
109 * On memorise en plus dans les index de numero de version de SPIP
110 * les attributs de la balise rencontree
111 * qu'on complete par des entrees nommees par les sous-balises de "paquet",
112 * et initialisees par un tableau vide, rempli a leur rencontre.
113 * La sous-balise "spip", qui ne peut apparaitre qu'apres les autres,
114 * reprend les valeurs recuperees precedement (valeurs par defaut)
115 *
116 * @param object $phraseur
117 * @param string $name
118 * @param array $attrs
119 */
120 function paquet_debutElement($phraseur, $name, $attrs) {
121 xml_debutElement($phraseur, $name, $attrs);
122 if ($phraseur->err) {
123 return;
124 }
125 if (($name == 'paquet') or ($name == 'spip')) {
126 if ($name == 'spip') {
127 $n = $attrs['compatibilite'];
128 $attrs = array();
129 } else {
130 $n = '0';
131 $phraseur->contenu['paquet'] = $attrs;
132 $attrs['menu'] = array();
133 $attrs['chemin'] = array();
134 $attrs['necessite'] = array();
135 $attrs['lib'] = array();
136 $attrs['onglet'] = array();
137 $attrs['procure'] = array();
138 $attrs['pipeline'] = array();
139 $attrs['utilise'] = array();
140 $attrs['style'] = array();
141 $attrs['script'] = array();
142 $attrs['genie'] = array();
143 }
144 $phraseur->contenu['compatible'] = $n;
145 $phraseur->versions[$phraseur->contenu['compatible']] = $attrs;
146 } else {
147 $phraseur->versions[$phraseur->contenu['compatible']][$name][0] = $attrs;
148 }
149 $phraseur->versions[$phraseur->contenu['compatible']][''] = '';
150 }
151
152 /**
153 * Appeler l'indenteur pour sa gestion de la profondeur,
154 * et memoriser les attributs dans le tableau avec l'oppose de la profondeur
155 * comme index, avec '' comme sous-index (les autres sont les attributs)
156 *
157 * @param object $phraseur
158 * @param string $data
159 */
160 function paquet_textElement($phraseur, $data) {
161 xml_textElement($phraseur, $data);
162 if ($phraseur->err or !(trim($data))) {
163 return;
164 }
165 $phraseur->versions[$phraseur->contenu['compatible']][''] .= $data;
166 }
167
168 /**
169 * Si on sait deja que le texte n'est pas valide on ne fait rien.
170 * Pour une balise sans attribut, le traitement est forcement toujours le meme.
171 * Pour une balise sans texte, idem mais parce que la DTD est bien fichue
172 *
173 * @param object $phraseur
174 * @param string $name
175 */
176 function paquet_finElement($phraseur, $name) {
177 if ($phraseur->err) {
178 return;
179 }
180 $n = $phraseur->contenu['compatible'];
181
182 if (isset($phraseur->versions[$n][$name][0]) and is_array($phraseur->versions[$n][$name][0])) {
183 $attrs = $phraseur->versions[$n][$name][0];
184 unset($phraseur->versions[$n][$name][0]);
185 } else {
186 $attrs = array();
187 }
188
189 $texte = trim($phraseur->versions[$n]['']);
190 $phraseur->versions[$n][''] = '';
191
192 $f = 'info_paquet_' . $name;
193 if (function_exists($f)) {
194 $f($phraseur, $attrs, $texte);
195 } elseif (!$attrs) {
196 $phraseur->versions[$n][$name] = $texte;
197 } else {
198 // Traitement generique. Si $attrs['nom'] n'existe pas, ce n'est pas normal ici
199 $phraseur->versions[$n][$name][$attrs['nom']] = $attrs;
200 # echo("<br>pour $name $n " . $attrs['nom']); var_dump($phraseur->versions[$n]);
201 }
202 xml_finElement($phraseur, $name, $attrs);
203 }
204
205 /**
206 * Cas particulier de la balise licence :
207 * transformer en lien sur url fournie dans l'attribut lien
208 *
209 * @param object $phraseur
210 * @param array $attrs
211 * @param string $texte
212 */
213 function info_paquet_licence($phraseur, $attrs, $texte) {
214 if (isset($attrs['lien'])) {
215 $lien = $attrs['lien'];
216 } else {
217 $lien = '';
218 }
219 $n = $phraseur->contenu['compatible'];
220 $phraseur->versions[$n]['licence'][] = array('nom' => $texte, 'url' => $lien);
221 }
222
223 /**
224 * Cas particulier de la balise chemin :
225 * stocker un tableau
226 *
227 * @param object $phraseur
228 * @param array $attrs
229 * @param string $texte
230 */
231 function info_paquet_chemin($phraseur, $attrs, $texte) {
232 $n = $phraseur->contenu['compatible'];
233 if (isset($attrs['path'])) {
234 if (isset($attrs['type'])) {
235 $phraseur->versions[$n]['chemin'][] = array('path' => $attrs['path'], 'type' => $attrs['type']);
236 } else {
237 $phraseur->versions[$n]['chemin'][] = array('path' => $attrs['path']);
238 }
239 }
240 }
241
242
243 /**
244 * Cas particulier de la balise auteur
245 * peupler le mail si besoin (en le protegeant, mais est-ce bien la place pour cela ?)
246 * et le lien vers le site de l'auteur si fournit
247 *
248 * @param object $phraseur
249 * @param array $attrs
250 * @param string $texte
251 */
252 function info_paquet_auteur($phraseur, $attrs, $texte) {
253 # echo 'auteur ', $texte; var_dump($attrs);
254 if (isset($attrs['mail'])) {
255 if (strpos($attrs['mail'], '@')) {
256 $attrs['mail'] = str_replace('@', ' AT ', $attrs['mail']);
257 }
258 $mail = $attrs['mail'];
259 } else {
260 $mail = '';
261 }
262
263 if (isset($attrs['lien'])) {
264 $lien = $attrs['lien'];
265 } else {
266 $lien = '';
267 }
268
269 $n = $phraseur->contenu['compatible'];
270 $phraseur->versions[$n]['auteur'][] = array('nom' => $texte, 'url' => $lien, 'mail' => $mail);
271 }
272
273 /**
274 * Cas particulier de la balise credit
275 * peupler le lien vers le site externe si necessaire
276 *
277 * @param object $phraseur
278 * @param array $attrs
279 * @param string $texte
280 */
281 function info_paquet_credit($phraseur, $attrs, $texte) {
282
283 if (isset($attrs['lien'])) {
284 $lien = $attrs['lien'];
285 } else {
286 $lien = '';
287 }
288
289 $n = $phraseur->contenu['compatible'];
290 $phraseur->versions[$n]['credit'][] = array('nom' => $texte, 'url' => $lien);
291 }
292
293 /**
294 * Cas particulier de la balise copyright :
295 * transformer en lien sur url fournie dans l'attribut lien
296 *
297 * @param object $phraseur
298 * @param array $attrs
299 * @param string $texte
300 */
301 function info_paquet_copyright($phraseur, $attrs, $texte) {
302 $n = $phraseur->contenu['compatible'];
303 $phraseur->versions[$n]['copyright'][] = $texte;
304 }
305
306 /**
307 * Cas particulier de la balise paquet :
308 * Remplacer cet index qui ne sert a rien par un index balise=paquet et ajouter la reference a la dtd
309 *
310 * @param object $phraseur
311 * @param array $attrs
312 * @param string $texte
313 */
314 function info_paquet_paquet($phraseur, $attrs, $texte) {
315 $n = 0;
316 $phraseur->versions[$n]['dtd'] = "paquet";
317 $phraseur->versions[$n]['balise'] = "paquet";
318 }
319
320 /**
321 * Cas particulier sur la balise traduire :
322 * Elle n'a pas de 'nom'
323 *
324 * @param object $phraseur
325 * @param array $attrs
326 * @param string $texte
327 **/
328 function info_paquet_traduire($phraseur, $attrs, $texte) {
329 $n = $phraseur->contenu['compatible'];
330 $phraseur->versions[$n]['traduire'][] = $attrs;
331 }
332
333 /**
334 * Cas particulier de la balise spip :
335 * Remplacer cet index qui ne sert a rien par un index balise=spip et ajouter la reference a la dtd
336 *
337 * @param object $phraseur
338 * @param array $attrs
339 * @param string $texte
340 */
341 function info_paquet_spip($phraseur, $attrs, $texte) {
342 $n = $phraseur->contenu['compatible'];
343 $phraseur->versions[$n]['balise'] = "spip";
344 }
345
346
347 /**
348 * Pipelines : plusieurs declarations possibles pour un meme pipeline
349 *
350 * @param object $phraseur
351 * @param array $attrs
352 * @param string $texte
353 */
354 function info_paquet_pipeline($phraseur, $attrs, $texte) {
355 $n = $phraseur->contenu['compatible'];
356 $phraseur->versions[$n]['pipeline'][] = $attrs;
357 }
358
359
360 /**
361 * Style : plusieurs declarations possibles.
362 * Traitement de l'attribut source pour générer en remplacement les attributs url et path
363 *
364 * @param object $phraseur
365 * @param array $attrs
366 * @param string $texte
367 */
368 function info_paquet_style($phraseur, $attrs, $texte) {
369 $lien = $chemin = $type = $media = '';
370
371 include_spip('inc/utils');
372 if (tester_url_absolue($attrs['source'])) {
373 $lien = $attrs['source'];
374 } else {
375 $chemin = $attrs['source'];
376 }
377 if (isset($attrs['type'])) {
378 $type = $attrs['type'];
379 }
380 if (isset($attrs['media'])) {
381 $media = $attrs['media'];
382 }
383
384 $n = $phraseur->contenu['compatible'];
385 $phraseur->versions[$n]['style'][] = array('url' => $lien, 'path' => $chemin, 'type' => $type, 'media' => $media);
386 }
387
388
389 /**
390 * Script : plusieurs declarations possibles.
391 * Traitement de l'attribut source pour générer en remplacement les attributs url et path
392 *
393 * @param object $phraseur
394 * @param array $attrs
395 * @param string $texte
396 */
397 function info_paquet_script($phraseur, $attrs, $texte) {
398 $lien = $chemin = $type = $media = '';
399
400 include_spip('inc/utils');
401 if (tester_url_absolue($attrs['source'])) {
402 $lien = $attrs['source'];
403 } else {
404 $chemin = $attrs['source'];
405 }
406 if (isset($attrs['type'])) {
407 $type = $attrs['type'];
408 }
409
410 $n = $phraseur->contenu['compatible'];
411 $phraseur->versions[$n]['script'][] = array('url' => $lien, 'path' => $chemin, 'type' => $type);
412 }
413
414 /**
415 * Genie : plusieurs declarations possibles pour les crons
416 *
417 * @param object $phraseur
418 * @param array $attrs
419 * @param string $texte
420 */
421 function info_paquet_genie($phraseur, $attrs, $texte) {
422 $n = $phraseur->contenu['compatible'];
423 $phraseur->versions[$n]['genie'][] = $attrs;
424 }