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