Accueil Boite à Outils Syndication de contenu Lecteur RSS/Atom pour votre site 2/2

Publié le : 30 août 2005
Imprimer Imprimer cet article

Auteur :
Alain Sichel

Alain Sichel
Lecteur RSS/Atom pour votre site 2/2
2) Lecteur avec interface avancée

Après un premier article pour présenter un lecteur RSS/Atom avec une interface simple, nous vous proposons maintenant de présenter ce lecteur avec une interface avancée proposant plusieurs options d’affichage [1].

Pour quoi faire ?

Si vous avez lu Afficher un fil RSS/Atom sur votre site 2/3 vous savez qu’on peut aller plus loin que de se contenter de présenter telles quelles les informations recueillies. On reprend ici la même idée adaptée à un lecteur proposé à vos visiteurs. On peut corriger le code pour un meilleur affichage, notamment :

- en modifiant le format de date,
- en alignant les images à droite pour moins perturber la mise en page.

On peut aussi supprimer des balises HTML gênantes, par exemple :

- les paragraphes,
- les retour à la ligne,
- les lignes horizontales,
- les liens,
- les images,
- les caractéristiques du texte (taille, couleur,...),
- le style du texte (gras, italique, souligné),
- les listes à puces ou numérotées,
- les tableaux.

Ceci n’est pas limitatif, vous pouvez modifier ce script et proposer d’autres options (par exemple transformer un texte présenté en titre <h3> par un texte en gras...).

Le code complet

Voici le code de ce lecteur [2], pour les explications, je vous renvoie plutôt à l’article Afficher un fil RSS/Atom sur votre site 2/3, car c’est pratiquement la même chose, avec simplement une interface de formulaire en plus :

