Changeset 52390 in spip-zone


Ignore:
Timestamp:
Oct 3, 2011, 7:31:46 PM (8 years ago)
Author:
esj@…
Message:

_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.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/langonet/inc/langonet_verifier_l.php

    r45964 r52390  
    11<?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
    63/**
    7  * Vérification de l'utilisation de la fonction _L() dans le code PHP
     4 * Verification de l'utilisation de la fonction _L() dans le code PHP
    85 *
    9  * @param string $ou_fichier
    10  * @return array
    116 */
    127
    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
     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
    1438function inc_langonet_verifier_l($ou_fichier) {
    1539
    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) {
    2844                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]);
    4050                                }
    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                                }
    4257                }
    4358        }
    4459
    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
     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,' '));
    5893                }
    5994        }
     95        $index = str_replace(' ', '_', trim($index));
     96        if (isset($item_md5[$index]) AND $item_md5[$index] !== $occ)
     97                $index = md5($occ);
    6098
    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;
    68100}
    69 
    70101?>
Note: See TracChangeset for help on using the changeset viewer.