1 | <?php |
---|
2 | |
---|
3 | if (!defined('_ECRIRE_INC_VERSION')) return; |
---|
4 | |
---|
5 | /** |
---|
6 | * Verification de l'utilisation de la fonction _L() dans le code PHP |
---|
7 | * |
---|
8 | */ |
---|
9 | // Les REGEXP de recherche de l'item de langue (voir le fichier regexp.txt) |
---|
10 | // -- pour les fichiers .php et la detection de _L |
---|
11 | define("_LANGONET_FONCTION_L", |
---|
12 | # "`_L\([\"'](.+)(?:[,\"']|[\"'][,].*)\)`iUm"); # old |
---|
13 | '#\b_L *[(] *"([^"]*)"[^)]*#'); |
---|
14 | |
---|
15 | define("_LANGONET_FONCTION_L2", |
---|
16 | "#\b_L *[(] *'([^']*)'[^)]*#"); |
---|
17 | |
---|
18 | // Si une erreur se produit lors du deroulement de la fonction, |
---|
19 | // le tableau resultat contient le libelle |
---|
20 | // de l'erreur dans $resultats['erreur']; |
---|
21 | // sinon, cet index n'existe pas. |
---|
22 | |
---|
23 | // $ou_fichier => racine de l'arborescence a verifier |
---|
24 | // On n'examine pas les ultimes sous-repertoires charsets/,lang/ , req/ et /. |
---|
25 | // On n'examine que les fichiers php |
---|
26 | // (voir le fichier regexp.txt). |
---|
27 | |
---|
28 | define('_LANGONET_FILES', '(?<!/charsets|/lang|/req)(/[^/]*\.(php))$'); |
---|
29 | |
---|
30 | // Construit le tableau des occurrences du premier argument de _L. |
---|
31 | // Ce tableau est indexe par un representant canonique de chaque chaine trouvee |
---|
32 | // Les valeurs de ce tableau sont des sous-tableaux indexes par le nom du fichier |
---|
33 | // Chacun a pour valeur un sous-sous-tableau indexe par le numero de ligne, |
---|
34 | // pointant sur un sous-sous-sous-tableau des appels complets de _L |
---|
35 | |
---|
36 | // @param string $module |
---|
37 | // @param string $ou_fichier |
---|
38 | // @return array |
---|
39 | |
---|
40 | function inc_langonet_verifier_l($module, $ou_fichier) { |
---|
41 | |
---|
42 | $item_md5 = array(); |
---|
43 | $fichier_non = array(); |
---|
44 | $files = preg_files(_DIR_RACINE.$ou_fichier, _LANGONET_FILES); |
---|
45 | foreach ($files as $_fichier) { |
---|
46 | foreach ($contenu = file($_fichier) as $ligne => $texte) { |
---|
47 | if (preg_match_all(_LANGONET_FONCTION_L, $texte, $m, PREG_SET_ORDER)) |
---|
48 | foreach ($m as $occ) { |
---|
49 | $index = langonet_index_l($occ[1], $item_md5); |
---|
50 | $item_md5[$index] = $occ[1]; |
---|
51 | $fichier_non[$index][$_fichier][$ligne][] = trim($occ[0]); |
---|
52 | } |
---|
53 | if (preg_match_all(_LANGONET_FONCTION_L2, $texte, $m, PREG_SET_ORDER)) |
---|
54 | foreach ($m as $occ) { |
---|
55 | $index = langonet_index_l($occ[1], $item_md5); |
---|
56 | $item_md5[$index] = $occ[1]; |
---|
57 | $fichier_non[$index][$_fichier][$ligne][] = trim($occ[0]); |
---|
58 | } |
---|
59 | } |
---|
60 | } |
---|
61 | |
---|
62 | $resultats['module'] = $module; |
---|
63 | $resultats['ou_fichier'] = $ou_fichier; |
---|
64 | $resultats['item_non'] = array_keys($item_md5); |
---|
65 | $resultats['fichier_non'] = $fichier_non; |
---|
66 | $resultats['item_md5'] = $item_md5; |
---|
67 | return $resultats; |
---|
68 | } |
---|
69 | |
---|
70 | // Calcul du representant canonique d'un premier argument de _L. |
---|
71 | // C'est un transcodage ASCII, reduits aux 32 premiers caracteres, |
---|
72 | // les caracteres non alphabetiques etant remplaces par un souligne. |
---|
73 | // On elimine les repetitions de mots pour evacuer le cas frequent truc: @truc@ |
---|
74 | // Si plus que 32 caracteres, on elimine les mots de moins de 3 lettres. |
---|
75 | // Si toujours trop, on coupe au dernier mot complet avant 32 caracteres. |
---|
76 | // C'est donc le tableau des chaines de langues manquant; |
---|
77 | // toutefois, en cas d'homonymie d'index, on prend le md5, qui est illisible. |
---|
78 | |
---|
79 | // @param string $occ |
---|
80 | // @param array item_md5 |
---|
81 | // @return string |
---|
82 | |
---|
83 | function langonet_index_l($occ, $item_md5) |
---|
84 | { |
---|
85 | $index = textebrut($occ); |
---|
86 | $index = preg_replace('/\\\\[nt]/', ' ', $index); |
---|
87 | $index = strtolower(translitteration($index)); |
---|
88 | $index = trim(preg_replace('/\W+/', ' ', $index)); |
---|
89 | $index = preg_replace('/\b(\w+)\W+\1/', '\1', $index); |
---|
90 | if (strlen($index) > 32) { |
---|
91 | // trop long: abandonner les petits mots |
---|
92 | $index = preg_replace('/\b\w{1,3}\W/', '', $index); |
---|
93 | if (strlen($index) > 32) { |
---|
94 | // tant pis mais couper proprement si possible |
---|
95 | $index = substr($index, 0, 32); |
---|
96 | if ($n = strrpos($index,' ')) |
---|
97 | $index = substr($index, 0, $n); |
---|
98 | } |
---|
99 | } |
---|
100 | $index = str_replace(' ', '_', trim($index)); |
---|
101 | if (isset($item_md5[$index]) AND $item_md5[$index] !== $occ) |
---|
102 | $index = md5($occ); |
---|
103 | |
---|
104 | return $index; |
---|
105 | } |
---|
106 | ?> |
---|