<?php
if(isset($_POST["adresse"])) {
$adresse = ($_POST["adresse"]);
if (preg_match("#^http://.([\w./-]+)$#i",$adresse,$ret)) {
$fil = $ret[0];

// fonctions de nettoyage du texte récupéré

function clean_text($text) {
        $text = str_replace('&lt;','<',$text);
        $text = str_replace('&gt;','>',$text);
        $text = str_replace('&quot;','"',$text);
        $text = str_replace('&','&',$text);
        if ($encodage == 'utf-8') {
                $text = utf8_decode($text);
        }
        return $text;
}

function clean_date($date)
{
        // si 'AAAA-MM-JJTHH:MM:SS+00:00' ou 'AAAA-MM-JJTHH:MM:SSZ'
   if (ereg("^[0-9]",$date) and  ereg("(([[:digit:]]|-)*)T(([[:digit:]]|:)*)[^[:digit:]].*",$date,$temp)) {
                $date = $temp[1].' '.$temp[3];
        }
        setlocale(LC_TIME, 'fr_FR');
        $date = strtotime($date);
        return $date;       
}

function nettoyage($description) {
if($_POST["htm"]=="p") {
$avant = array ("'<p.*?>'si","'</p>'si");
$apres = array (" "," ");
$description = preg_replace($avant,$apres,$description);
}
if($_POST["tag"]=="br") {
$description = preg_replace("'<br.*?>'si"," ",$description);
}
if($_POST["sou"]=="hr") {
$description = preg_replace("'<hr.*?>'si"," ",$description);
}
if($_POST["lie"]=="a") {
$avant = array ("'<a.*?>'si","'</a>'si");
$apres = array (" "," ");
$description = preg_replace($avant,$apres,$description);
}
if($_POST["img"]=="img") {
$description = preg_replace("'<img.*?>'si"," ",$description);
}
if($_POST["bal"]=="dr") {
$description = preg_replace("'align=\"left\"'si","align=\"right\"",$description);
}
if($_POST["sty"]=="em") {
$avant = array ("'<i.*?>'si","'<em.*?>'si","'<b.*?>'si","'<strong.*?>'si","'<u.*?>'si","'</i>'si","'</em>'si","'</b>'si","'</strong>'si","'</u>'si");
$apres = array (" "," "," "," "," "," "," "," "," "," ");
$description = preg_replace($avant,$apres,$description);
}
if($_POST["puc"]=="li") {
$avant = array ("'<ul.*?>'si","'<ol.*?>'si","'<li.*?>'si","'</ul>'si","'</ol>'si","'</li>'si");
$apres = array (" "," "," "," "," "," ");
$description = preg_replace($avant,$apres,$description);
}
if($_POST["tab"]=="td") {
$avant = array ("'<table.*?>'si","'<tr.*?>'si","'<td.*?>'si","'</table>'si","'</tr>'si","'</td>'si");
$apres = array (" "," "," "," "," "," ");
$description = preg_replace($avant,$apres,$description);
}
if($_POST["po"]=="ft") {
$avant = array ("'<font.*?>'si","'</font>'si");
$apres = array (" "," ");
$description = preg_replace($avant,$apres,$description);
}
        return $description;
}

include 'rss_read.inc.php';

// créer l'instance
$rss = new rss_read();

$avant = array('&#8217 ;', '&bull;');
$apres = array("'", '- ');
$rss -> to_replace_with($avant, $apres);

// parser le fichier news avec éventuellement un nbre max
$rss -> parsefile($fil,20);

if (!$rss) {
        exit('Fichier rss incorrect !<sup>[<a href="#note3">3</a>]</sup>');
}

// recupération de l'encodage du fil iso ou utf vide si celui-ci n'est pas indiqué
$encode = $rss -> get_encoding();

// recupération des données sur le channel
$channel = $rss -> get_channel();

if ($rss -> exist_image()) {
        $image = $rss -> get_image();
        echo '<table width="100%" border="0"><tr><td width="50%"><h4 align="center"><a href="'.$channel['link'].
                '" target="_blank" title="Lien externe">'.clean_text($channel['title'], $encode)."</a></h4></td>\n<td><center><a href=\""
                .$image['link'].'" target="_blank" title="Lien externe" class="ext"><img src="'.$image['url'].
                '" border="0" alt="'.$image['title']."\"></a></center></td></tr></table>\n"; }
else { echo '<h4 align="center"><a href="'.$channel['link'].'" target="_blank" title="Lien externe">'.clean_text($channel['title'], $encode)."</a></h4>\n"; }

// nombre d'items    
$nbnews = $rss -> get_num_items();

// recup array des données
$items = $rss -> get_items();

// pour affichage des dates au format français
echo "<ul>\n";
for($i = 0; $i < $nbnews; $i++) {
        echo '<li>';
        if (trim($items[$i]['pubdate'])!='') {
                if ($_POST["day"]=="1") { $date = date('d/m/Y', clean_date($items[$i]['pubdate'])); }
                if ($_POST["day"]=="2") { $date = ucfirst(strftime('%A %d %B %Y', clean_date($items[$i]['pubdate']))); }
                if ($_POST["day"]=="3") { $date = ucfirst(strftime('%A %d %B %Y à %Hh%M', clean_date($items[$i]['pubdate']))); }
                if ($_POST["day"]=="0") { $date = $items[$i]['pubdate']; }
                echo '<b>',$date,'&nbsp;:</b> ';
        }
        if (trim($items[$i]['author'])!='') {
                echo '<span class="vert">',clean_text($items[$i]['author'], $encode),'&nbsp;:</span> ';
        }
        elseif (trim($items[$i]['dc:creator'])!='') {
                echo '<span class="vert">',clean_text($items[$i]['dc:creator'], $encode),'&nbsp;:</span> ';
        }
        echo '<a class="ext" title="Lien externe" href="',$items[$i]['link'],'" target="_blank">',clean_text($items[$i]['title'], $encode),'</a>';
        if (trim($items[$i]['category'])!="") { echo " <b>(".clean_text($items[$i]['category'], $encode).")</b>"; }
        if (trim($items[$i]['description'])!='') {
                echo '&nbsp;:<br />'.nettoyage(clean_text($items[$i]['description'], $encode));
        }
        echo "</li>\n";
}
echo "</ul>\n";

// formulaire si textinput existe
if($rss -> exist_textinput()) {
        $textinput = $rss -> get_textinput();
                echo '<form  method="get" action="',$textinput['link'],'">',
                $textinput['description'],'&nbsp;
                <input type="text" name="',$textinput['name'],
                '"size="10" maxlength="10">&nbsp;<input type="submit" name="Submit"
                value="',$textinput['title'],'">
                </form>';
}             

}
else {echo "<p class=\"rouge\">L'adresse indiquée n'est pas valide, essayez à nouveau :</p>\n<br />";}
}
?>
<br /><form action="<?php echo $PHP_SELF ?>" method="post"><center>
         <table border="0" class="tourvert" cellspacing="0" cellpadding="10">
           <tr>
             <td colspan="2">Adresse du fichier de syndication :
                 <input type="text" name="adresse" size="50" value="<?php if(isset($_POST["adresse"])) {echo $fil;
                        $nouv="<p>Pour lire un nouveau fichier de syndication, tapez son adresse ci-dessus.</p>";} ?>" onfocus="this.value='http://'" /></td>
           </tr>
           <tr>
             <td><center>Choix du format de date :
                 <select name="day"><?php $s='selected="selected"';
                    $ch = 'checked="checked"'; ?>
   <option value="1" <?php if($_POST["day"]=="1") {echo $s;} ?>>Court : 12/06/2005</option>
        <option value="2" <?php if($_POST["day"]=="2") {echo $s;} ?>>Complet : Dimanche 12 juin 2005</option>
        <option value="3" <?php if($_POST["day"]=="3") {echo $s;} ?>>Complet + heure : Dimanche 12 juin 2005 à 16h08</option>
        <option value="0" <?php if($_POST["day"]=="0") {echo $s;} ?>>Date sans traitement</option>
 </select><br />
                 <br />
             HTML<sup>[<a href="#note5">5</a>]</sup> :  <input type="checkbox" name="htm" value="p" <? if($_POST["htm"]=="p") {echo $ch;} ?> />
             &lt;p&gt;&nbsp; <input type="checkbox" name="tag" value="br" <?php if($_POST["tag"]=="br") {echo $ch;} ?> />
