(page recopiée depuis
WikiniEtLesFluxRSS)
Page en cours de remaniement par
DavidDelon
Plan à l'étude :
- Rappel RSS
- Etat des lieux production fils RSS dans Wikini
- Utilisation / Mise en oeuvre
- Fonctionnement
- Bug et Limites
- Inventaire des propositions :
- Correction bugs actuels
- Mise à jour du format
- Simplification fonctionnement suite évolution architecture de Wikini
- Ajout d'information
- Texte résumé
- Diff simplifié, ou diff étendu
- Flux par page
- Autodécouverte / Icone
- Mise en oeuvre à court terme
- Mise en oeuvre à moyen terme
- Références bibliothèques
Définition
Un "flux" ou "fil" RSS est un simple fichier texte, comprenant du contenu (en général une succession d'actualités) et des balises délimitant les champs de ce contenu (titres, dates, auteurs). En quelque sorte, c'est un "résumé propre", formatté dans une syntaxe précise, de ce qu'il y a de nouveau sur un site Web (d'après
http://www.pointblog.com/abc/rss_et_syndication_1.htm).
Etat des lieux production fils RSS dans Wikini 0.4.3
Wikini produit un fil RSS à partir des derniers changements effectués sur le site. Cette fonctionnalité :
- est exploitable par tout lecteur sachant lire le format RSS version 0.91 (le plus répandu)
- peut être mise en oeuvre dans n'importe quelle page à l'aide de l'action "recentchangesrss"
- est paramétrable afin de référencer l'adresse de la page des derniers changements
- si la page des derniers changements en référence n'existe pas, un contenu vide est alors retourné
- masque les aspects techniques
Utilisation
- Le flux contient les derniers changements intervenu sur le site, selon un forme proche de la page DerniersChangements.
- La création du flux se fait au moyen d'une action à inclure dans une page quelconque du site Wikini selon la syntaxe suivante :
- ""<!-- {{recentchangesrss/link="DerniersChangements"}} -->""
- L'appel de la page contenant l'action recentechangesss suffixé par /xml affiche le flux rss des derniers changements du site, par exemple : http://www.wikini.net/wakka.php?wiki=DerniersChangementsRSS/xml.
Fonctionnement
- L'appel de la page avec le suffixe (handler) /xml provoque le formatage de son contenu au moyen du formatter action.
- Le formatter action ne traite que les actions présentent à l'interieur de ""<!-- -->"".
- Si elle est présente, l'action recentchangesrss est donc appellée par le formatter
- Le paramêtre link de l'action recentchangesrss est affiché dans l'element <link> du flux rss, le parametre link a pour valeur par défaut la page racine du Wikini (root_page).
- L'action recentchangesrss produit un flux RSS version 0.91, par défaut sont affichées les 50 dernières modifications.
- Le début du fichier RSS généré contient "<!-- RSS v0.91 generated by Wikini -->" comme dans les flux RSS d'OpenWiki, ce qui permet de visualiser quel outil a généré ce flux. En outre on visualise tout de suite dans MoZilla la version RSS (0.91), sans passer par l'affichage de la source.
Problèmes techniques et limitations fonctionnelles
Utilisation
- Pas de flux RSS par défaut lors d'une installation de Wikini et pas d'indication de la présence d'un flux ; les utilisateurs ou les administrateurs passent souvent à côté de cette fonctionnalité importante.
Etendue
- Pas de possiblité de suivre l'activité d'une partie du site : une page (ou un groupe de page).
Contenu
- Le flux RSS produit est à la version 0.91 alors que les normes ont évoluées, il y a maintenant 3 grandes familles de flux :
- RSS 0.91 RSS 0.92 RSS 2.0 : un channel, des items dans le channel.
- RSS 1.0 : un channel, des items.
- ATOM : un feed, des entry , structure proche de RSS.
- Le flux RSS produit est valide selon Scripting.com mais n'est pas valide selon Feedvalidator.org
- Le flux ne contient pas d'information sur la modification (nombre de lignes de modifiées, commentaire de modification, contenu de la modification).
Mise en oeuvre
- La mise en oeuvre interne est compliquée : 3 fichiers : xml.php, actions.php et recentchangesrss.php.
- Pas de mise en cache du flux
Propositions
Etendue
- Servir des flux RSS pour tout ou partie du site, par exemple pour effectuer une veille sur une sélection de pages de wikis distants (les uns des autres), et non sur un wiki dans son ensemble. (Cette fonctionnalité n'est pas considérée comme utile par tout le monde).
- D'autres pages que DerniersChangements peuvent être candidates à fournir un fil RSS : par exemple une page de "news" à étudier.
Pour les autres pages, c'est-à-dire les pages "traditionnelles", un fils RSS n'a de sens que si l'utilisateur indique en clair, dans un champ prévu à cet effet, le changement effectué sur la page : par exemple : "Ajout d'un lien vers XXXX" ; "amélioration de la définition des CSS" ; "correction d'orthographe sans importance" ; etc. A ce titre la page
RecentChanges de
WikiTikkiTavi? illustre bien cet exemple (bien que les gens ne renseignent pas systématiquement le champ prévu).
Mise en oeuvre proposée : Génération d'un flux RSS de l'historique de la page courante, appel au moyen de l'handler revisionsrss. Exemple :
http://www.x-arn.org/w/PagePrincipale/revisionsrss
<?php
/*
Exemple de handler pour WikiNi version WikiNi 0.4.1rc et 0.4.1.
Développé par Charles Népote.
Version 0.02 du 03/07/2004.
Licence GPL.
modification par ActionsReseauxNumeriques
04/11/2004
Genere un flux RSS de l'historique de la page courante
Licence GPL.
*/
// On teste si le script n'est pas appelé en direct
if (!defined("WIKINI_VERSION"))
{
die ("accès direct interdit");
}
// On teste si l'utilisateur peut lire la page
if (!$this->HasAccess("read"))
{
return;
}
else
{
// On teste si la page existe
if (!$this->page)
{
return;
}
else
{
header("Content-Type: application/rss+xml");
$output = "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n";
if ($pages = $this->LoadRevisions($this->tag))
{
$output .= "<rss version=\"2.0\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\">\n";
$output .= " <channel>\n";
$output .= " <title>".$this->config["wakka_name"].": ".$this->tag."</title>\n";
$output .= " <link>".$this->config["base_url"].$this->tag."</link>\n";
$output .= " <description></description>\n";
$output .= " <language>fr</language>\n";
foreach ($pages as $page)
{
$url = $this->href("show")."&time=".urlencode($page["time"]);
$output .= " <item>\r\n";
$output .= " <title>".$page["time"] ." by ".$page["user"]. "</title>\r\n";
$output .= " <link>" . $url . "</link>\r\n";
$output .= " <description></description>\r\n";
$output .= " <dc:creator>by ".$page["user"]."</dc:creator>\r\n";
$output .= " <dc:date>".ereg_replace(" ","T",$page["time"])."-01:00</dc:date>\r\n";
$output .= " </item>\r\n";
}
$output .= " </channel>\r\n";
$output .= "</rss>";
print($output);
}
}
}
?>
> --
YannLeGuennec --
CharlesNepote
Contenu
- Si la page des derniers changements en référence n'existe pas, un contenu vide est alors retourné : il faut peut etre décider de retourner quelquechose dans ce cas là
Utilisation
- On peut peut-être ajouter une icône orange "XML" (comme dans WakkaWiki) dans les DerniersChangements
- Il faut peut-être aussi jeter un coup d'oeil la technique de "" décrite ici et
Mise en oeuvre proposée :
Script à placer dans le fichier footer.php après <div class="copyright"> .
// FidelioEspoir - 2004
<a href=<?php echo $this->GetConfigValue("base_url") ?>DerniersChangementsRSS"> <img src=
"<?php echo $this->GetConfigValue("image_url") ?>/xml.gif" title="Copiez ce lien et collez le dans votre lecteur de news."> </a> ::
Utilise d'un nouveau paramètre indiquant l'endroit d'un dossier "image" où est installée l'image xml.gif représentant le petit rectangle xml orange ( et toutes les autres images d'ailleurs)
Contenu
RSS 2.0
Un flux RSS au format 2.0, inspiré de
phpBB et
DotClear). :
Mise en oeuvre proposée :
Exemple :
http://fsa.notredomaine.org/wiki/DerniersChangementsRSS/xml .
<?php
// LordFarquaad - 2004
if ($user = $this->GetUser())
{
$max = $user["changescount"];
}
else
{
$max = 50;
}
if ($pages = $this->LoadRecentlyChanged($max))
{
if (!($link = $this->GetParameter("link"))) $link=$this->config["root_page"];
$output = "<?xml version=\"1.0\" encoding=\"iso-8859-1\" ?>\n";
/*
$output .= "<!-- RSS v0.91 generated by Wikini -->\n";
$output .= "<rdf:RDF\n";
$output .= "xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"\n";
$output .= "xmlns=\"http://my.netscape.com/publish/formats/rss-0.91.dtd\">\n";
*/
$output .= '<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">' . "\n";
$output .= "<channel>\n";
$output .= "<title> Derniers changements sur ". $this->config["wakka_name"] . "</title>\n";
$output .= "<link>" . $this->config["base_url"] . $link . "</link>\n";
$output .= "<description> Derniers changements sur " . $this->config["wakka_name"] . " </description>\n";
$output .= "<language>fr</language>\n";
$output .= '<generator>WikiNi ' . WIKINI_VERSION . "</generator>\n";
foreach ($pages as $i => $page)
{
/*
list($day, $time) = explode(" ", $page["time"]);
$day= preg_replace("/-/", " ", $day);
list($hh,$mm,$ss) = explode(":", $time);
*/
$output .= "<item>\n";
$output .= "<title>" . $page["tag"] . "</title>\n";
$output .= '<dc:creator>' . $page["user"] . "</dc:creator>\n";
$output .= '<pubDate>' . $page['time'] . "</pubDate>\n";
$output .= "<description> Modification de " . $page["tag"] . " --- par " .$page["user"] /* . " le " . $day ." - ". $hh .":". $mm */ . "</description>\n";
$output .= "<link>" . $this->config["base_url"] . $page["tag"] . "&time=" . rawurlencode($page["time"]) . "</link>\n";
$output .= "</item>\n";
}
$output .= "</channel>\n";
$output .= "</rss>\n";
// $output .= "</rdf:RDF>\n";
echo $output ;
}
?>
Fonctionnement interne
- Comme je l'ai dit ailleurs, ce fichier pourrait ne faire que trois lignes... oh et puis une seule ça devrait suffire ;-) J'ai testé, ça marche:
- echo $text = preg_replace('/(\{\{(.+)\}\})/eU', '$this->Action(\'\\2\')', trim(str_replace("\r", '', $text)) . "\n");
- J'ai viré l'option de recherche /m qui était totalement inutile (aucun détecteur de début ou de fin de chaine dans la regexp) et /s car il ne peut pas y avoir de retour à la ligne dans l'appel d'une action. L'option /e sert à évaluer la partie replacement comme du code PhP, après avoir substitué les références arrières dedans.
- J'imagine que maintenant on peut aussi virer le echo qu'il y a là... (s'il y a bien un truc que je n'aime pas du tout dans WikiNi, c'est l'utilisation intensive des fonctions ob...) -- LordFarquaad
solution pour réduire la charge sur le serveur lors de la lecture du fil des
DerniersChangements : enregistrer un fichier .xml statique lors de l'enregistrement d'une page (et non appeler la base pour générer le fil à chaque requête HTTP)
- dans la fonction SavePage? de wakka.php , rajouter en fin de fonction (vers ligne 245) un :
include("update_rss.php");
<?php
/*
update_rss.php
Copyright 2003 David DELON
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
--
x-arn / 2004
*/
$max = 10;
if ($pages = $this->LoadRecentlyChanged($max))
{
if (!($link = $this->GetParameter("link"))) $link=$this->config["root_page"];
$output = "<?xml version=\"1.0\" encoding=\"iso-8859-1\" ?>\n";
$output .= "<!-- RSS v0.91 generated by Wikini -->\n";
$output .= "<rdf:RDF\n";
$output .= "xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"\n";
$output .= "xmlns=\"http://my.netscape.com/publish/formats/rss-0.91.dtd\">\n";
$output .= "<channel>\n";
$output .= "<title> Derniers changements sur ". $this->config["wakka_name"] . "</title>\n";
$output .= "<link>" . $this->config["base_url"] . $link . "</link>\n";
$output .= "<description> Derniers changements sur " . $this->config["wakka_name"] . " </description>\n";
$output .= "<language>fr</language>\n";
$output .= "</channel>\n";
foreach ($pages as $i => $page)
{
list($day, $time) = explode(" ", $page["time"]);
$day= preg_replace("/-/", " ", $day);
list($hh,$mm,$ss) = explode(":", $time);
$output .= "<item>\n";
$output .= "<title>" . $page["tag"] . "</title>\n";//. " --- par " .$page["user"] . " le " . $day ." - ". $hh .":". $mm .
$output .= "<description> Modification de " . $page["tag"] . " --- par " .$page["user"] . " le " . $day ." - ". $hh .":". $mm . "</description>\n";
$output .= "<link>" . $this->config["base_url"] . $page["tag"] . "&time=" . rawurlencode($page["time"]) . "</link>\n";
$output .= "</item>\n";
}
$output .= "</rdf:RDF>\n";
$f = @fopen("x/rss.xml","w"); // fichier RSS statique dans le dossier 'x'
if($f) {
fputs($f,$output) ;
fclose($f);
}
}
?>
Il s'agit d'une simple modification de l'action RSS de
DavidDelon, placé à la racine du wiki (pour l'include) et non dans les actions.
Dans le cas présenté, le fichier statique
rss.xml est placé dans le même dossier que les styles .css (dossier 'x' dans l'exemple) because
ReEcritureURL? et pour que ça marche en
SafeMode? ...
question par
RobinMeier:
mais comment il faut faire pour inclure une partie du contenu d'une page qui a été changé dans le fils RSS ? j'ai regardé le fichier recentchangesrss.php mais je m'y connais pas assez pour pouvoir l'éditer correctement...
Très bonne et interessante question, j'avais regardé un moment donné le calcul des
diffs et ça m'avait semblé assez compliqué...Il serait en tout cas très intéressant d'avoir cette
diff dans le RSS, le champ description est assez vide pour le moment. On pourrait aussi formater la date et l'auteur de la modife correctement dans les champs adhoc dc:date etc... --
YannLeGuennec
On peut s'aider de :
- , du JdN?.
- La classe PhP easyRSS [fr], permettant de générer, mais aussi de lire simplement des flux RSS 0.91.
- Cette bibliothèque est minimale et gère avec simplicité la production comme la lecture de flux RSS 0.91. Son parsage est effectué à l'aide des expressions rationnelles, aussi ne requière-t-elle aucune configuration spéciale et est susceptible de fonctionner sur toute installation de PhP. (Je l'ai testée avec succès avec Wikini sur EasyPhp -- CharlesNepote.). Le seul endroit où cette bibliothèque semble encore téléchargeable est ici.
- MagpieRSS [en] fournit un parseur RSS en PhP fondé sur expat (compatible 0.9x-1.0).
- Cette bibliothèque est très riche, acceptant toute version de flux RSS (hors 2.0), gérant les erreurs, etc. Elle est en outre simple à employer et rapidemment opérationnelle, pour peu que la configuration de PhP intègre les prérequis (qui sont par ailleurs mal documentés). Cette bibliothèque ne fonctionne pas, par exemple, avec EasyPhp.
- Building a Generic RSS Class With PHP [en], par Mitchell Harper.
- [en]. [Il est regrettable que l'inscription à www.phpclasses.org soit obligatoire pour accéder au source de ces classes -- DavidDelon]
- Qu'est-ce que RSS ? [en] : description de RSS et de ses différentes versions.
- [en].
- RSS Validator [en].
- [fr].
- RSS 1.0 disponible [fr].
- Flash RSS [fr].
- rss2email, rss to email aggregator [en]
- Ici même, voir les LecteursdeFilsRSS.