source: spip-zone/_plugins_/lister_fonctions/trunk/lister_fonctions_fonctions.php @ 112815

Last change on this file since 112815 was 112815, checked in by teddy.spip@…, 4 months ago

PSR SPIP

File size: 5.7 KB
Line 
1<?php
2
3if (!defined('_ECRIRE_INC_VERSION')) {
4        return;
5}
6
7/**
8 * Lister toutes les fonctions définies dans l'instance de SPIP.
9 * Les fonctions fournies par les différents plugins actifs seront aussi prise en compte.
10 *
11 * @param null|string $prefixe
12 *                             Préfixe de la fonction. Exemple : `autoriser`, `auth`, etc.
13 *
14 * @return array
15 *               Si aucun préfixe, on listera toutes les fonctions.
16 *               Si un préfixe est identifié, on listera toutes les fonctions avec ce préfixe.
17 */
18function lister_fonctions($prefixe = null) {
19        $fonctions = get_defined_functions();
20
21        $fonctions_user = $fonctions['user'];
22        sort($fonctions_user);
23
24        foreach ($fonctions_user as $value) {
25                if ($fonction = preg_split('/_/', $value, -1, PREG_SPLIT_NO_EMPTY)) {
26                        $fonctions_user[$fonction[0]][] = $value;
27                        if (($key = array_search($value, $fonctions_user)) !== false) {
28                                unset($fonctions_user[$key]);
29                        }
30                }
31        }
32        ksort($fonctions_user);
33
34        $resultat = $fonctions_user;
35
36        if ($prefixe) {
37                // On pourrait faire aussi un contrôle avec array_key_exists()
38                // Mais ça risque de fausser le résultat attendu.
39                $resultat = array($prefixe => $fonctions_user[$prefixe]);
40        }
41
42        return $resultat;
43}
44
45/**
46 * Lister toutes les constantes définies dans l'instance de SPIP.
47 * Les constantes fournies par les différents plugins actifs seront aussi prise en compte.
48 *
49 * @param null|string $prefixe
50 *                             Préfixe de la constantes.
51 *
52 * @return array
53 *               Si aucun préfixe, on listera toutes les constantes.
54 *               Si un préfixe est identifié, on listera toutes les constantes avec ce préfixe.
55 */
56function lister_constantes($prefixe = null) {
57        $constantes = get_defined_constants(true);
58
59        $constantes_user = $constantes['user'];
60
61        foreach ($constantes_user as $key => $value) {
62                if ($constante = preg_split('/_/', $key, -1, PREG_SPLIT_NO_EMPTY)) {
63                        if ($constante[0] == '_') {
64                                $constantes_user[$constante[1]][$key] = $value;
65                        } else {
66                                $constantes_user[$constante[0]][$key] = $value;
67                        }
68                        unset($constantes_user[$key]);
69                }
70        }
71
72        ksort($constantes_user);
73
74        $resultat = $constantes_user;
75
76        if ($prefixe) {
77                // On pourrait faire aussi un contrôle avec array_key_exists()
78                // Mais ça risque de fausser le résultat attendu.
79                $resultat = array($prefixe => $constantes_user[$prefixe]);
80        }
81
82        return $resultat;
83}
84
85/**
86 * Afficher le nom et le chemin du fichier dans lequel
87 * est défini la fonction passée en paramètre.
88 *
89 * @param null|string $fonction
90 *
91 * @return void|string
92 */
93function fonction_fichier($fonction = null) {
94        if ($fonction == null) {
95                return;
96        }
97        // On prépare le pattern pour ne pas avoir le chemin depuis les méandres du serveur d'hébergement.
98        $pattern_root = '/^' . preg_replace('/\//', '\/', $_SERVER['DOCUMENT_ROOT']) . '/';
99
100        // API offerte par PHP 5.
101        $refFonction = new ReflectionFunction($fonction);
102
103        // On enlève le chemin 'root' pour ne garder que le chemin à la "racine" de notre site.
104        $filename = preg_replace($pattern_root, '', $refFonction->getFileName()) . ':' . $refFonction->getStartLine();
105
106        return $filename;
107}
108
109/**
110 * Lister les fichiers php dans un répertoire donné
111 * ou, par défaut, dans tout le site.
112 *
113 * @param string $dir
114 *                    Par défaut, le répertoire racine du site.
115 *
116 * @return array
117 *               Tableau contenant le chemin vers chaque fichier php.
118 */
119function lister_fichiers_php($dir = _DIR_RACINE) {
120        global $list;
121
122        // Si $dir est vide, on va chercher le répertoire
123        // dans lequel se trouve le script pour référence.
124        if (empty($dir)) {
125                # on recherche le script sur lequel on est
126                $script = end(explode('/', $_SERVER['PHP_SELF']));
127                # Et on l'enlève de l'url pour donner une bonne valeur à $dir
128                $dir = preg_replace('/' . $script . '/', '', $_SERVER['SCRIPT_FILENAME']);
129        }
130
131        if (!empty($dir) and is_dir($dir)) {
132                $ffs = scandir($dir);
133                $exclu = preg_match('/(tmp|local)/', $dir);
134                if (substr($dir, -1) !== '/') {
135                        $dir = $dir . '/';
136                }
137                foreach ($ffs as $ff) {
138                        if ($ff[0] != '.' and $exclu == false) {
139                                if (strlen($ff) >= 5) {
140                                        if (substr($ff, -4) == '.php') {
141                                                $list[] = $dir . $ff;
142                                        }
143                                }
144                                if (is_dir($dir . $ff)) {
145                                        lister_fichiers_php($dir . $ff);
146                                }
147                        }
148                }
149        }
150
151        return $list;
152}
153
154/**
155 * Rechercher le nom de toutes les fonctions
156 * dans le fichier php passé en paramètre.
157 *
158 * @param string $fichier
159 *
160 * @return array
161 */
162function lister_noms_fonctions($fichier) {
163        $liste_fonctions = array();
164
165        if (is_file($fichier)) {
166                $content = file_get_contents($fichier);
167                preg_match_all("/(function)([\s|\t]+)(\w+)/", $content, $fonctions);
168                foreach ($fonctions[3] as $fonction) {
169                        $liste_fonctions[] = array('fichier' => $fichier, 'fonction' => $fonction);
170                }
171        }
172
173        return $liste_fonctions;
174}
175
176function lister_toutes_fonctions($prefixe = null) {
177        $fichiers_php = lister_fichiers_php();
178        $fonctions_user = array();
179
180        if (count($fichiers_php) > 0) {
181                foreach ($fichiers_php as $fichier) {
182                        foreach (lister_noms_fonctions($fichier) as $value) {
183                                $fonctions_user[] = $value;
184                        }
185                }
186                @natcasesort($fonctions_user);
187        }
188
189        if (count($fonctions_user) > 0) {
190                foreach ($fonctions_user as $value) {
191                        if ($fonction = preg_split('/_/', $value['fonction'], -1, PREG_SPLIT_NO_EMPTY)) {
192                                $fonctions_user[$fonction[0]][] = $value;
193                                if (($key = array_search($value, $fonctions_user)) !== false) {
194                                        unset($fonctions_user[$key]);
195                                }
196                        }
197                }
198                ksort($fonctions_user);
199        }
200
201        $resultat = $fonctions_user;
202
203        if ($prefixe and count($fonctions_user) > 0) {
204                // On pourrait faire aussi un contrôle avec array_key_exists()
205                // Mais ça risque de fausser le résultat attendu.
206                $resultat = array($prefixe => $fonctions_user[$prefixe]);
207        }
208
209        return $resultat;
210}
Note: See TracBrowser for help on using the repository browser.