d232e5cdeece872da6b209d7a1db8f7350d12918
[lhc/web/www.git] / www / ecrire / plugins / afficher_repertoires.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2017 *
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 // http://code.spip.net/@affiche_arbre_plugins
18 function plugins_afficher_repertoires_dist($url_page, $liste_plugins, $liste_plugins_actifs) {
19 $ligne_plug = charger_fonction('afficher_plugin', 'plugins');
20 $racine = basename(_DIR_PLUGINS);
21 $init_dir = $current_dir = "";
22 // liste des repertoires deplies : construit en remontant l'arbo de chaque plugin actif
23 // des qu'un path est deja note deplie on s'arrete
24 $deplie = array($racine => true);
25 $fast_liste_plugins_actifs = array();
26 foreach ($liste_plugins_actifs as $key => $plug) {
27 $chemin_plug = chemin_plug($racine, $plug);
28 $fast_liste_plugins_actifs[$chemin_plug] = true;
29 $dir = dirname($chemin_plug);
30 $maxiter = 100;
31 while (strlen($dir) && !isset($deplie[$dir]) && $dir != $racine && $maxiter-- > 0) {
32 $deplie[$dir] = true;
33 $dir = dirname($dir);
34 }
35 }
36
37 // index repertoires --> plugin
38 $dir_index = array();
39 foreach ($liste_plugins as $key => $plug) {
40 $liste_plugins[$key] = chemin_plug($racine, $plug);
41 $dir_index[dirname($liste_plugins[$key])][] = $key;
42 }
43
44 $visible = @isset($deplie[$current_dir]);
45 $maxiter = 1000;
46
47 $res = '';
48 while (count($liste_plugins) && $maxiter--) {
49 // le rep suivant
50 $dir = dirname(reset($liste_plugins));
51 if ($dir != $current_dir) {
52 $res .= tree_open_close_dir($current_dir, $dir, $deplie);
53 }
54
55 // d'abord tous les plugins du rep courant
56 if (isset($dir_index[$current_dir])) {
57 foreach ($dir_index[$current_dir] as $key) {
58 $plug = $liste_plugins[$key];
59 $actif = @isset($fast_liste_plugins_actifs[$plug]);
60 $id = substr(md5($plug), 0, 16);
61 $res .= $ligne_plug($url_page, str_replace(_DIR_PLUGINS, '', _DIR_RACINE . $plug), $actif,
62 'menu-entree') . "\n";
63 unset($liste_plugins[$key]);
64 }
65 }
66 }
67 $res .= tree_open_close_dir($current_dir, $init_dir, true);
68
69 return "<ul class='menu-liste plugins'>"
70 . $res
71 . "</ul>";
72 }
73
74
75 // vraiment n'importe quoi la gestion des chemins des plugins
76 // une fonction pour aider...
77 // http://code.spip.net/@chemin_plug
78 function chemin_plug($racine, $plug) {
79 return preg_replace(',[^/]+/\.\./,', '', "$racine/$plug");
80 }
81
82 // http://code.spip.net/@tree_open_close_dir
83 function tree_open_close_dir(&$current, $target, $deplie = array()) {
84 if ($current == $target) {
85 return "";
86 }
87 $tcur = explode("/", $current);
88 $ttarg = explode("/", $target);
89 $tcom = array();
90 $output = "";
91 // la partie commune
92 while (reset($tcur) == reset($ttarg)) {
93 $tcom[] = array_shift($tcur);
94 array_shift($ttarg);
95 }
96 // fermer les repertoires courant jusqu'au point de fork
97 while ($close = array_pop($tcur)) {
98 $output .= "</ul>\n";
99 $output .= fin_block();
100 $output .= "</li>\n";
101 }
102 $chemin = "";
103 if (count($tcom)) {
104 $chemin .= implode("/", $tcom) . "/";
105 }
106 // ouvrir les repertoires jusqu'a la cible
107 while ($open = array_shift($ttarg)) {
108 $visible = @isset($deplie[$chemin . $open]);
109 $chemin .= $open . "/";
110 $output .= "<li>";
111 $output .= bouton_block_depliable($chemin, $visible);
112 $output .= debut_block_depliable($visible);
113
114 $output .= "<ul>\n";
115 }
116 $current = $target;
117
118 return $output;
119 }