&lt;br&gt;&nbsp; <input type="checkbox" name="sou" value="hr" <? if($_POST["sou"]=="hr") {echo $ch;} ?> /> &lt;hr&gt;
<input type="checkbox" name="lie" value="a" <?php if($_POST["lie"]=="a") {echo $ch;} ?> /> &lt;a...&gt;
<input type="checkbox" name="img" value="img" <?php if($_POST["img"]=="img") {echo $ch;} ?> /> &lt;img...&gt;&nbsp;<br />
<input type="checkbox" name="po" value="ft" <?php if($_POST["po"]=="ft") {echo $ch;} ?> /> &lt;font...&gt;&nbsp;
<input type="checkbox" name="sty" value="em" <?php if($_POST["sty"]=="em") {echo $ch;} ?> /> &lt;b&gt;&lt;i&gt;&lt;u&gt;
<input type="checkbox" name="puc" value="li" <?php if($_POST["puc"]=="li") {echo $ch;} ?> /> &lt;ul&gt;&lt;li&gt;
<input type="checkbox" name="tab" value="td" <?php if($_POST["tab"]=="td") {echo $ch;} ?> /> &lt;table&gt;&lt;tr&gt;&lt;td&gt;</center></td>
                          <td><center><input type="checkbox" name="bal" value="dr" <?php if($_POST["bal"]=="dr") {echo $ch;} ?> /> &lt;images &agrave; droite&gt;<sup>[<a href="#note4">4</a>]</sup><br />
                 <br /><input type="submit" name="Submit" value="Envoi" alt="Envoi" style="background-color:#00ff00" title="Envoi" />
               </center></td>
           </tr>
         </table></center></form><?php echo $nouv ?>

