Changeset 52390 in spip-zone
- Timestamp:
- Oct 3, 2011, 7:31:46 PM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
_plugins_/langonet/inc/langonet_verifier_l.php
r45964 r52390 1 1 <?php 2 // Les REGEXP de recherche de l'item de langue (voir le fichier regexp.txt) 3 // -- pour les fichiers .php et la detection de _L 4 define("_LANGONET_TROUVER_FONCTION_L_P", "`_L\([\"'](.+)(?:[,\"']|[\"'][,].*)\)`iUm"); 5 2 /// @file 6 3 /** 7 * V érification de l'utilisation de la fonction _L() dans le code PHP4 * Verification de l'utilisation de la fonction _L() dans le code PHP 8 5 * 9 * @param string $ou_fichier10 * @return array11 6 */ 12 7 13 // $ou_fichier => racine de l'arborescence a verifier 8 /// Les REGEXP de recherche de l'item de langue (voir le fichier regexp.txt) 9 /// -- pour les fichiers .php et la detection de _L 10 define("_LANGONET_FONCTION_L", 11 # "`_L\([\"'](.+)(?:[,\"']|[\"'][,].*)\)`iUm"); # old 12 '#\b_L *[(] *"([^"]*)"[^)]*#'); 13 14 define("_LANGONET_FONCTION_L2", 15 "#\b_L *[(] *'([^']*)'[^)]*#"); 16 17 /// Si une erreur se produit lors du deroulement de la fonction, 18 /// le tableau resultat contient le libelle 19 /// de l'erreur dans $resultats['erreur']; 20 /// sinon, cet index n'existe pas. 21 22 /// $ou_fichier => racine de l'arborescence a verifier 23 /// On n'examine pas les ultimes sous-repertoires charsets/,lang/ , req/ et /. 24 /// On n'examine que les fichiers php 25 /// (voir le fichier regexp.txt). 26 27 define('_LANGONET_FILES', '(?<!/charsets|/lang|/req)(/[^/]*\.(php))$'); 28 29 /// Construit le tableau des occurrences du premier argument de _L. 30 /// Ce tableau est indexe par un representant canonique de chaque chaine trouvee 31 /// Les valeurs de ce tableau sont des sous-tableaux indexes par le nom du fichier 32 /// Chacun a pour valeur un sous-sous-tableau indexe par le numero de ligne, 33 /// pointant sur un sous-sous-sous-tableau des appels complets de _L 34 35 /// @param string $ou_fichier 36 /// @return array 37 14 38 function inc_langonet_verifier_l($ou_fichier) { 15 39 16 // Initialisation du tableau des resultats 17 // Si une erreur se produit lors du deroulement de la fonction, le tableau contient le libelle 18 // de l'erreur dans $resultats['erreur']. 19 // Sinon, cet index n'existe pas 20 $resultats = array(); 21 22 // On cherche l'ensemble des items utilises dans l'arborescence $ou_fichier 23 $utilises_brut = array('items' => array()); 24 // On ne scanne pas dans les ultimes sous-repertoires charsets/ , 25 // lang/ , req/ . On ne scanne que les fichiers php 26 // (voir le fichier regexp.txt). 27 foreach (preg_files(_DIR_RACINE.$ou_fichier, '(?<!/charsets|/lang|/req)(/[^/]*\.(php))$') as $_fichier) { 40 $item_md5 = array(); 41 $fichier_non = array(); 42 $files = preg_files(_DIR_RACINE.$ou_fichier, _LANGONET_FILES); 43 foreach ($files as $_fichier) { 28 44 foreach ($contenu = file($_fichier) as $ligne => $texte) { 29 $trouver_item = _LANGONET_TROUVER_FONCTION_L_P; 30 if (preg_match_all($trouver_item, $texte, $matches)) { 31 $utilises_brut['items'] = array_merge($utilises_brut['items'], $matches[1]); 32 // On collecte pour chaque item trouve les lignes et fichiers dans lesquels il est utilise 33 foreach ($matches[1] as $_item_val) { 34 $item_val = addcslashes($_item_val,"$()"); 35 preg_match("`.{0,8}_L\([\"']".$item_val.".{0,20}`is", $texte, $extrait); 36 // On indexe avec le md5 de la valeur de _L() car parfois cette valeur 37 // contient des caracteres non echappes qui perturbent l'indexation du tableau 38 // Il faudra donc traiter l'affichage correspondant a cette option 39 $item_tous[md5($_item_val)][$_fichier][$ligne][] = trim($extrait[0]); 45 if (preg_match_all(_LANGONET_FONCTION_L, $texte, $m, PREG_SET_ORDER)) 46 foreach ($m as $occ) { 47 $index = langonet_index_l($occ[1], $item_md5); 48 $item_md5[$index] = $occ[1]; 49 $fichier_non[$index][$_fichier][$ligne][] = trim($occ[0]); 40 50 } 41 } 51 if (preg_match_all(_LANGONET_FONCTION_L2, $texte, $m, PREG_SET_ORDER)) 52 foreach ($m as $occ) { 53 $index = langonet_index_l($occ[1], $item_md5); 54 $item_md5[$index] = $occ[1]; 55 $fichier_non[$index][$_fichier][$ligne][] = trim($occ[0]); 56 } 42 57 } 43 58 } 44 59 45 // On affine le tableau resultant en supprimant les doublons 46 // et on construit la liste des items utilises mais non definis 47 $item_non = array(); 48 $item_md5 = array(); 49 $fichier_non = array(); 50 foreach ($utilises_brut['items'] as $_cle => $_valeur) { 51 if (!in_array($_valeur, $item_non)) { 52 $item_non[] = $_valeur; 53 $index = md5($_valeur); 54 $item_md5[$index] = $_valeur; 55 if (is_array($item_tous[$index])) { 56 $fichier_non[$index] = $item_tous[$index]; 57 } 60 return array('ou_fichier' => $ou_fichier, 61 'item_non' => array_values($item_md5), // est-ce utile ? 62 'fichier_non' => $fichier_non, 63 'item_md5' => $item_md5); 64 } 65 66 /// Calcul du representant canonique d'un premier argument de _L. 67 /// C'est un transcodage ASCII, reduits aux 32 premiers caracteres, 68 /// les caracteres non alphabetiques etant remplaces par un souligne. 69 /// On elimine les repetitions de mots pour evacuer le cas frequent truc: @truc@ 70 /// Si plus que 32 caracteres, on elimine les mots de moins de 3 lettres. 71 /// Si toujours trop, on coupe au dernier mot complet avant 32 caracteres. 72 /// C'est donc le tableau des chaines de langues manquant; 73 /// toutefois, en cas d'homonymie d'index, on prend le md5, qui est illisible. 74 75 /// @param string $occ 76 /// @param array item_md5 77 /// @return string 78 79 function langonet_index_l($occ, $item_md5) 80 { 81 $index = textebrut($occ); 82 $index = preg_replace('/\\\\[nt]/', ' ', $index); 83 $index = strtolower(translitteration($index)); 84 $index = trim(preg_replace('/\W+/', ' ', $index)); 85 $index = preg_replace('/\b(\w+)\W+\1/', '\1', $index); 86 if (strlen($index) > 32) { 87 // trop long: abandonner les petits mots 88 $index = preg_replace('/\b\w{1,3}\W/', '', $index); 89 if (strlen($index) > 32) { 90 // tant pis mais couper proprement 91 $index = substr($index, 0, 32); 92 $index = substr($index, 0, strrpos($index,' ')); 58 93 } 59 94 } 95 $index = str_replace(' ', '_', trim($index)); 96 if (isset($item_md5[$index]) AND $item_md5[$index] !== $occ) 97 $index = md5($occ); 60 98 61 // On prepare le tableau des resultats 62 $resultats['ou_fichier'] = $ou_fichier; 63 $resultats['item_non'] = $item_non; 64 $resultats['fichier_non'] = $fichier_non; 65 $resultats['item_md5'] = $item_md5; 66 67 return $resultats; 99 return $index; 68 100 } 69 70 101 ?>
Note: See TracChangeset
for help on using the changeset viewer.