source: spip-zone/_plugins_/spip-listes/spip-listes_1_9_3/inc/spiplistes_api_courrier.php @ 43260

Last change on this file since 43260 was 43260, checked in by paladin@…, 10 years ago

remplacement ereg_replace par preg_replace + legere optimisation

  • Property svn:eol-style set to LF
  • Property svn:keywords set to LastChangedBy LastChangedDate LastChangedRevision
File size: 17.9 KB
Line 
1<?php
2
3// inc/spiplistes_api_courrier.php
4
5/******************************************************************************************/
6/* SPIP-Listes est un systeme de gestion de listes d'abonnes et d'envoi d'information     */
7/* par email pour SPIP. http://bloog.net/spip-listes                                      */
8/* Copyright (C) 2004 Vincent CARON  v.caron<at>laposte.net                               */
9/*                                                                                        */
10/* Ce programme est libre, vous pouvez le redistribuer et/ou le modifier selon les termes */
11/* de la Licence Publique Generale GNU publiee par la Free Software Foundation            */
12/* (version 2).                                                                           */
13/*                                                                                        */
14/* Ce programme est distribue car potentiellement utile, mais SANS AUCUNE GARANTIE,       */
15/* ni explicite ni implicite, y compris les garanties de commercialisation ou             */
16/* d'adaptation dans un but specifique. Reportez-vous a la Licence Publique Generale GNU  */
17/* pour plus de details.                                                                  */
18/*                                                                                        */
19/* Vous devez avoir recu une copie de la Licence Publique Generale GNU                    */
20/* en meme temps que ce programme ; si ce n'est pas le cas, ecrivez a la                  */
21/* Free Software Foundation,                                                              */
22/* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, Etats-Unis.                   */
23/******************************************************************************************/
24
25// $LastChangedRevision: 43260 $
26// $LastChangedBy: paladin@quesaco.org $
27// $LastChangedDate: 2010-12-31 09:59:05 +0000 (Fri, 31 Dec 2010) $
28
29/*
30        Fonctions consacrees au traitement du contenu du courrier et tampon :
31        - filtres, convertisseurs texte, charset, etc.
32       
33        Toutes les fonctions ici ont un nom commencant pas 'spiplistes_courrier'
34       
35        Voir base/spiplistes_upgrade.php pour definitions et descriptions des tables
36       
37       
38*/
39
40
41/*
42        function spiplistes_courrier_propre($texte)
43        passe propre() sur un texte puis nettoye les trucs rajoutes par spip sur du html
44        ca s'utilise pour afficher un courrier dans l espace prive
45        on l'applique au courrier avant de confirmer l'envoi
46*/
47function spiplistes_courrier_propre($texte){
48        $temp_style = ereg("<style[^>]*>[^<]*</style>", $texte, $style_reg);
49        if (isset($style_reg[0])) 
50                $style_str = $style_reg[0]; 
51        else 
52                $style_str = "";
53        $texte = ereg_replace("<style[^>]*>[^<]*</style>", "__STYLE__", $texte);
54        //passer propre si y'a pas de html (balises fermantes)
55        if( !preg_match(',</?('._BALISES_BLOCS.')[>[:space:]],iS', $texte) ) 
56        $texte = propre($texte); // pb: enleve aussi <style>... 
57        $texte = spiplistes_courrier_propre_bloog($texte); //nettoyer les spip class truc en trop
58        $texte = ereg_replace("__STYLE__", $style_str, $texte);
59        //les liens avec double debut #URL_SITE_SPIP/#URL_ARTICLE
60        $texte = ereg_replace($GLOBALS['meta']['adresse_site']."/".$GLOBALS['meta']['adresse_site'], $GLOBALS['meta']['adresse_site'], $texte);
61        $texte = liens_absolus($texte);
62       
63        return $texte;
64}
65
66/*
67 * complete caracteres manquants dans HTML -> ISO
68 * @return la chaine transcrite
69 * @param $texte le texte a transcrire
70 * @param $charset le charset souhaite'. Normalement 'iso-8859-1' (voir page de config)
71 * @param $is_html flag. Pour ne pas transcrire completement la version html
72 * @see http://fr.wikipedia.org/wiki/ISO_8859-1
73 * @see http://www.w3.org/TR/html401/sgml/entities.html
74 */
75function spiplistes_translate_2_charset ($texte, $charset='AUTO', $is_html = false) {
76       
77        $texte = charset2unicode($texte);
78        $texte = unicode2charset($texte, $charset);
79        if($charset != "utf-8") {
80                $remplacements = array(
81                        "&#8217;" => "'"        // quote
82                        , "&#8220;" => '"' // guillemets
83                        , "&#8221;" => '"' // guillemets
84                        )
85                        ;
86                if(!$is_html) {
87                        $remplacements = array_merge(
88                                $remplacements
89                                , array(
90                                                        // Latin Extended
91                                          '&#255;' => chr(255) // 'ÿ' // yuml inconnu php ?
92                                        , '&#338;' => "OE"  // OElig
93                                        , '&#339;' => "oe"  // oelig
94                                        , '&#352;' => "S"  // Scaron
95                                        , '&#353;' => "s"  // scaron
96                                        , '&#376;' => "Y"  // Yuml
97                                                // General Punctuation
98                                        , '&#8194;' => " " // ensp
99                                        , '&#8195;' => " " // emsp
100                                        , '&#8201;' => " " // thinsp
101                                        , '&#8204;' => " " // zwnj
102                                        , '&#8205;' => " " // zwj
103                                        , '&#8206;' => " " // lrm
104                                        , '&#8207;' => " " // rlm
105                                        , '&#8211;' => "-" // ndash
106                                        , '&#8212;' => "--" // mdash
107                                        , '&#39;' => "'" // apos
108                                        , '&#8216;' => "'" // lsquo
109                                        , '&#8217;' => "'" // rsquo
110                                        , '&#8218;' => "'" // sbquo
111                                        , '&#8220;' => '"' // ldquo
112                                        , '&#8221;' => '"' // rdquo
113                                        , '&#8222;' => '"' // bdquo
114                                        , '&#8224;' => "+" // dagger
115                                        , '&#8225;' => "++" // Dagger
116                                        , '&#8240;' => "0/00" // permil
117                                        , '&#8249;' => "." // lsaquo
118                                        , '&#8250;' => "." // rsaquo
119                                                // sans oublier
120                                        , '&#8364;' => "euros"  // euro
121                                )
122                        );
123                }
124                $texte = strtr($texte, $remplacements);
125        }
126        return($texte);
127}
128
129
130/****
131 * titre : spiplistes_courrier_propre_bloog
132 * Enleve les enluminures Spip pour la bloogletter
133 Vincent CARON
134****/
135
136function spiplistes_courrier_propre_bloog($texte) {
137
138        $texte = ereg_replace("<p class=\"spip\">(\r\n|\n|\r)?</p>",'',$texte);
139        $texte = eregi_replace("\n{3}", "\n", $texte);
140       
141       
142        // div imbrique dans un p
143        $texte = eregi_replace( "<p class=\"spip\">(\r\n|\n|\r| )*<div([^>]*)>" , "<div\\2>" , $texte);
144        $texte = eregi_replace( "<\/div>(\r\n|\n|\r| )*<\/p>" , "</div>" , $texte);
145       
146        // style imbrique dans un p
147        $texte = eregi_replace( "<p class=\"spip\">(\r\n|\n|\r| )*<style([^>]*)>" , "<style>" , $texte);
148        $texte = eregi_replace( "<\/style>(\r\n|\n|\r| )*<\/p>" , "</style>" , $texte);
149       
150       
151        // h3 imbrique dans un p
152        $texte = eregi_replace( "<p class=\"spip\">(\r\n|\n|\r| )*<h3 class=\"spip\">" , "<h3>" , $texte);
153        $texte = eregi_replace( "<\/h3>(\r\n|\n|\r| )*<\/p>" , "</h3>" , $texte);
154       
155        // h2 imbrique dans un p
156        $texte = eregi_replace( "<p class=\"spip\">(\r\n|\n|\r| )*<h2>" , "<h2>" , $texte);
157        $texte = eregi_replace( "<\/h2>(\r\n|\n|\r| )*<\/p>" , "</h2>" , $texte);
158       
159        // h1 imbrique dans un p
160        $texte = eregi_replace( "<p class=\"spip\">(\r\n|\n|\r| )*<h1>" , "<h1>" , $texte);
161        $texte = eregi_replace( "<\/h1>(\r\n|\n|\r| )*<\/p>" , "</h1>" , $texte);
162       
163       
164        // tableaux imbriques dans p
165        $texte = eregi_replace( "<p class=\"spip\">(\r\n|\n|\r| )*<(table|TABLE)" , "<table" , $texte);
166        $texte = eregi_replace( "<\/(table|TABLE)>(\r\n|\n|\r| )*<\/p>" , "</table>" , $texte);
167       
168        // TD imbriques dans p
169        $texte = eregi_replace( "<p class=\"spip\">(\r\n|\n|\r| )*<(\/td|\/TD)" , "</td" , $texte);
170        //$texte = eregi_replace( "<\/(td|TD)>(\r\n|\n|\r| )*<\/p>" , "</td>" , $texte);
171       
172        // p imbriques dans p
173        $texte = eregi_replace( "<p class=\"spip\">(\r\n|\n|\r| )*<(p|P)" , "<p" , $texte);
174        //$texte = eregi_replace( "<\/(td|TD)>(\r\n|\n|\r| )*<\/p>" , "</td>" , $texte);
175       
176        // DIV imbriques dans p
177        $texte = eregi_replace( "<p class=\"spip\">(\r\n|\n|\r| )*<(div|DIV)" , "<div" , $texte);
178        $texte = eregi_replace( "<\/(DIV|div)>(\r\n|\n|\r| )*<\/p>" , "</div>" , $texte);
179       
180        //$texte = PtoBR($texte);
181        $texte = ereg_replace ("\.php3&nbsp;\?",".php3?", $texte);
182        $texte = ereg_replace ("\.php&nbsp;\?",".php?", $texte);
183       
184        return $texte;
185} // end spiplistes_courrier_propre_bloog()
186
187
188
189/****
190 * titre : spiplistes_courrier_version_texte
191 * d'apres Clever Mail (-> NHoizey), mais en mieux.
192****/
193
194function spiplistes_courrier_version_texte($in) {
195
196        $eol = PHP_EOL;
197       
198        // Nettoyage des liens des notes de bas de page
199        $out = preg_replace("@<a href=\"#n(b|h)[0-9]+-[0-9]+\" name=\"n(b|h)[0-9]+-[0-9]+\" class=\"spip_note\">([0-9]+)</a>@"
200                                                , "\\3", $in);
201       
202        // Supprimer tous les liens internes
203        $patterns = array("/\<a href=['\"]#(.*?)['\"][^>]*>(.*?)<\/a>/ims");
204        $replacements = array("\\2");
205        $out = preg_replace($patterns,$replacements, $out);
206       
207        // Supprime feuille style
208        $out = preg_replace("/<style[^>]*>[^<]*<\/style>/", '', $out);
209       
210        // les puces
211        $out = str_replace($GLOBALS['puce'], $eol.'-', $out);
212       
213        // Remplace tous les liens     
214        $patterns = array("/\<a href=['\"](.*?)['\"][^>]*>(.*?)<\/a>/ims");
215        $replacements = array("\\2 (\\1)");
216        $out = preg_replace($patterns,$replacements, $out);
217       
218        $_traits = str_repeat('-', 40);
219        $_points = str_repeat('.', 20);
220       
221        $out = preg_replace('/<h1[^>]*>/', '_SAUT__SAUT_'.$_traits.'_SAUT_', $out);
222        $out = str_replace('</h1>', '_SAUT__SAUT_'.$_traits.'_SAUT__SAUT_', $out);
223        $out = preg_replace('/<h2[^>]*>/', '_SAUT__SAUT_'.$_points.' ', $out);
224        $out = str_replace('</h2>', ' '.$_points.'_SAUT__SAUT_', $out);
225        $out = preg_replace('/<h3[^>]*>/', '_SAUT__SAUT_*', $out);
226        $out = str_replace('</h3>', '*_SAUT__SAUT_', $out);
227       
228        // Les notes de bas de page
229        $out = str_replace('<p class="spip_note">', $eol, $out);
230        $out = preg_replace('/<sup>([0-9]+)<\/sup>/', '[\\1]', $out);
231       
232        // etrange parfum de regex dans un str_replace ?
233        //$out = str_replace('<p[^>]*>', $eol.$eol, $out);
234       
235        //$out = str_replace('<br /><img class=\'spip_puce\' src=\'puce.gif\' alt=\'-\' border=\'0\'>', "\n".'-', $out);
236        $out = preg_replace('/<li[^>]>/', $eol.'-', $out);
237        //$out = str_replace('<li>', "\n".'-', $out);
238       
239       
240        // accentuation du gras -
241        // <b>texte</b> -> *texte*
242        $out = preg_replace('/<b[^>|r]*>/','*' ,$out);
243        $out = str_replace ('</b>','*' ,$out);
244       
245        // accentuation du gras -
246        // <strong>texte</strong> -> *texte*
247        $out = preg_replace('/<strong[^>]*>/','*' ,$out);
248        $out = str_replace ('</strong>','*' ,$out);
249       
250       
251        // accentuation de l'italique
252        // <i>texte</i> -> *texte*
253        $out = preg_replace('/<i[^>|mg]*>/','*' ,$out);
254        $out = str_replace ('</i>', '*', $out);
255       
256        $out = str_replace('&oelig;', 'oe', $out);
257        $out = str_replace('&nbsp;', ' ', $out);
258        $out = filtrer_entites($out);
259       
260        //attention, trop brutal pour les logs irc <@RealET>
261        $out = supprimer_tags($out);
262       
263        $out = str_replace('\x0B', '', $out); 
264        $out = preg_replace("/\t/", '', $out) ;
265        $out = preg_replace('/[ ]{3,}/', '', $out);
266       
267        // espace en debut de ligne
268        $out = preg_replace("/(\r\n|\n|\r)[ ]+/m", $eol, $out);
269       
270//marche po
271        // Bring down number of empty lines to 4 max
272        $out = preg_replace("/(\r\n|\n|\r){3,}/m", $eol.$eol, $out);
273       
274        //retablir les saut de ligne
275        $out = preg_replace('/(_SAUT_){3,}/m', '_SAUT__SAUT__SAUT_', $out);
276        $out = preg_replace('/_SAUT_/', $eol, $out);
277        //saut de lignes en debut de texte
278        $out = preg_replace("/^(\r\n|\n|\r)+/", $eol.$eol, $out);
279        //saut de lignes en fin de texte
280        $out = preg_replace("/(\r\n|\n|\r)+$/", $eol.$eol, $out);
281       
282        // Faire des lignes de 75 caracteres maximum
283        $out = wordwrap($out);
284       
285        return $out;
286
287} // end spiplistes_courrier_version_texte()
288
289/*
290 * Ajouter les abonnes d'une liste a un envoi
291 * @param : $id_courrier : reference d'un envoi
292 * @param $id_liste : reference d'une liste
293 */
294function spiplistes_courrier_remplir_queue_envois ($id_courrier, $id_liste, $id_auteur = 0) {
295        $id_courrier = intval($id_courrier);
296        $id_liste = intval($id_liste);
297       
298spiplistes_log("API: remplir courrier: #$id_courrier, liste: #$id_liste, auteur: #$id_auteur", _SPIPLISTES_LOG_DEBUG);
299       
300        if($id_courrier > 0) {
301       
302                $statut_q = sql_quote('a_envoyer');
303                $id_courrier_q = sql_quote($id_courrier);
304                $sql_valeurs = "";
305       
306                if($id_liste > 0) {
307                        // prendre la liste des abonnes a cette liste
308                        $ids_abos = spiplistes_listes_liste_abo_ids($id_liste);
309                        if(count($ids_abos)) {
310                                $sql_where_q = "(".implode(",", array_map("sql_quote", $ids_abos)).")";
311                                $sql_result = sql_select('id_auteur', 'spip_auteurs', "id_auteur IN $sql_where_q", ''
312                                        , array('id_auteur'));
313                                $ids_auteurs = array();
314                                while($row = sql_fetch($sql_result)) {
315                                        $ids_auteurs[] = intval($row['id_auteur']);
316                                }
317                                foreach($ids_abos as $ii) {
318                                        // l'auteur n'existe plus, le desabonner !
319                                        if(!in_array($ii, $ids_auteurs)) {
320                                                spiplistes_abonnements_auteur_desabonner($ii, 'toutes');
321                                        }
322                                }
323                                if(count($ids_auteurs) > 0) {
324                                        // remplir la queue d'envois
325                                        foreach($ids_auteurs as $ii) {
326                                                $sql_valeurs .= "(".sql_quote($ii).",$id_courrier_q, $statut_q, NOW()),";
327                                        }
328                                        $sql_valeurs = rtrim($sql_valeurs, ",");                       
329                                }
330                        }
331                }
332                else if(($id_auteur = intval($id_auteur)) > 0) {
333                        // envoi mail test
334                        $sql_valeurs = "(".sql_quote($id_auteur).",$id_courrier_q, $statut_q, NOW())";
335                }
336                if(!empty($sql_valeurs)) {
337                        sql_insert(
338                                'spip_auteurs_courriers'
339                                ,       "("
340                                        . "id_auteur,id_courrier,statut,maj"
341                                        . ")"
342                                ,       $sql_valeurs
343                        );
344                        $nb_etiquettes = spiplistes_courriers_en_queue_compter(
345                                array(
346                                        "id_courrier=".sql_quote($id_courrier)
347                                        , "statut=".sql_quote('a_envoyer')
348                                )
349                        );
350                        if($nb_etiquettes && ($id_liste > 0)) {
351                                spiplistes_courrier_modifier(
352                                        $id_courrier
353                                        , array('total_abonnes' => sql_quote($nb_etiquettes))
354                                        );
355                        }
356                        return(true);
357                }
358        }
359spiplistes_log("ERR: spiplistes_courrier_remplir_queue_envois($id_courrier, $id_liste, $id_auteur) valeur nulle ?"
360                , _SPIPLISTES_LOG_DEBUG);
361        return(false);
362}
363
364//CP-20080509: upadte sql sur un courrier
365/*
366 * Modifier un courrier
367 * @return true ou false
368 * @param $id_courrier
369 * @param $sql_set_array les valeurs à modifier. ex.: array('col1' => 'val1')
370 * @param $quote si true, les valeurs seront quote' par sql_updateq
371 */
372function spiplistes_courrier_modifier ($id_courrier, $sql_set_array, $quote = true) {
373        $id_courrier = intval($id_courrier);
374        $sql_update = $quote ? "sql_updateq" : "sql_update";
375        $result = 
376                ($id_courrier > 0)
377                ?
378                        $sql_update(
379                                "spip_courriers"
380                                , $sql_set_array
381                                , 'id_courrier='.sql_quote($id_courrier).' LIMIT 1'
382                        )
383                : false
384                ;
385        return($result);
386}
387
388//CP-20080509: changer le statut d'un courrier
389function spiplistes_courrier_statut_modifier ($id_courrier, $new_statut) {
390        return(spiplistes_courrier_modifier($id_courrier, array('statut' => $new_statut)));
391}
392
393// CP-20080329
394function spiplistes_courrier_supprimer_queue_envois ($sql_where_key, $sql_where_value) {
395        $sql_where = $sql_where_key."=".sql_quote($sql_where_value);
396        switch($sql_where_key) {
397                case 'id_courrier':
398                        $result = sql_delete("spip_auteurs_courriers", $sql_where);
399                        break;
400                case 'statut':
401                        if(spiplistes_spip_est_inferieur_193()) { 
402                                $result = sql_delete("spip_auteurs_courriers"
403                                        , "id_courrier IN (SELECT id_courrier FROM spip_courriers WHERE $sql_where)"); 
404                        } else {
405                                // Sur les precieux conseils de MM :
406                                // passer la requete en 2 etapes pour assurer portabilite sql
407                                $selection =
408                                        sql_select("id_courrier", "spip_courriers", $sql_where,'','','','','',false);
409                                $result = sql_delete("spip_auteurs_courriers", "id_courrier IN ($selection)");
410                        }
411                        break;
412        }
413        return($result);
414}
415
416function spiplistes_courrier_attacher_documents($id_courrier, $id_temp) {
417        if(($id_courrier > 0) && ($id_temp < 0)) {
418                return(
419                        sql_updateq(
420                                'spip_documents_liens'
421                                , array('id_objet' => sql_quote($id_courrier))
422                                , 'id_objet='.sql_quote($id_temp).' AND objet='.sql_quote('courrier')
423                ));
424        }
425        return(false);
426}
427
428// CP-20080329
429function spiplistes_courrier_supprimer ($sql_where_key, $sql_where_value) {
430        return(sql_delete("spip_courriers", $sql_where_key."=".sql_quote($sql_where_value)));
431}
432//CP-20080519
433function spiplistes_courriers_premier ($id_courrier, $sql_select_array) {
434        return(sql_fetsel($sql_select_array, 'spip_courriers', "id_courrier=".sql_quote($id_courrier), '', '', 1));
435}
436
437// renvoie id_auteur du courier (CP-20071018)
438function spiplistes_courrier_id_auteur_get ($id_courrier) {
439        if(($id_courrier = intval($id_courrier)) > 0) {
440                if($sql_result = sql_select('id_auteur', 'spip_courriers', "id_courrier=".sql_quote($id_courrier), '', '', 1)) {
441                        if($row = spip_fetch_array($sql_result)) {
442                                return($row['id_auteur']);
443                        }
444                }
445        }
446        return(false);
447}
448
449//CP-20080509: renvoie somme des abonnes en cours d envoi
450function spiplistes_courriers_total_abonnes ($id_courrier = 0) {
451        $id_courrier = intval($id_courrier);
452        $sql_where = "statut=".sql_quote(_SPIPLISTES_COURRIER_STATUT_ENCOURS);
453        if($id_courrier > 0) {
454                $sql_where .= " AND id_courrier=".sql_quote($id_courrier);
455        }
456        return(
457                sql_getfetsel(
458                        'SUM(total_abonnes)'
459                        , 'spip_courriers'
460                        , $sql_where
461                )
462        );
463}
464
465/*
466 * CP-20081124
467 * Assembler/calculer un patron
468 * @return array le resultat html et texte seul dans un tableau
469 * @param $patron string nom du patron
470 * @param $contexte array
471 * @param $ignorer bool
472 */
473function spiplistes_courriers_assembler_patron ($path_patron, $contexte, $ignorer = false) {
474
475        if($ignorer) {
476                $result = array("", "");
477        }
478        else {
479                $result = spiplistes_assembler_patron($path_patron, $contexte);
480        }
481       
482        return($result);
483}
484
485
486/*
487 * CP-20081130
488 * Calculer une balise a-la-SPIP pour le titre d'un courrier.
489 * Pour le moment, uniquement #DATE et 2 filtres sont autorises
490 * @return le titre calcule'
491 * @param $titre string
492 */
493function spiplistes_calculer_balise_titre ($titre) {
494
495        // longue comme un jour sans pain
496        $pattern = "=((?P<a>\[)?(?P<texte_avant>[^(\[]*)(?P<b>\()?\s*(?P<balise>#DATE)(?P<filtres>(\s*\|\s*\w+\s*{?\s*\'?\w+\'?\s*}?)*)\s*(?P<c>\))?(?P<texte_apres>[^(\]]*)(?P<d>\])?)=";
497       
498        if (preg_match($pattern, $titre, $match)) {
499               
500                if($match['balise'] == "#DATE") {
501                       
502                        $date = date('Y-m-d H:i:s');
503                       
504                        $texte_avant = isset($match['texte_avant']) ? $match['texte_avant'] : "";
505                        $texte_apres = isset($match['texte_apres']) ? $match['texte_apres'] : "";
506
507                        $envelop = "";
508                        foreach(array('a', 'b', 'c', 'd') as $ii) {
509                                $envelop .= (isset($match[$ii])) ? $match[$ii] : "";
510                        }
511                       
512                        if($envelop == "[()]") {
513                                $filtres = explode('|', $match['filtres']);
514                                foreach($filtres as $filtre) {
515                                        $filtre = trim($filtre);
516                                        if(preg_match("=(\w+)\s*(\{)?\s*(\'?\w*\'?)?\s*(\})?=", $filtre, $match)) {
517                                                switch($match[1]) {
518                                                        case 'affdate':
519                                                                $v = $match[3];
520                                                                $v = preg_replace("=[^dDjlNSwzWFmMntLoYyaABgGhHiseIOPTZcrU\: \-]=", "", $v);
521                                                                $date = date($v);
522                                                                break;
523                                                        case 'plus':
524                                                                $v = intval($match[3]);
525                                                                $date += $v;
526                                                                break;
527                                                }
528                                        }
529                                }
530                        }
531                       
532                        $titre = preg_replace($pattern, $texte_avant.$date.$texte_apres, $titre);
533                }
534        }
535        return($titre);
536}
537
538?>
Note: See TracBrowser for help on using the repository browser.