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

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

_plugins_/langonet: gérer la nomenclature d'un argument de _L non pas avec son md5, mais avec son transcodage intuitif (caractère non alphabétique rempacé par _, suppression des petits mots si résultat trop long) afin de proposer à terme un fichier de langue utilisable.

  • Property svn:eol-style set to native
File size: 3.6 KB
Line 
1<?php
2/// @file
3/**
4 * Verification de l'utilisation de la fonction _L() dans le code PHP
5 *
6 */
7
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
10define("_LANGONET_FONCTION_L", 
11#       "`_L\([\"'](.+)(?:[,\"']|[\"'][,].*)\)`iUm"); # old
12        '#\b_L *[(] *"([^"]*)"[^)]*#');
13
14define("_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
27define('_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
38function inc_langonet_verifier_l($ou_fichier) {
39
40        $item_md5 = array();
41        $fichier_non = array();
42        $files = preg_files(_DIR_RACINE.$ou_fichier, _LANGONET_FILES);
43        foreach ($files as $_fichier) {
44                foreach ($contenu = file($_fichier) as $ligne => $texte) {
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]);
50                                }
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                                }
57                }
58        }
59
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
79function 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,' '));
93                }
94        }
95        $index = str_replace(' ', '_', trim($index));
96        if (isset($item_md5[$index]) AND $item_md5[$index] !== $occ)
97                $index = md5($occ);
98
99        return $index;
100}
101?>
Note: See TracBrowser for help on using the repository browser.