Changeset 52392 in spip-zone


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

_plugins_/langonet: dans le cas du repérage des appels à _L, faire du fichier de log un script Shell dont l'exécution montre les transformations de _L en _T avec ses libellés des chaînes de langues. Si ok, il suffit de réexecuter le script avec "mv" comme argument pour provoquer le remplacement effectif de _L par _T, et il reste ensuite à prendre la fin du fichier de log (ou le flux de sortie de son exécution) pour disposer du contenu du fichier de langues à créer (ou à insérer dans un autre déjà existant).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/langonet/formulaires/langonet_verifier.php

    r43920 r52392  
    11<?php
     2/// @file
     3/**
     4 * Formulaire principal
     5 *
     6 */
    27
    38function formulaires_langonet_verifier_charger() {
     
    2025}
    2126
     27
     28
     29///Recuperation des champs du formulaire
     30///  $verification -> type de verification
     31///                  'definition' ou 'utilisation'
     32///  $rep          -> nom du repertoire parent de lang/
     33///                   'langonet' pour 'langonet/lang/'
     34///                   correspond generalement au 'nom' du plugin
     35///  $module       -> prefixe du fichier de langue
     36///                   'langonet' pour 'langonet_fr.php'
     37///                   parfois different du 'nom' du plugin
     38///  $langue       -> index du nom de langue
     39///                   'fr' pour 'langonet_fr.php'
     40///  $ou_langue    -> chemin vers le fichier de langue a verifier
     41///                   'plugins/auto/langonet/lang'
     42///  $ou_fichier   -> racine de l'arborescence a verifier
     43///                   'plugins/auto/langonet'
     44
    2245function formulaires_langonet_verifier_traiter() {
    2346
    24         // Recuperation des champs du formulaire
    25         //   $verification -> type de verification
    26         //                   'definition' ou 'utilisation'
    27         //   $rep          -> nom du repertoire parent de lang/
    28         //                    'langonet' pour 'langonet/lang/'
    29         //                    correspond generalement au 'nom' du plugin
    30         //   $module       -> prefixe du fichier de langue
    31         //                    'langonet' pour 'langonet_fr.php'
    32         //                    parfois different du 'nom' du plugin
    33         //   $langue       -> index du nom de langue
    34         //                    'fr' pour 'langonet_fr.php'
    35         //   $ou_langue    -> chemin vers le fichier de langue a verifier
    36         //                    'plugins/auto/langonet/lang'
    37         //   $ou_fichier   -> racine de l'arborescence a verifier
    38         //                    'plugins/auto/langonet'
    3947        $verification = _request('verification');
    4048        $ou_fichier = _request('dossier_scan');
     
    7684                $retour = array();
    7785                $resultats = $langonet_verifier_items($ou_fichier);
    78         }
    79 
    80         // Traitement des résultats
     86                $langue = 'fr'; // trouver comment generaliser
     87        }
     88
     89        // Traitement des resultats
    8190        if ($resultats['erreur']) {
    8291                $retour['message_erreur'] = $resultats['erreur'];
    8392        }
    8493        else {
    85                 $retour = formater_resultats($verification, $resultats, $corrections);
     94                $retour = formater_resultats($verification, $resultats, $corrections, $langue);
    8695        }
    8796        $retour['editable'] = true;
     
    98107 */
    99108
    100 // $resultats    => tableau des resultats (11 sous-tableaux) :
    101 //                    ["module"] => intitule module
    102 //                    ["ou_fichier"] => rep plugin
    103 //                    ["langue"] => nom fichier de lang
    104 //                    ["item_non"][] => intitule item
    105 //                    ["fichier_non"][item][fichier utilisant][num de la ligne][] => extrait ligne
    106 //                    ["item_non_mais_nok"][] => intitule item
    107 //                    ["fichier_non_mais_nok"][item][fichier utilisant][num de la ligne][] => extrait ligne
    108 //                    ["definition_non_mais_nok"][item][] => nom fichier de lang
    109 //                    ["item_non_mais"][] => intitule item
    110 //                    ["fichier_non_mais"][item][fichier utilisant][num de la ligne][] => extrait ligne
    111 //                    ["definition_non_mais"][item][] => nom fichier de lang
    112 //                    ["item_peut_etre"][] => intitule partiel item
    113 //                    ["fichier_peut_etre"][item][fichier utilisant][num de la ligne][] => extrait ligne
    114 // $verification => type de verification effectuee (definition ou utilisation)
    115 // $corrections  => tableau des resultats de la generation du fichier de langue corrige
    116 function formater_resultats($verification, $resultats, $corrections) {
     109/// $resultats    => tableau des resultats (11 sous-tableaux) :
     110///                    ["module"] => intitule module
     111///                    ["ou_fichier"] => rep plugin
     112///                    ["langue"] => nom fichier de lang
     113///                    ["item_non"][] => intitule item
     114///                    ["fichier_non"][item][fichier utilisant][num de la ligne][] => extrait ligne
     115///                    ["item_non_mais_nok"][] => intitule item
     116///                    ["fichier_non_mais_nok"][item][fichier utilisant][num de la ligne][] => extrait ligne
     117///                    ["definition_non_mais_nok"][item][] => nom fichier de lang
     118///                    ["item_non_mais"][] => intitule item
     119///                    ["fichier_non_mais"][item][fichier utilisant][num de la ligne][] => extrait ligne
     120///                    ["definition_non_mais"][item][] => nom fichier de lang
     121///                    ["item_peut_etre"][] => intitule partiel item
     122///                    ["fichier_peut_etre"][item][fichier utilisant][num de la ligne][] => extrait ligne
     123/// $verification => type de verification effectuee (definition ou utilisation)
     124/// $corrections  => tableau des resultats de la generation du fichier de langue corrige
     125function formater_resultats($verification, $resultats, $corrections, $langue) {
    117126
    118127        include_spip('inc/actions');
     
    234243                        $texte['non'] .= "</div><br />\n";
    235244                        $texte['non'] .= bouton_action(_T('langonet:bouton_corriger_definition'),
    236                                                                                         generer_action_auteur('langonet_telecharger', $corrections['fichier']),
    237                                                                                         "", "", _T('langonet:bulle_corriger_definition'));
     245                                                        generer_action_auteur('langonet_telecharger', $corrections['fichier']),
     246                                                        "", "", _T('langonet:bulle_corriger_definition'));
    238247                        $texte['non'] .= "</div>\n";
    239248                }
     
    287296
    288297        // Generation du fichier de log contenant le texte complet des resultats
    289         $ok = creer_log($verification, $resultats, $texte, $log_fichier);
     298        $ok = creer_log($verification, $resultats, $texte, $log_fichier, $langue);
    290299        if (!$ok) {
    291300                $retour['message_erreur'] .= _T('langonet:message_nok_fichier_log');
     
    310319 */
    311320
    312 // $type                => le type de resultats (non, non_mais, non_mais_nok, peut_etre)
    313 // $tableau     => [item][fichier utilisant][num ligne][] => extrait ligne
    314 // $extra               => [item][] => fichier de langue ou item est defini
    315 //                              ou [md5(item)] => item, ou l'item est l'argument de _L()
    316 // $f_coloriser => la fonction de colorisation ou NULL si le plugin coloration_code n'est pas actif 
     321/// $type               => le type de resultats (non, non_mais, non_mais_nok, peut_etre)
     322/// $tableau    => [item][fichier utilisant][num ligne][] => extrait ligne
     323/// $extra              => [item][] => fichier de langue ou item est defini
     324///                             ou [codage(item)] => item, ou l'item est l'argument de _L()
     325/// $f_coloriser        => la fonction de colorisation ou NULL si le plugin coloration_code n'est pas actif 
    317326function afficher_lignes($type, $tableau, $extra=array(), $f_coloriser) {
    318327
     
    322331        ksort($tableau);
    323332        foreach ($tableau as $item => $detail) {
    324                 if (preg_match(",[a-f0-9]{32},", $item))
    325                         // Cas de la verification fonction _L()
    326                         $item_affiche = htmlentities($extra[$item]);
    327                 else
    328                         $item_affiche = $item;
    329                 $liste_lignes .= bouton_block_depliable($item_affiche, false) .
     333                $liste_lignes .= bouton_block_depliable($item, false) .
    330334                                 debut_block_depliable(false) .
    331335                                 "<p style=\"padding-left:2em;\">\n  ".
    332336                                 _T('langonet:texte_item_utilise_ou')."\n<br />";       
    333                 foreach ($tableau[$item] as $fichier => $ligne) {
     337                foreach ($detail as $fichier => $lignes) {
    334338                        $liste_lignes .= "\t<span style=\"font-weight:bold;padding-left:2em;\">" .$fichier. "</span><br />\n";
    335                         foreach ($tableau[$item][$fichier] as $ligne_n => $ligne_t) {
    336                                 $L = intval($ligne_n+1);
     339                        foreach ($lignes as $ligne_n => $ligne_t) {
     340                                $L = sprintf("%04s", intval($ligne_n+1));
     341                                $T = '... '.$ligne_t[0].' ...';
    337342                                if ($f_coloriser) {
    338343                                        // Traitement de la coloration de l'extrait. C'est la fonction de coloration qui s'occupe des
     
    340345                                        $infos = pathinfo($fichier);
    341346                                        $extension = ($infos['extension'] == 'html') ? 'html4strict' : $infos['extension'];
    342                                         $T = $f_coloriser('... '.$ligne_t[0].' ...',  $extension, 'code', 'span');
    343                                 }
    344                                 else
    345                                         $T = '... '.htmlentities($ligne_t[0]).' ...';
    346                                 $liste_lignes .= "\t\t" . '<code style="padding-left:4em;text-indent: -5em;">L.'. sprintf("%04s", $L) .' : '.$T. "</code><br />\n";
     347                                        $T = $f_coloriser($T,  $extension, 'code', 'span');
     348                                } else $T = htmlspecialchars($T);
     349
     350                                $liste_lignes .= "\t\t<code style='padding-left:4em;text-indent: -5em;'>L$L : $T</code><br />\n";
    347351                        }
    348352                }
     
    355359                        }
    356360                        $liste_lignes .= "</p>\n";
    357                 }
    358                 else
    359                         if ($type == 'non_mais_nok') {
     361                } elseif ($type == 'non_mais_nok') {
    360362                                $liste_lignes .= "<p style=\"padding-left:2em;\">  " . _T('langonet:texte_item_non_defini') . "</p>\n<br />\n";
    361                         }
     363                }
    362364                $liste_lignes .= fin_block();
    363365        }
     
    366368}
    367369
     370/// Construit un script Shell s'appliquant sur les fichiers contenant _L
     371/// et affichant les ajouts au fichier de langue de ce qu'on evacue
     372
     373function evacue_L($resultats, $ou, $langue)
     374{
     375        $prefix = (strpos($ou, 'plugins') !== false)
     376                ? (strtolower(basename($ou)) .':') : '';
     377
     378        $sed = $items = array();
     379        foreach ($resultats['fichier_non'] as $index => $val) {
     380                $val = array_shift($val);
     381                $val = array_shift($val);
     382                $val = array_shift($val);
     383                // gestion des backslash imparfaite, mais c'est deja ca
     384                if (preg_match(_LANGONET_FONCTION_L, $val, $m))
     385                        $occ = str_replace('\\', '.', $m[1]);
     386                elseif (preg_match(_LANGONET_FONCTION_L2, $val, $m))
     387                        $occ = $m[1];
     388                else continue;
     389                // Un item avec $ est intraduisible.
     390                if (strpos($occ, '$') !== false)  continue;
     391                $items[$index]= $m[1];
     392                $occ = str_replace('%', '\\%', $occ);
     393                $cite = "s%_L *( *.$occ *.%_T('$prefix$index'%;";
     394                $sed[$cite]=strlen($occ);
     395        }
     396
     397        // Trier par ordre decroissant des longueurs des items a remplacer:
     398        // "truc_x" doit etre traite avant "truc"
     399        arsort($sed);
     400
     401        // Lister les fichiers concernes
     402        $files = array();
     403        foreach ($resultats["fichier_non"] as $j) {
     404                foreach($j as $f => $l) $files[$f]= str_replace(_DIR_RACINE . $ou, '', $f);
     405        }
     406        include_spip('inc/langonet_generer_fichier');
     407        $producteur = "Produit automatiquement par le plugin LangOnet collectant les appels de la fonction _L";
     408        $items = produire_fichier_langue($langue, $prefix, $items, $producteur);
     409        return "echo executer ce script dans $ou\n" .
     410                'if [ "$*" == "mv" ]; then comm=mv; else comm=diff; fi' .
     411                "\nfor i in " .
     412                join(" ", $files) .
     413                "\ndo\nr=\$(basename \$i)\nsed \"\n" .
     414                join("\n", array_keys($sed)) .
     415                "\n\" \$i > /tmp/\$r\n\$comm /tmp/\$r \$i\ndone\n" .
     416                "\necho \"****  A mettre en fichier de langue (sans \\ devant \$) ***\"\n\n" .
     417                "cat <<-EOF\n" .
     418                str_replace('$', '\$', $items) .
     419                "\nEOF" .
     420                "\n\nif [ \"$*\" != 'mv' ]; then echo \"Si correct, rappeler ce script avec 'mv' comme argument\"; fi";
     421}
     422
    368423/**
    369  * Cree le fichier de log avec le texte des resultats
     424 * Cree le fichier de log avec le texte des resultats.
     425 * Dans le cas _L cree un shell-script a executer.
    370426 *
    371427 * @param string $verification
     
    373429 * @param string $texte
    374430 * @param string &$log_fichier (nom du fichier cree retourne par reference)
     431 * @param string $langue
    375432 * @return boolean
    376433 */
    377 function creer_log($verification, $resultats, $texte, &$log_fichier) {
     434
     435function creer_log($verification, $resultats, $texte, &$log_fichier, $langue) {
    378436        // Fichier de log dans tmp/langonet/
    379         $log_prefixe = ($verification == 'fonction_l') ? str_replace("/", "%", $resultats['ou_fichier']) : basename($resultats['langue'], '.php') . '_';
     437        $ou =  $resultats['ou_fichier'];
     438        $log_prefixe = ($verification == 'fonction_l') ? str_replace("/", "%", $ou) : basename($resultats['langue'], '.php') . '_';
    380439        $log_nom = $log_prefixe . $verification[0] . '_' . date("Ymd_His").'.log';
    381440        $log_rep = sous_repertoire(_DIR_TMP, "langonet");
     
    386445        // Texte du fichier en UTF-8
    387446        include_spip('inc/langonet_utils');
     447
     448        $sep = str_repeat('*', 77);
     449
    388450        // -- En-tete resumant la verification
    389         $log_texte = "/* *****************************************************************************\n" .
    390         " * LangOnet : " . entite2utf(_T('langonet:entete_log_date_creation', array('log_date_jour' => affdate(date('Y-m-d H:i:s')), 'log_date_heure' => date('H:i:s'))))."\n" .
    391         " * *****************************************************************************\n" .
    392         " * " . entite2utf(_T('langonet:label_verification')) . " : " . entite2utf(_T('langonet:label_verification_'.$verification)) . "\n";
     451        $log_texte = "# $sep\n# LangOnet : " .
     452          entite2utf(_T('langonet:entete_log_date_creation', array('log_date_jour' => affdate(date('Y-m-d H:i:s')), 'log_date_heure' => date('H:i:s')))) .
     453          "\n# $sep\n# " .
     454          entite2utf(_T('langonet:label_verification')) . " : " .
     455          entite2utf(_T('langonet:label_verification_'.$verification)) .
     456          "\n";
     457
    393458        if ($verification != 'fonction_l') {
    394                 $log_texte .= " * " . entite2utf(_T('langonet:label_module')) . " : " . entite2utf($resultats['module']) . "\n" .
    395                 " * " . entite2utf(_T('langonet:label_fichier_verifie')) . " : " . entite2utf($resultats['langue']) . "\n";
    396         }
    397         $log_texte .= " * " . entite2utf(_T('langonet:label_arborescence_scannee')) . " : " . entite2utf($resultats['ou_fichier']) . "\n" .
    398         " * *****************************************************************************\n" .
    399         " * " . entite2utf(_T('langonet:label_erreur')) . " : " . strval(count($resultats['item_non'])+count($resultats['item_non_mais_nok'])) . "\n";
     459                $log_texte .= " * " .
     460                  entite2utf(_T('langonet:label_module')) . " : " .
     461                  entite2utf($resultats['module']) . "\n# " .
     462                  entite2utf(_T('langonet:label_fichier_verifie')) . " : " .
     463                  entite2utf($resultats['langue']) . "\n";
     464        }
     465
     466        $log_texte .= "\n# " .
     467          entite2utf(_T('langonet:label_arborescence_scannee')) . " : " .
     468          entite2utf($resultats['ou_fichier']) .
     469          "\n# $sep\n# " .
     470          entite2utf(_T('langonet:label_erreur')) . " : " .
     471          strval(count($resultats['item_non'])+count($resultats['item_non_mais_nok'])) .
     472          "\n# $sep\n";
     473
    400474        if ($verification != 'fonction_l') {
    401                 $log_texte .= " * " . entite2utf(_T('langonet:label_avertissement')) . " : " . strval(count($resultats['item_non_mais'])+count($resultats['item_peut_etre'])) . "\n";
    402         }
    403         $log_texte .= " * *****************************************************************************/\n";
    404 
    405         // -- Texte des resultats: erreur (non definis ou non utilises)
    406         $log_texte .= "\n\n/* *****************************************************************************\n" .
    407         " * " . entite2utf(_T('langonet:entete_log_erreur_'.$verification)) . "\n" .
    408         " * *****************************************************************************/\n" .
    409         texte2log($texte['non']);
     475                $log_texte .= "\n# " . entite2utf(_T('langonet:label_avertissement')) . " : " . strval(count($resultats['item_non_mais'])+count($resultats['item_peut_etre'])) . "\n";
     476
     477                // -- Texte des resultats: erreur (non definis ou non utilises)
     478                $log_texte .= "\n# $sep\n * " .
     479                  entite2utf(_T('langonet:entete_log_erreur_'.$verification)) .
     480                  "\n# $sep\n" .
     481                  texte2log($texte['non']);
     482        }
     483
     484        if ($verification == 'definition') {
    410485
    411486        // -- Texte des resultats: erreur (non definis mais n'appartenant pas au module en cours de verification)
    412         if ($verification == 'definition') {
    413                 $log_texte .= "\n\n/* *****************************************************************************\n" .
    414                 " * " . entite2utf(_T('langonet:entete_log_erreur_definition_nonmais')) . "\n" .
    415                 " * *****************************************************************************/\n" .
    416                 texte2log($texte['non_mais_nok']);
    417         }
     487
     488                $log_texte .= "\n\n# $sep\n# " .
     489                  entite2utf(_T('langonet:entete_log_erreur_definition_nonmais')) .
     490                  "\n# $sep\n" .
     491                  texte2log($texte['non_mais_nok']);
    418492
    419493        // -- Texte des resultats: avertissement (definis mais dans un autre module)
    420         if ($verification == 'definition') {
    421                 $log_texte .= "\n\n/* *****************************************************************************\n" .
    422                 " * " . entite2utf(_T('langonet:entete_log_avertissement_nonmais')) . "\n" .
    423                 " * *****************************************************************************/\n" .
    424                 texte2log($texte['non_mais']);
     494                $log_texte .= "\n\n# $sep\n# " .
     495                  entite2utf(_T('langonet:entete_log_avertissement_nonmais')) .
     496                  "\n# $sep\n" .
     497                  texte2log($texte['non_mais']);
    425498        }
    426499
    427500        // -- Texte des resultats: avertissement (non definis ou non utilises sans certitude)
    428501        if ($verification != 'fonction_l') {
    429                 $log_texte .= "\n\n/* *****************************************************************************\n" .
    430                 " * " . entite2utf(_T('langonet:entete_log_avertissement_peutetre_'.$verification)) . "\n" .
    431                 " * *****************************************************************************/\n" .
     502                $log_texte .= "\n\n# $sep\n# " .
     503                  entite2utf(_T('langonet:entete_log_avertissement_peutetre_'.$verification)) .
     504                  "\n# $sep\n" .
    432505                texte2log($texte['peut_etre']);
    433         }
     506        } else $log_texte .= evacue_L($resultats, $ou, $langue);
    434507
    435508        $ok = ecrire_fichier($log_fichier, $log_texte);
Note: See TracChangeset for help on using the changeset viewer.