Changeset 41589 in spip-zone


Ignore:
Timestamp:
Oct 6, 2010, 8:42:17 PM (9 years ago)
Author:
fil@…
Message:

encore plus de cdata dans les sites syndiques (on arrive meme a lire le nom du site du flux de tests http://www.eglise.catholique.fr/gateway/syndication.php?key=actualite&value=all )

Location:
_core_/plugins/sites/inc
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • _core_/plugins/sites/inc/site.php

    r41105 r41589  
    2626        if (!$texte) return false;
    2727
     28        include_spip('inc/syndic');
     29        cdata_echappe($texte, $echappe_cdata);
     30
    2831        if (preg_match(',<(channel|feed)([\:[:space:]][^>]*)?'
    2932        .'>(.*)</\1>,ims', $texte, $regs)) {
     
    3942                $header = str_replace($b,array(),$channel);
    4043
    41                 if ($t = extraire_balise($header, 'title'))
     44                if ($t = extraire_balise($header, 'title')) {
     45                        cdata_echappe_retour($t, $echappe_cdata);
    4246                        $result['nom_site'] = supprimer_tags($t);
     47                }
    4348                if ($t = extraire_balises($header, 'link')) {
     49                        cdata_echappe_retour($t, $echappe_cdata);
    4450                        foreach ($t as $link) {
    4551                                $u = supprimer_tags(filtrer_entites($link));
     
    5965                if ($a = extraire_balise($header, 'description')
    6066                OR $a = extraire_balise($header, 'tagline')) {
     67                        cdata_echappe_retour($a, $echappe_cdata);
    6168                        $result['descriptif'] = supprimer_tags($a);
    6269                }
     
    111118        }
    112119
     120        cdata_echappe_retour($result, $echappe_cdata);
    113121        return $result;
    114122}
  • _core_/plugins/sites/inc/syndic.php

    r41105 r41589  
    3232
    3333        // Echapper les CDATA
    34         $echappe_cdata = array();
    35         if (preg_match_all(',<!\[CDATA\[(.*)]]>,Uims', $rss,
    36         $regs, PREG_SET_ORDER)) {
    37                 foreach ($regs as $n => $reg) {
    38                         $echappe_cdata[$n] = $reg[1];
    39                         $rss = str_replace($reg[0], "@@@SPIP_CDATA$n@@@", $rss);
    40                 }
    41         }
     34        cdata_echappe($rss, $echappe_cdata);
    4235
    4336        // supprimer les commentaires
     
    133126                if (preg_match(',<(published|modified|issued)>([^<]*)<,Uims',
    134127                $item,$match)) {
    135                         cdata_echappe_retour($match, $echappe_cdata);
     128                        cdata_echappe_retour($match[2], $echappe_cdata);
    136129                        $la_date = my_strtotime($match[2]);
    137130                }
    138131                if (!$la_date AND
    139132                preg_match(',<(pubdate)>([^<]*)<,Uims',$item, $match)) {
    140                         cdata_echappe_retour($match, $echappe_cdata);
     133                        cdata_echappe_retour($match[2], $echappe_cdata);
    141134                        $la_date = my_strtotime($match[2]);
    142135                }
    143136                if (!$la_date AND
    144137                preg_match(',<([a-z]+:date)>([^<]*)<,Uims',$item,$match)) {
    145                         cdata_echappe_retour($match, $echappe_cdata);
    146                         $la_date = my_strtotime($match[2]);
     138                        cdata_echappe_retour($match[2], $echappe_cdata);
     139                        $la_date = my_strtotime($match[2], $echappe_cdata);
    147140                }
    148141                if (!$la_date AND
    149142                preg_match(',<date>([^<]*)<,Uims',$item,$match)) {
    150                         cdata_echappe_retour($match, $echappe_cdata);
     143                        cdata_echappe_retour($match[1], $echappe_cdata);
    151144                        $la_date = my_strtotime($match[1]);
    152145                }
     
    161154                }
    162155
    163                 $data['date'] = $la_date;
     156                if ($la_date)
     157                        $data['date'] = $la_date;
    164158
    165159                // Honorer le <lastbuilddate> en forcant la date
     
    400394
    401395
    402 // Retablit le contenu des blocs [[CDATA]] dans un tableau
     396// Lit contenu des blocs [[CDATA]] dans un flux
    403397// http://doc.spip.org/@cdata_echappe_retour
    404 function cdata_echappe_retour(&$table, &$echappe_cdata) {
    405         foreach ($table as $var => $val) {
    406                 $table[$var] = filtrer_entites($table[$var]);
    407                 foreach ($echappe_cdata as $n => $e)
    408                         $table[$var] = str_replace("@@@SPIP_CDATA$n@@@",
    409                                 $e, $table[$var]);
     398function cdata_echappe(&$rss, &$echappe_cdata) {
     399        $echappe_cdata = array();
     400        if (preg_match_all(',<!\[CDATA\[(.*)]]>,Uims', $rss,
     401        $regs, PREG_SET_ORDER)) {
     402                foreach ($regs as $n => $reg) {
     403                        if (preg_match(',[<>],', $reg[1])) {
     404                                $echappe_cdata[$n] = $reg[1];
     405                                $rss = str_replace($reg[0], "@@@SPIP_CDATA$n@@@", $rss);
     406                        } else
     407                                $rss = str_replace($reg[0], $reg[1], $rss);
     408                }
     409        }
     410}
     411
     412// Retablit le contenu des blocs [[CDATA]] dans une chaine ou un tableau
     413// http://doc.spip.org/@cdata_echappe_retour
     414function cdata_echappe_retour(&$x, &$echappe_cdata) {
     415        if (is_string($x)) {
     416                if (strpos($x, '@@@SPIP_CDATA') !== false
     417                OR strpos($x, '&lt;') !== false) {
     418                        $x = filtrer_entites($x);
     419                        foreach ($echappe_cdata as $n => $e)
     420                                $x = str_replace("@@@SPIP_CDATA$n@@@", $e, $x);
     421                }
     422        }
     423
     424        else if (is_array($x)) {
     425                foreach($x as $k => &$v)
     426                        cdata_echappe_retour($v, $echappe_cdata);
    410427        }
    411428}
Note: See TracChangeset for help on using the changeset viewer.