source: spip-zone/_plugins_/trad-lang/trunk/inc/salvatore_lecteur.php @ 119736

Last change on this file since 119736 was 119736, checked in by Cerdic, 2 years ago

lecteur : refactoring + retrouver un module meme si le dir_module vient de changer a cause d'un changement de repo/methode/branche

  • Property svn:eol-style set to native
File size: 20.2 KB
Line 
1<?php
2
3/*
4    This file is part of Salvatore, the translation robot of Trad-lang (SPIP)
5
6    Salvatore is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 2 of the License, or
9    (at your option) any later version.
10
11    Trad-Lang is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with Trad-Lang; if not, write to the Free Software
18    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19
20    Copyright 2003-2015
21        Florent Jugla <florent.jugla@eledo.com>,
22        Philippe Riviere <fil@rezo.net>,
23        Chryjs <chryjs!@!free!.!fr>,
24                kent1 <kent1@arscenic.info>
25*/
26
27
28include_spip('base/abstract_sql');
29include_spip('inc/charsets');
30include_spip('inc/filtres');
31include_spip('inc/texte');
32include_spip('inc/xml');
33include_spip('inc/lang_liste');
34include_spip('inc/session');
35
36/**
37 * @param array $liste_sources
38 * @param string $dir_modules
39 * @throws Exception
40 */
41function salvatore_lire($liste_sources, $dir_modules = null){
42        include_spip('inc/salvatore');
43        salvatore_init();
44
45        // on va modifier a la base, il faut qu'elle soit a jour
46        salvatore_verifier_base_upgradee();
47
48        if (is_null($dir_modules)){
49                $dir_modules = _DIR_SALVATORE_MODULES;
50        }
51        salvatore_check_dir($dir_modules);
52        $refresh_time = time()-_SALVATORE_LECTEUR_REFRESH_DELAY;
53
54        $tradlang_verifier_langue_base = charger_fonction('tradlang_verifier_langue_base', 'inc', true);
55        $tradlang_verifier_bilans = charger_fonction('tradlang_verifier_bilans', 'inc', true);
56        $invalider = false;
57
58        foreach ($liste_sources as $source){
59                salvatore_log("\n<info>--- Module " . $source['module'] . " | " . $source['dir_module'] . " | " . $source['url'] . "</info>");
60
61                $module = $source['module'];
62                $dir_module = $dir_modules . $source['dir_module'];
63
64                if ($autre_gestionnaire = salvatore_verifier_gestionnaire_traduction($dir_module, $module)){
65                        salvatore_fail("[Lecteur] Erreur sur $module", "Erreur : import impossible, le fichier est traduit autre part : $autre_gestionnaire\n");
66                }
67
68                /**
69                 * on doit absolument charger la langue principale en premier (a cause des MD5)
70                 */
71                $fichier_lang_principal = $dir_module . '/' . $module . '_' . $source['lang'] . '.php';
72                $liste_fichiers_lang = glob($dir_module . '/' . $module . '_*.php');
73                $liste_fichiers_lang = array_diff($liste_fichiers_lang, [$fichier_lang_principal]);
74
75                if (!in_array($fichier_lang_principal, $liste_fichiers_lang)){
76                        salvatore_fail("[Lecteur] Erreur sur $module", "|-- Pas de fichier lang principal $fichier_lang_principal : import impossible pour ce module");
77                }
78
79                /**
80                 * On regarde quelle est la date de dernière modification du fichier de langue principale
81                 */
82                $last_update = filemtime($fichier_lang_principal);
83
84                if ($row_module = salvatore_retrouver_tradlang_module($dir_module, $module)) {
85                        $id_module = intval($row_module['id_tradlang_module']);
86                        /**
87                         * Si la langue mere a changée, on la modifie
88                         */
89                        if ($row_module['lang_mere']!==$source['lang']){
90                                sql_updateq('spip_tradlang_modules', array('lang_mere' => $source['lang']), 'id_tradlang_module = ' . intval($id_module));
91                                $last_update = time();
92                        }
93                        /**
94                         * Si le dir_module a change, on le met a jour
95                         */
96                        if ($row_module['dir_module']!==$source['dir_module']){
97                                sql_updateq('spip_tradlang_modules', array('dir_module' => $source['dir_module']), 'id_tradlang_module = ' . intval($id_module));
98                                $last_update = time();
99                        }
100                }
101
102                $langues_a_jour = array();
103
104                if (!$row_module or $last_update>$refresh_time){
105                        $priorite = '';
106                        $modifs = 0;
107                        if (defined('_TRAD_PRIORITE_DEFAUT')){
108                                $priorite = _TRAD_PRIORITE_DEFAUT;
109                        }
110
111                        /**
112                         * Si le module n'existe pas... on le crée
113                         */
114                        if (!$row_module or !$id_module = intval($row_module['id_tradlang_module'])){
115                                $insert = [
116                                        'module' => $source['module'],
117                                        'dir_module' => $source['dir_module'],
118                                        'nom_mod' => $source['module'],
119                                        'lang_prefix' => $source['module'],
120                                        'lang_mere' => $source['lang'],
121                                        'priorite' => $priorite,
122                                ];
123                                $id_module = sql_insertq('spip_tradlang_modules', $insert);
124                                /**
125                                 * Si insertion echoue on fail
126                                 */
127                                if (!intval($id_module)){
128                                        salvatore_fail("[Lecteur] Erreur sur $module", "Echec insertion dans spip_tradlang_modules " . json_encode($insert));
129                                }
130                        }
131                }
132                // Pas de mise a jour recente du fichier maitre deja en base
133                else {
134                        salvatore_log("On ne modifie rien : fichier original $fichier_lang_principal inchangé depuis " . date("Y-m-d H:i:s", $last_update));
135                        $id_module=intval($row_module['id_tradlang_module']);
136
137                        /**
138                         * Le fichier d'origine n'a pas été modifié
139                         * Mais on a peut être de nouvelles langues
140                         */
141                        $langues_en_base = sql_allfetsel('DISTINCT lang', 'spip_tradlangs', 'id_tradlang_module = ' . intval($id_module));
142                        $langues_en_base = array_column($langues_en_base, 'lang');
143
144                        $langues_a_ajouter = array();
145                        foreach ($liste_fichiers_lang as $fichier_lang){
146                                $lang = salvatore_get_lang_from($module, $fichier_lang);
147                                if (!in_array($lang, $langues_en_base)){
148                                        $langues_a_ajouter[] = array('lang' => $lang, 'fichier' => $fichier_lang);
149                                }
150                                else {
151                                        // inutile de regarder ce fichier
152                                        $langues_a_jour[] = $lang;
153                                }
154                        }
155
156                        $liste_fichiers_lang = array();
157                        if ($langues_a_ajouter){
158                                salvatore_log('On a ' . count($langues_a_ajouter) . " nouvelle(s) langue(s) à insérer");
159                                $liste_fichiers_lang = array_column($langues_a_ajouter, 'fichier');
160                        }
161                }
162
163                // traiter les fichiers lang
164                if (count($liste_fichiers_lang)) {
165
166                        // on commence par la langue mere
167                        $liste_md5_master = array();
168                        $modifs_master = salvatore_importer_module_langue($id_module, $source, $fichier_lang_principal, true, $liste_md5_master);
169
170                        // et on fait les autres langues
171                        foreach ($liste_fichiers_lang as $fichier_lang){
172                                salvatore_importer_module_langue($id_module, $source, $fichier_lang, false, $liste_md5_master);
173
174                                $lang = salvatore_get_lang_from($module, $fichier_lang);
175                                if ($modifs_master>0) {
176                                        if ($tradlang_verifier_langue_base) {
177                                                // TODO : check la fonction et utiliser sans doute id_tradlang_module plutot que module
178                                                $tradlang_verifier_langue_base($module, $lang);
179                                                salvatore_log('|-- Synchro de la langue ' . $lang . ' pour le module ' . $source['module']);
180                                        }
181                                        else {
182                                                salvatore_log("<error>|-- Pas de Fonction de synchro inexistante pour synchroniser lang $lang</error>");
183                                        }
184                                }
185                                $langues_a_jour[] = $lang;
186                        }
187
188                        /**
189                         * On s'occupe des langues en base sans fichier
190                         * s'il y a eu au moins une modif et que l'on peut faire la synchro
191                         */
192                        if ($modifs_master>0 and $tradlang_verifier_langue_base){
193                                $langues_en_base = sql_allfetsel('DISTINCT lang', 'spip_tradlangs', 'id_tradlang_module = ' . intval($id_module));
194                                $langues_en_base = array_column($langues_en_base, 'lang');
195
196                                if ($langues_pas_a_jour = array_diff($langues_en_base, $langues_a_jour)) {
197                                        foreach ($langues_pas_a_jour as $langue_todo){
198                                                $tradlang_verifier_langue_base($module, $langue_todo);
199                                                salvatore_log("|-- Synchro de la langue non exportée en fichier $langue_todo pour le module $module");
200                                        }
201                                }
202                        }
203
204                        $invalider = true;
205                        salvatore_log("|");
206                        unset($langues_a_jour, $langues_pas_a_jour);
207                }
208
209                // Mise à jour des bilans
210                if ($tradlang_verifier_bilans){
211                        salvatore_log("Création ou MAJ des bilans du module #$id_module $module");
212                        $tradlang_verifier_bilans($id_module, $source['lang'], false);
213                        salvatore_log("-");
214                }
215        }
216
217        if ($invalider){
218                include_spip('inc/invalideur');
219                suivre_invalideur('1');
220        }
221}
222
223/**
224 * Import d'un fichier de langue dans la base
225 *
226 * @param int $id_module
227 * @param array $source
228 *   tableau decrivant le module extrait du fichier traductions
229 * @param string $fichier_lang
230 *   chemin vers le fichier de langue
231 * @param bool $is_master
232 *   true signifie que c'est la langue originale
233 * @param array $liste_md5_master
234 * @return string
235 */
236function salvatore_importer_module_langue($id_module, $source, $fichier_lang, $is_master, &$liste_md5_master){
237        salvatore_log("!\n+ Import de $fichier_lang\n");
238        $idx = $GLOBALS['idx_lang'] = 'i18n_' . crc32($fichier_lang) . '_tmp';
239
240        $lang = salvatore_get_lang_from($source['module'], $fichier_lang);
241        $module = $source['module'];
242
243        // charger le fichier et ses commentaires
244        $GLOBALS[$idx] = null;
245        $commentaires = salvatore_charger_commentaires_fichier_langue($fichier_lang);
246
247        include $fichier_lang;
248        $chaines = $GLOBALS[$idx];  // on a vu certains fichiers faire des betises et modifier idx_lang
249
250        if (is_null($chaines)){
251                salvatore_envoyer_mail("[Lecteur] Erreur sur $module", "Erreur, fichier $fichier_lang mal forme");
252                return false;
253        }
254
255        /**
256         * Nettoyer le contenu de ses <MODIF>,<NEW> et <PLUS_UTILISE>
257         * Ces chaines sont utilisées comme statut
258         */
259        $status = array();
260
261        foreach ($chaines as $id => $chaine){
262                if ($is_master){
263                        $status[$id] = 'OK';
264                } else {
265                        if (preg_match(',^<(MODIF|NEW|PLUS_UTILISE)>,US', $chaine, $r)){
266                                $chaines[$id] = preg_replace(',^(<(MODIF|NEW|PLUS_UTILISE)>)+,US', '', $chaine);
267                                $status[$id] = $r[1];
268                        } else {
269                                $status[$id] = 'OK';
270                        }
271                }
272        }
273
274        $ajoutees = $inchangees = $supprimees = $modifiees = $ignorees = $recuperees = 0;
275
276        if (array_key_exists($lang, $GLOBALS['codes_langues'])) {
277                $statut_exclus = ($is_master ? 'attic' : 'MODIF');
278                $res = sql_select("id, str, md5", "spip_tradlangs", "id_tradlang_module=" . intval($id_module) . " AND lang=" . sql_quote($lang) . " AND statut!=" . sql_quote($statut_exclus));
279                $nb = sql_count($res);
280                if ($nb>0){
281                        salvatore_log("!-- Fichier de langue $lang du module $module deja inclus dans la base\n");
282                }
283
284                /**
285                 * Si la langue est deja dans la base, on ne l'ecrase que s'il s'agit
286                 * de la langue source
287                 */
288                if (!$nb or $is_master){
289                        // La liste de ce qui existe deja
290                        $existant = $str_existant = array();
291                        while ($row = sql_fetch($res)){
292                                $existant[$row['id']] = $row['md5'];
293                                $str_existant[$row['id']] = $row['str'];
294                        }
295
296                        $bigwhere = "id_tradlang_module=" . intval($id_module) . ' AND lang = ' . sql_quote($lang);
297
298                        include_spip('action/editer_tradlang');
299                        // Dans ce qui arrive, il y a 4 cas :
300                        $ids = array_unique(array_merge(array_keys($existant), array_keys($chaines)));
301                        foreach ($ids as $id){
302                                $comm = (isset($commentaires[$id])) ? $commentaires[$id] : '';
303
304                                /**
305                                 * 1. chaine neuve
306                                 */
307                                if (isset($chaines[$id]) and !isset($existant[$id])){
308                                        $md5 = null;
309                                        if ($is_master){
310                                                $md5 = md5($chaines[$id]);
311                                        } else {
312                                                if (!isset($liste_md5_master[$id])){
313                                                        salvatore_log("<info>!-- Chaine $id inconnue dans la langue principale</info>");
314                                                        $ignorees++;
315                                                } else {
316                                                        $md5 = $liste_md5_master[$id];
317                                                }
318                                        }
319
320                                        if ($md5){
321                                                $chaines[$id] = salvatore_nettoyer_chaine_php($chaines[$id], $lang);
322
323                                                /**
324                                                 * Calcul du nouveau md5
325                                                 */
326                                                $md5 = md5($chaines[$id]);
327
328                                                /**
329                                                 * Si le commentaire est un statut et que l'on ne traite pas le fichier de langue mère
330                                                 * On vire le commentaire et met son contenu comme statut
331                                                 */
332                                                if (in_array($comm, array('NEW', 'OK', 'MODIF', 'MODI')) and !$is_master){
333                                                        if ($comm=='MODI'){
334                                                                $comm = 'MODIF';
335                                                        }
336                                                        $status[$id] = $comm;
337                                                        $comm = '';
338                                                } else {
339                                                        if ((strlen($comm)>1) && preg_match('/(.*?)(NEW|OK|MODIF)(.*?)/', $comm, $matches)){
340                                                                if (!$is_master){
341                                                                        $status[$id] = $matches[2];
342                                                                }
343                                                                $comm = preg_replace('/(NEW|OK|MODIF)/', '', $comm);
344                                                        }
345                                                }
346
347                                                /**
348                                                 * On génère un titre
349                                                 */
350                                                $titre = $id . ' : ' . $source['module'] . ' - ' . $lang;
351
352                                                $set = array(
353                                                        'id_tradlang_module' => $id_module,
354                                                        'titre' => $titre,
355                                                        'module' => $source['module'],
356                                                        'lang' => $lang,
357                                                        'id' => $id,
358                                                        'str' => $chaines[$id],
359                                                        'comm' => $comm,
360                                                        'md5' => $md5,
361                                                        'statut' => $status[$id]
362                                                );
363                                                $id_tradlang = sql_insertq('spip_tradlangs', $set);
364
365                                                /**
366                                                 * L'identifiant de la chaîne de langue a peut être déjà été utilisé puis mis au grenier
367                                                 * On le récupère donc
368                                                 */
369                                                if (!$id_tradlang){
370                                                        $tradlang = sql_fetsel('*', 'spip_tradlangs', 'id = ' . sql_quote($id) . ' AND id_tradlang_module = ' . intval($id_module) . 'AND lang = ' . sql_quote($lang) . ' AND statut = ' . sql_quote('attic'));
371                                                        if (is_array($tradlang)){
372                                                                $id_tradlang = intval($tradlang['id_tradlang']);
373                                                                salvatore_log("<info>Recuperation d'une chaine de statut ATTIC</info>");
374                                                                sql_updateq('spip_tradlangs', $set, 'id_tradlang=' . intval($id_tradlang));
375
376                                                                $trads = sql_allfetsel('id_tradlang', 'spip_tradlangs', 'id = ' . sql_quote($id) . ' AND id_tradlang_module = ' . intval($id_module) . 'AND lang != ' . sql_quote($lang) . ' AND statut = ' . sql_quote('attic'));
377                                                                $maj = array('statut' => 'MODIF');
378                                                                foreach ($trads as $trad){
379                                                                        salvatore_log("Changement de la trad #" . $trad['id_tradlang'] . " ATTIC => MODIF");
380                                                                        sql_updateq('spip_tradlangs', $maj, 'id_tradlang = ' . intval($trad['id_tradlang']));
381                                                                }
382                                                                $recuperees++;
383                                                        }
384                                                }
385
386                                                /**
387                                                 * Vérifier si une autre chaîne de langue était identique (str == str)
388                                                 *
389                                                 * Si oui, on sélectionne toutes les occurences existantes dans les autres langues et on les duplique
390                                                 */
391                                                $identique_module = sql_getfetsel('id', 'spip_tradlangs', 'id_tradlang_module = ' . intval($id_module) . ' AND lang = ' . sql_quote($lang) . ' AND str = ' . sql_quote($chaines[$id]));
392                                                if ($identique_module){
393                                                        salvatore_log('La nouvelle chaine est une chaine dupliquée : ' . $identique_module);
394
395                                                        $chaines_a_dupliquer = sql_allfetsel('*', 'spip_tradlangs', 'id = ' . sql_quote($identique_module) . ' AND id_tradlang_module = ' . intval($id_module) . ' AND lang != ' . sql_quote($lang));
396                                                        foreach ($chaines_a_dupliquer as $chaine){
397                                                                unset($chaine['id_tradlang']);
398                                                                unset($chaine['maj']);
399                                                                $chaine['id'] = $id;
400                                                                $chaine['titre'] = $id . ' : ' . $source['module'] . ' - ' . $chaine['lang'];
401                                                                $chaine['md5'] = md5($chaine['str']);
402                                                                $chaine['date_modif'] = date('Y-m-d H:i:s');
403                                                                if ($chaine['statut']=='attic'){
404                                                                        $chaine['statut'] = 'NEW';
405                                                                }
406                                                                $nouvelle_chaine = sql_insertq('spip_tradlangs', $chaine);
407                                                                salvatore_log('Ajout de la version ' . $chaine['lang'] . ' - #' . $nouvelle_chaine);
408                                                        }
409                                                }
410                                                $ajoutees++;
411                                        }
412                                }
413
414
415                                /**
416                                 * 2. chaine existante
417                                 *
418                                 */
419                                elseif (isset($chaines[$id]) and isset($existant[$id])) {
420                                        // * chaine existante
421                                        // * identique ? => NOOP
422                                        $chaines[$id] = salvatore_nettoyer_chaine_php($chaines[$id], $lang);
423
424                                        /**
425                                         * Calcul du nouveau md5
426                                         */
427                                        $md5 = md5($chaines[$id]);
428                                        if ($md5 === $existant[$id]){
429                                                $inchangees++;
430                                        }
431                                        else {
432                                                // * modifiee ? => UPDATE
433                                                salvatore_log("Chaine $id modifiee $md5 != ".$existant[$id]);
434
435                                                // modifier la chaine
436                                                $modifs = array(
437                                                        'str' => $chaines[$id],
438                                                        'md5' => ($is_master ? $md5 : $existant[$id]),
439                                                        'statut' => ($is_master ? 'OK' : ''),
440                                                        'comm' => $comm,
441                                                );
442                                                $id_tradlang = sql_getfetsel('id_tradlang', 'spip_tradlangs', "$bigwhere AND id = " . sql_quote($id));
443                                                $test = tradlang_set($id_tradlang, $modifs);
444
445                                                /**
446                                                 * signaler le statut MODIF de ses traductions OK
447                                                 * update des str de ses traductions NEW
448                                                 */
449                                                if ($is_master){
450                                                        sql_updateq('spip_tradlangs', array('statut'=> 'MODIF'),
451                                                                'id_tradlang_module=' . intval($id_module)
452                                                                . ' AND id=' . sql_quote($id)
453                                                                . ' AND md5!=' . sql_quote($md5)
454                                                                . ' AND lang!=' . sql_quote($lang)
455                                                                . ' AND statut!=' . sql_quote('NEW'));
456                                                }
457                                                sql_updateq('spip_tradlangs', array('str'=> $chaines[$id]),
458                                                        'id_tradlang_module=' . intval($id_module)
459                                                        . ' AND id=' . sql_quote($id)
460                                                        . ' AND md5!=' . sql_quote($md5)
461                                                        . ' AND lang!=' . sql_quote($lang)
462                                                        . ' AND statut=' . sql_quote('NEW'));
463                                                $modifiees++;
464                                        }
465                                }
466
467                                /**
468                                 * 3. chaine supprimee
469                                 *
470                                 */
471                                elseif (!isset($chaines[$id]) and isset($existant[$id])) {
472                                        // * chaine supprimee
473                                        // mettre au grenier
474                                        sql_updateq('spip_tradlangs', array('statut' => 'attic'), 'id_tradlang_module=' . intval($id_module) . ' AND id=' . sql_quote($id));
475                                        $supprimees++;
476                                }
477
478                                if ($is_master and isset($chaines[$id])){
479                                        $liste_md5_master[$id] = md5($chaines[$id]);
480                                }
481                        }
482                        salvatore_log('!-- module ' . $source['module'] . ", $lang : $modifiees modifiees, $ajoutees ajoutees, $supprimees supprimees, $recuperees recuperees, $ignorees ignorees, $inchangees inchangees");
483                }
484        }
485        else {
486                salvatore_log("<error>!-- Attention : La langue $lang n'existe pas dans les langues possibles - $module</error>");
487        }
488
489        // TODO : BUG ?
490        // unset $liste_md5_master alors qu'elle est repassee d'un appel a l'autre ?
491        unset($liste_md5_master, $chaines, $GLOBALS[$GLOBALS['idx_lang']]);
492
493        return $ajoutees + $supprimees + $modifiees;
494}
495
496
497/**
498 * Chargement des commentaires de fichier de langue
499 * Le fichier est chargé en mode texte pour récupérer les commentaires dans lesquels sont situés les statuts
500 *
501 * @param string $fichier_lang Le chemin du fichier de langue
502 * @return array $liste_trad Un tableau id/chaine
503 */
504function salvatore_charger_commentaires_fichier_langue($fichier_lang){
505
506        $contenu = file_get_contents($fichier_lang);
507
508        $tab = preg_split("/\r\n|\n\r|;\n|\n\/\/|\(\n|\n\);\n|\'\,\n|\n[\s\t]*(\')|\/\/[\s\t][0-9A-Z]\n[\s\t](\')/", $contenu, '-1', PREG_SPLIT_NO_EMPTY);
509
510        $liste_trad = array();
511        reset($tab);
512
513        while (list(, $ligne) = each($tab)){
514                $ligne = str_replace("\'", '', $ligne);
515                if (strlen($ligne)>0){
516                        if (preg_match("/(.*?)\'[\s\t]*=>[\s\t]*\'(.*?)\'[\s\t]*,{0,1}[\s\t]*(#.*)?/ms", $ligne, $matches)){
517                                if (isset($matches[1]) and isset($matches[3]) and strlen(trim($matches[3]))>0){
518                                        list(, $comm) = explode('#', $matches[3]);
519                                        $liste_trad[$matches[1]] = trim($comm);
520                                }
521                        }
522                }
523        }
524        reset($liste_trad);
525        return $liste_trad;
526}
527
528/**
529 * Nettoyer la chaine de langue venant du fichier PHP
530 * @param string $chaine
531 * @param string $lang
532 * @return string
533 */
534function salvatore_nettoyer_chaine_php($chaine, $lang){
535        static $typographie_functions = array();
536
537        if (!isset($typographie_functions[$lang])){
538                $typo = (in_array($lang, array('eo', 'fr', 'cpf')) || strncmp($lang, 'fr_', 3)==0) ? 'fr' : 'en';
539                $typographie_functions[$lang] = charger_fonction($typo, 'typographie');
540        }
541
542        /**
543         * On enlève les sauts de lignes windows pour des sauts de ligne linux
544         */
545
546        $chaine = str_replace("\r\n", "\n", $chaine);
547
548        /**
549         * protection dans les balises genre <a href="..." ou <img src="..."
550         * cf inc/filtres
551         */
552        if (preg_match_all(_TYPO_BALISE, $chaine, $regs, PREG_SET_ORDER)){
553                foreach ($regs as $reg){
554                        $insert = $reg[0];
555                        // hack: on transforme les caracteres a proteger en les remplacant
556                        // par des caracteres "illegaux". (cf corriger_caracteres())
557                        $insert = strtr($insert, _TYPO_PROTEGER, _TYPO_PROTECTEUR);
558                        $chaine = str_replace($reg[0], $insert, $chaine);
559                }
560        }
561
562        /**
563         * Protéger le contenu des balises <html> <code> <cadre> <frame> <tt> <pre>
564         */
565        define('_PROTEGE_BLOCS_HTML', ',<(html|code|cadre|pre|tt)(\s[^>]*)?>(.*)</\1>,UimsS');
566        if ((strpos($chaine, '<')!==false) and preg_match_all(_PROTEGE_BLOCS_HTML, $chaine, $matches, PREG_SET_ORDER)){
567                foreach ($matches as $reg){
568                        $insert = $reg[0];
569                        // hack: on transforme les caracteres a proteger en les remplacant
570                        // par des caracteres "illegaux". (cf corriger_caracteres())
571                        $insert = strtr($insert, _TYPO_PROTEGER, _TYPO_PROTECTEUR);
572                        $chaine = str_replace($reg[0], $insert, $chaine);
573                }
574        }
575
576        /**
577         * On applique la typographie de la langue
578         */
579        $chaine = $typographie_functions[$lang]($chaine);
580
581        /**
582         * On remet les caractères normaux sur les caractères illégaux
583         */
584        $chaine = strtr($chaine, _TYPO_PROTECTEUR, _TYPO_PROTEGER);
585
586        $chaine = unicode_to_utf_8(html_entity_decode(preg_replace('/&([lg]t;)/S', '&amp;\1', $chaine), ENT_NOQUOTES, 'utf-8'));
587
588        return $chaine;
589}
Note: See TracBrowser for help on using the repository browser.