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

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

on peut forcer un dir_repo arbitraire pour les modules restant inconnus dans le fichier traductions et finir ainsi l'upgrade

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