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