source: spip-zone/_plugins_/langonet/inc/langonet_verifier_l.php @ 53560

Last change on this file since 53560 was 53560, checked in by eric@…, 9 years ago

Une version qui propose pour la fonction _L() :

  • un log
  • le fichier de langue corrigé
  • le fichier de commandes de remplacement des _L en _T (au même endroit que le le log)

Il reste juste à traiter le cas ou le fichier de langue initial n'existe pas et ou il faut saisir le nom du module et la la,gue de référence.

  • Property svn:eol-style set to native
File size: 3.6 KB
Line 
1<?php
2
3if (!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
11define("_LANGONET_FONCTION_L", 
12#       "`_L\([\"'](.+)(?:[,\"']|[\"'][,].*)\)`iUm"); # old
13        '#\b_L *[(] *"([^"]*)"[^)]*#');
14
15define("_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
28define('_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
40function 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
83function 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
95                        $index = substr($index, 0, 32);
96                        $index = substr($index, 0, strrpos($index,' '));
97                }
98        }
99        $index = str_replace(' ', '_', trim($index));
100        if (isset($item_md5[$index]) AND $item_md5[$index] !== $occ)
101                $index = md5($occ);
102
103        return $index;
104}
105?>
Note: See TracBrowser for help on using the repository browser.