Avec en plus les notes en bas de page :

<ol class="moyen"><a name="note1" id="note1"></a>
         <li>Pour plus d'explications, voir la page <a href="http://www.mmt-fr.org/article112.html">La syndication de contenu</a>.<br />
 L'affichage de cette page est différent selon les informations disponibles dans le fichier de syndication :<br />
&nbsp;&nbsp;- l'image du logo du site n'est parfois pas présente,<br />
&nbsp;&nbsp;- certains sites n'indiquent pas toujours la date de publication, l'auteur et la description de l'article.<a name="note2" id="note2"></a></li>
         <li>Fil_LE a été réalisé par Dominique WOJYLAC en améliorant la classe easyRSS, voir : <a class="ext" title="Lien externe" href="http://wojylac.free.fr/rubrique.php?rub=7" target="_blank">Gestion de fils RSS</a>.<a name="note3" id="note3"></li>
         <li>En cas de difficulté, il est possible que le fichier ne soit pas conforme. Pour le vérifier, voyez <a class="ext" title="Lien externe" href="http://feedvalidator.org/" target="_blank">Feed Validator</a> ou <a class="ext" title="Lien externe" href="http://rss.scripting.com/" target="_blank">RSS Validator</a>.<a name="note4" id="note4"></a></li>
         <li>Pour aligner les images à droite au lieu de la gauche de la page.<a name="note5" id="note5"></a></li>
         <li>On peut choisir d'afficher ou non les balises HTML de l'élément <em>&quot;Description&quot;</em> ; par défaut, toutes sont affichées, pour les supprimer cocher la case correspondante :<ul>
                   <li>&lt;p&gt; supprime les paragraphes,</li>
                   <li>&lt;br&gt; supprime les retour &agrave; la ligne,</li>
                   <li>&lt;hr&gt; supprime les lignes horizontales,</li>
                   <li>&lt;a...&gt; supprime les liens,</li>
                   <li>&lt;img...&gt; supprime les images,</li>
                   <li>&lt;font...&gt; supprime les caract&eacute;ristiques du texte (taille, couleur,...),</li>
                   <li>&lt;b&gt;&lt;i&gt;&lt;u&gt; supprime le style du texte (gras, italique, soulign&eacute;),</li>
                   <li>&lt;ul&gt;&lt;li&gt; supprime les listes à puces ou numérotées,</li>
                   <li>&lt;table&gt;&lt;tr&gt;&lt;td&gt; supprime les tableaux.</li></ul></li>
         </ol>

Comme le précédent, ce script est prêt à fonctionner, à condition de ne pas oublier :

- qu’il s’agit d’une page PHP [3],
- que vous avez téléchargé et installé rss_read.inc.php [3]
- le code indiqué suppose que la page est dans le même dossier que le fichier rss_read.inc.php [4],

Voilà, pour le moment, mais comme les choses évoluent vite, s’il y a une amélioration à apporter à ce lecteur, cet article pourra être modifié.


 

 

[1] Ces scripts ont été mis au point pour le site du CYES où vous pouvez les voir en service :
- lecteur à interface simple,
- lecteur à interface avancée.

[2] Ce code et celui des notes peut être téléchargé en bas de cette page.

[3] Les fichiers de la classe read de fil_LE sont téléchargeables ici.

[4] Sinon, il faut modifier include 'rss_read.inc.php'; en précisant le chemin vers ce fichier.


Document joint à l'article

Lecteur_plus.zip - Ce fichier contient le code du script et des notes de bas de page.

Cliquez ici pour réagir à cet article

Imprimer Imprimer cet article