[spip-dev] Syndication RSS et !CDATA

Salut à tous,

La colle du jour : je reçois un fil RSS qui encode toutes ses données dans des champs CDATA, comme ci-dessous.

<item rdf:about="http://monsite.com/exemple.htm">
  <title><![CDATA[titre]]></title>
  <link><![CDATA[http://monsite.com/exemple.htm]]></link>
  <description><![CDATA[texte.]]></description>
  <dc:date>2003-11-20T11:02:49 CET</dc:date>
</item>

Dans spip 1.7 ces données renvoient 0 enregistrements quand je syndique le RSS (j'imagine que le CDATA est considéré comme un commentaire et donc spip ne sauve pas d'enregistrements, parce que pour lui les champs sont vides).

A votre avis que faut-il faire ? Modifier le noyau pour que le CDATA soit exclu des éléments considérés comme commentés ?

Si oui un indice sur l'endroit où tout ça se trouve serait le bienvenu, et ensuite je bricole et je vous renvoie ici ma contrib si je parviens à modifier le noyau.

Cordialement,
Stéphane

Le parser de RSS se trouve dans ecrire/inc_sites.php3

<item rdf:about="monsite.com - Ce site web est à vendre ! - Ressources et information concernant monsite Resources and Information.;
  <title><![CDATA[titre]]></title>
  <link><![CDATA[monsite.com - Ce site web est à vendre ! - Ressources et information concernant monsite Resources and Information.]]></link>
  <description><![CDATA[texte.]]></description>
  <dc:date>2003-11-20T11:02:49 CET</dc:date>
</item>

-- Fil

Hello,

La colle du jour : je reçois un fil RSS qui encode toutes ses données
dans des champs CDATA, comme ci-dessous.

<item rdf:about="monsite.com - Ce site web est à vendre ! - Ressources et information concernant monsite Resources and Information.;
  <title><![CDATA[titre]]></title>
  <link><![CDATA[monsite.com - Ce site web est à vendre ! - Ressources et information concernant monsite Resources and Information.]]></link>
  <description><![CDATA[texte.]]></description>
  <dc:date>2003-11-20T11:02:49 CET</dc:date>
</item>

Si tu donnes une URL d'exemple pour ce genre de fil RSS, ce sera
beaucoup plus facile à mettre en place dans SPIP...

Amicalement

Antoine.

La colle du jour : je reçois un fil RSS qui encode toutes ses données
dans des champs CDATA, comme ci-dessous.

<item rdf:about="monsite.com - Ce site web est à vendre ! - Ressources et information concernant monsite Resources and Information.;
  <title><![CDATA[titre]]></title>
  <link><![CDATA[monsite.com - Ce site web est à vendre ! - Ressources et information concernant monsite Resources and Information.]]></link>
  <description><![CDATA[texte.]]></description>
  <dc:date>2003-11-20T11:02:49 CET</dc:date>
</item>

Si tu donnes une URL d'exemple pour ce genre de fil RSS, ce sera
beaucoup plus facile à mettre en place dans SPIP...

Antoine.

Voici un exemple de ce type de fil RSS:
-> http://homepage.mac.com/thierry/NouS/rss.xml

Tous les blogues produits à l'aide de iBlogger génèrent ce type de fil RSS:
-> http://www.ibloggers.net/C1688907064/E1521311587/index.html

Bien qu'il soit assez fréquent de rencontrer le contenu de DESCRIPTION ainsi
inséré dans des balises CDATA, il est assez rare de rencontrer ça dans TITLE
ou LINK. C'est utilisé en général pour insérer tout le code html d'origine
sans utiliser d'entités ou d'échappement. Ça dit à près ceci au "parser" qui
doit décoder le fil: "Voici du contenu que je n'ai pas traité; récupères le
tout sans traitement et débrouilles toi avec ça ou sautes le tout". Les
lecteurs de nouvelles (newsreaders) comme NetNewsWire qui possède aussi un
solide moteur de rendu html s'en accommode assez bien, mais pour les
"parser" de CMS, ce n'est pas souhaitable de récupérer çaet de le restituer
intégralement. Ça risque de faire joyeusement péter les mises en page qui
affichent le contenu des fils RSS de sites syndiqués.

En fait, c'est un peu facile, voire paresseux de générer de tels fils RSS...
surtout pour TITLE et LINK.

Je serais assez d'avis que SPIP ignore les contenus balisés par CDATA.

André Vincent

PS - Une utilisation intéressante de CDATA que j'ai vu, consiste à ajouter
pour chaque item, en plus d'un résumé dans un <description> épuré, une autre
balise <content:encoded> pour un contenu riche à l'intérieur d'une section
CDATA. Ainsi le récepteur du fil peut décider d'utiliser l'un ou l'autre.
-> http://conforme.phidji.com/database/index.xml

Hello,

> La colle du jour : je reçois un fil RSS qui encode toutes
ses données
> dans des champs CDATA, comme ci-dessous.
>
> <item rdf:about="monsite.com - Ce site web est à vendre ! - Ressources et information concernant monsite Resources and Information.;
> <title><![CDATA[titre]]></title>
> <link><![CDATA[monsite.com - Ce site web est à vendre ! - Ressources et information concernant monsite Resources and Information.]]></link>
> <description><![CDATA[texte.]]></description>
> <dc:date>2003-11-20T11:02:49 CET</dc:date>
> </item>

Si tu donnes une URL d'exemple pour ce genre de fil RSS, ce sera
beaucoup plus facile à mettre en place dans SPIP...

Amicalement

Salut,

Je ne peux pas donner d'URL, c'est sur un intranet.

J'ai épluché le code de spip et regardé comment vous faites dans ecrire/inc_sites.php3 (merci Fil pour m'avoir fait gagner du temps en me disant où trouver le code). En fait le problème vient des expressions régulières utilisées pour parcourir le RSS (enfin je crois). Par exemple pour ouvrir un champ titre on a :
ereg('<title[^>]*>(([^<]|<[^/]|</[^t]>|</t[^i]>)*)</title>', $channel, $r)

Pour spip tout ce qui commence par un crochet ouvrant est donc exclu de la récupération de données. D'où le fait qu'il me dise que le site ' ' (sans nom) a zéro articles syndiqués : l'URL du RSS existe mais pour spip il y a zéro données exploitables dedans.

Je suis assez d'accord avec André Vincent pour dire que c'est de la flemme, mais là on n'a pas le choix : les données sortent comme ça d'un outil sur lequel je n'ai ni la main ni le pouvoir de faire changer les choses.

J'ai créé un nettoyeur de RSS qui fait les opérations suivantes :
- aspire le fichier RSS
- supprime à la louche tous les '<![CDATA[' et ']]>' :
$str = preg_replace("/<!\[CDATA\[|\]\]>/","",$str);
- fait un echo du résultat

C'est le résultat de ce nettoyeur que je syndique avec spip.

Pour l'instant je ne sais pas si ça vaut le coup qu'on intègre ce genre de modif dans spip, je ne suis pas sûr de voir encore toutes les implications de la suppression des blocs cdata, en particulier en ce qui concerne l'intégrité et le format des données au final. Normalement ça ne devrait pas poser de problème puisque l'encodage du fil est (au moins) en iso-8859-1, mais je ne me suis pas posé plus largement la question (par exemple avec de l'UTF-8).

Hypothèse de travail pour spip : ligne 106 de ecrire/inc_sites.php3 on a la fonction analyser_site(), peut-être qu'une fois le fil récupéré on pourrait supprimer les indications de CDATA avant de parser le reste du fichier.

Mais encore une fois je crains des effets de bord imprévus. S'il y a des cadors en XML c'est le moment qu'ils l'ouvrent... :wink:

Cordialement,
Stéphane

Je me permets de reposter...
Faut-il argumenter sur l'intérêt d'une syndication des documents?
ça me parait tellement evident que j'ai du mal à capter que personne ne suive l'idée...
En espérant une suite bientot!
toutati

bonjour à tous,
j'aimerais savoir si cela vous intéresse,
réfléchir et mettre en oeuvre cette nouvelle possibilité:
recuperer via XML les infos et surtout les vignettes de tous docs pour les afficher dans des galeries syndiquées.

Voila pour l'instant ou j'en suis, avec le parser de spip 1.7
Il faut mettre un fichier backend-doc.html qui contient la boucle plus bas(1) et syndiquer le backend-doc.php3:
puis soit on fait un explode(2) pour récupérer les infos contenu dans le titre
soit simplement dans une boucle de syndication(3) on récupére le descriptif qui se trouve être le chemin de la vignette.

AVANTAGES:
Une auto-syndication permet d'afficher tous les docs d'un site,
et le partage de documents d'un site à d'autres n'est pas négligeable, (je pense à des groupes d'assos ayant plusieurs sites) les documents restant sur le serveur original. Pour les galeries d'images s'est aussi assez sympa. voilou voilou