3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
6 * Copyright (c) 2001-2017 *
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')) {
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
24 * @param string $dir_plugins
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'
34 $valider_xml = charger_fonction('valider', 'xml');
35 $vxml = $valider_xml($desc, false, $process, 'paquet.dtd', "utf-8");
37 // On veut toutes les variantes selon la version de SPIP
39 return $vxml->versions
;
42 // compatibilite avec l'existant:
43 $tree = $vxml->versions
['0'];
45 // l'arbre renvoie parfois un tag vide... etrange. Pas la peine de garder ca.
46 if (isset($tree['']) and !strlen($tree[''])) {
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
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'))
65 // on merge les sous-balises de la balise spip compatible avec celles de la
67 foreach ($_version as $_index => $_balise) {
68 if ($_index and $_index != 'balise') {
69 $tree[$_index] = array_merge($tree[$_index], $_balise);
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';
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>");
88 return array('erreur' => $msg);
92 * Verifier le presence des fichiers remarquables
93 * options/actions/administrations et peupler la description du plugin en consequence
99 function paquet_readable_files(&$tree, $dir) {
100 $prefix = strtolower($tree['prefix']);
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();
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)
116 * @param object $phraseur
117 * @param string $name
118 * @param array $attrs
120 function paquet_debutElement($phraseur, $name, $attrs) {
121 xml_debutElement($phraseur, $name, $attrs);
122 if ($phraseur->err
) {
125 if (($name == 'paquet') or ($name == 'spip')) {
126 if ($name == 'spip') {
127 $n = $attrs['compatibilite'];
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();
144 $phraseur->contenu
['compatible'] = $n;
145 $phraseur->versions
[$phraseur->contenu
['compatible']] = $attrs;
147 $phraseur->versions
[$phraseur->contenu
['compatible']][$name][0] = $attrs;
149 $phraseur->versions
[$phraseur->contenu
['compatible']][''] = '';
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)
157 * @param object $phraseur
158 * @param string $data
160 function paquet_textElement($phraseur, $data) {
161 xml_textElement($phraseur, $data);
162 if ($phraseur->err
or !(trim($data))) {
165 $phraseur->versions
[$phraseur->contenu
['compatible']][''] .= $data;
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
173 * @param object $phraseur
174 * @param string $name
176 function paquet_finElement($phraseur, $name) {
177 if ($phraseur->err
) {
180 $n = $phraseur->contenu
['compatible'];
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]);
189 $texte = trim($phraseur->versions
[$n]['']);
190 $phraseur->versions
[$n][''] = '';
192 $f = 'info_paquet_' . $name;
193 if (function_exists($f)) {
194 $f($phraseur, $attrs, $texte);
196 $phraseur->versions
[$n][$name] = $texte;
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]);
202 xml_finElement($phraseur, $name, $attrs);
206 * Cas particulier de la balise licence :
207 * transformer en lien sur url fournie dans l'attribut lien
209 * @param object $phraseur
210 * @param array $attrs
211 * @param string $texte
213 function info_paquet_licence($phraseur, $attrs, $texte) {
214 if (isset($attrs['lien'])) {
215 $lien = $attrs['lien'];
219 $n = $phraseur->contenu
['compatible'];
220 $phraseur->versions
[$n]['licence'][] = array('nom' => $texte, 'url' => $lien);
224 * Cas particulier de la balise chemin :
227 * @param object $phraseur
228 * @param array $attrs
229 * @param string $texte
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']);
237 $phraseur->versions
[$n]['chemin'][] = array('path' => $attrs['path']);
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
248 * @param object $phraseur
249 * @param array $attrs
250 * @param string $texte
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']);
258 $mail = $attrs['mail'];
263 if (isset($attrs['lien'])) {
264 $lien = $attrs['lien'];
269 $n = $phraseur->contenu
['compatible'];
270 $phraseur->versions
[$n]['auteur'][] = array('nom' => $texte, 'url' => $lien, 'mail' => $mail);
274 * Cas particulier de la balise credit
275 * peupler le lien vers le site externe si necessaire
277 * @param object $phraseur
278 * @param array $attrs
279 * @param string $texte
281 function info_paquet_credit($phraseur, $attrs, $texte) {
283 if (isset($attrs['lien'])) {
284 $lien = $attrs['lien'];
289 $n = $phraseur->contenu
['compatible'];
290 $phraseur->versions
[$n]['credit'][] = array('nom' => $texte, 'url' => $lien);
294 * Cas particulier de la balise copyright :
295 * transformer en lien sur url fournie dans l'attribut lien
297 * @param object $phraseur
298 * @param array $attrs
299 * @param string $texte
301 function info_paquet_copyright($phraseur, $attrs, $texte) {
302 $n = $phraseur->contenu
['compatible'];
303 $phraseur->versions
[$n]['copyright'][] = $texte;
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
310 * @param object $phraseur
311 * @param array $attrs
312 * @param string $texte
314 function info_paquet_paquet($phraseur, $attrs, $texte) {
316 $phraseur->versions
[$n]['dtd'] = "paquet";
317 $phraseur->versions
[$n]['balise'] = "paquet";
321 * Cas particulier sur la balise traduire :
322 * Elle n'a pas de 'nom'
324 * @param object $phraseur
325 * @param array $attrs
326 * @param string $texte
328 function info_paquet_traduire($phraseur, $attrs, $texte) {
329 $n = $phraseur->contenu
['compatible'];
330 $phraseur->versions
[$n]['traduire'][] = $attrs;
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
337 * @param object $phraseur
338 * @param array $attrs
339 * @param string $texte
341 function info_paquet_spip($phraseur, $attrs, $texte) {
342 $n = $phraseur->contenu
['compatible'];
343 $phraseur->versions
[$n]['balise'] = "spip";
348 * Pipelines : plusieurs declarations possibles pour un meme pipeline
350 * @param object $phraseur
351 * @param array $attrs
352 * @param string $texte
354 function info_paquet_pipeline($phraseur, $attrs, $texte) {
355 $n = $phraseur->contenu
['compatible'];
356 $phraseur->versions
[$n]['pipeline'][] = $attrs;
361 * Style : plusieurs declarations possibles.
362 * Traitement de l'attribut source pour générer en remplacement les attributs url et path
364 * @param object $phraseur
365 * @param array $attrs
366 * @param string $texte
368 function info_paquet_style($phraseur, $attrs, $texte) {
369 $lien = $chemin = $type = $media = '';
371 include_spip('inc/utils');
372 if (tester_url_absolue($attrs['source'])) {
373 $lien = $attrs['source'];
375 $chemin = $attrs['source'];
377 if (isset($attrs['type'])) {
378 $type = $attrs['type'];
380 if (isset($attrs['media'])) {
381 $media = $attrs['media'];
384 $n = $phraseur->contenu
['compatible'];
385 $phraseur->versions
[$n]['style'][] = array('url' => $lien, 'path' => $chemin, 'type' => $type, 'media' => $media);
390 * Script : plusieurs declarations possibles.
391 * Traitement de l'attribut source pour générer en remplacement les attributs url et path
393 * @param object $phraseur
394 * @param array $attrs
395 * @param string $texte
397 function info_paquet_script($phraseur, $attrs, $texte) {
398 $lien = $chemin = $type = $media = '';
400 include_spip('inc/utils');
401 if (tester_url_absolue($attrs['source'])) {
402 $lien = $attrs['source'];
404 $chemin = $attrs['source'];
406 if (isset($attrs['type'])) {
407 $type = $attrs['type'];
410 $n = $phraseur->contenu
['compatible'];
411 $phraseur->versions
[$n]['script'][] = array('url' => $lien, 'path' => $chemin, 'type' => $type);
415 * Genie : plusieurs declarations possibles pour les crons
417 * @param object $phraseur
418 * @param array $attrs
419 * @param string $texte
421 function info_paquet_genie($phraseur, $attrs, $texte) {
422 $n = $phraseur->contenu
['compatible'];
423 $phraseur->versions
[$n]['genie'][] = $attrs;