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

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

pas d'espace sur les operateurs de comparaison dans le sql

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