Jeudi 22 novembre 2018

Construction du flux RSS

À la lumière des références citées hier, la rédaction du flux RSS a démarré. Le format choisi est Atom 1.0. Le fichier, est globalement constitué en deux blocs :

  1. un bloc d'information relative au flux, en tête ;
  2. un ensemble d'entrées correspondant chacune à un article, avec le titre, le lien et un résumé.

Ouverture

Sans le champ updated, le bloc d'en tête peut être écrit une bonne fois pour toute. Ce bloc contient le titre du site, un lien vers le site, le nom de l'auteur et un identifiant unique. Bien davantage de champs peuvent être remplis, mais par souci de simplicité, ces champs sont suffisants. Sur emlwks999, cette en-tête ressemble à ça :

<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<title>emlwks999</title>
	<link href="http://emlwks999.hd.free.fr/" rel="alternate"></link>
	<updated>2018-11-21T23:15:52+01:00</updated>
	<author>
		<name>Tokapix</name>
	</author>
	<id>urn:uuid:35f27ec5-3a51-4935-b430-519a13de3eb6</id>

L'UUID doit être unique au site et peut être obtenu une fois pour toutes avec la commande uuidgen :

$ uuidgen
e4fd940f-37b2-4ce0-ba13-31d81b3b4aa0

La date peut être obtenue directement au bon format avec la commande date, assaisonnée des bonnes options pour respecter le format RFC 3339 requis par les flux Atom :

$ date --rfc-3339 seconds
2018-11-22 20:08:01+01:00

Attention, il y a une subtilité. L'horodatage du flux Atom prend un T entre la date et l'heure, ce que ne fournit pas directement la commande date. Il faudra utiliser une commande date avec un format de sortie personnalisé pour automatiser tout ça.

Remplissage

Chaque article du flux représente une entrée, balisée par entry. Chacun a un titre, un lien qui pointe vers l'article sur le site web, un identifiant unique, sa date de dernière mise à jour, et un résumé. Voici l'allure de la première entrée du site :

	<entry>
		<title>Lundi 19 novembre 2018</title>
		<link
			href="http://emlwks999.hd.free.fr/~tokamak/2018/11/19/"
			rel="alternate"
		/>
		<id>urn:uuid:81031118-1145-4531-a0de-e99054b8015a</id>
		<updated>2018-11-21T23:15:51+01:00</updated>
		<summary type="html">
&lt;h1&gt;
Lundi 19 novembre 2018
&lt;/h1&gt;
[...]
		</summary>
	</entry>

Le titre de l'article peut être, comme ici, le titre h1 de la page web, mais ça n'a rien d'obligatoire. Le lien pointe vers l'article, ça fait un bon raccourci pour les lecteurs de flux. L'identifiant unique est propre à l'article et le fichier ne doit pas comporter de doublons. La date de dernière mise à jour correspond à la dernière mise à jour de l'article, s'il a été modifié. Et enfin, il y a le champ summary, pour le résumé de l'article...

À propos de ce summary, la simplicité voudrait que je rédige un plain texte succinct résumant l'article, et j'aurais probablement procédé ainsi dans un autre univers. Cependant, les règles d'usage au sujet du remplissage de ce champ semblent s'accorder autour du respect de l'utilisateur du lecteur de flux, en lui fournissant directement l'article. Certains ont même développé des outils pour lutter contre la troncature des flux RSS fournis par la société au gros G coloré.

Ainsi, le contenu complet des articles est fourni dans le champ summary, au format HTML, modulo l'échappement des caractères spéciaux du XML. Fort heureusement, la RFC relative à Atom fournit un exemple clair des échappements à effectuer. Dans l'ordre, les esperluettes & doivent être remplacées par des &amp;, les symboles « inférieur à » < doivent être transformés en &lt;, et éventuellement les symboles « plus grand que » > par &gt;. Il se trouve que le champ de résumé peut être rempli avec le résultat d'une commande sed relativement simple, appliquée au fichier HTML de départ :

$ sed -e 's/&/\&amp;/g' -e 's/</\&lt;/g' -e 's/>/\&gt;/g' HEADER.html
[...]

Cette commande s'avère d'ailleurs tout aussi salutaire pour la rédaction des champs de texte pré formatés qui parsèment cette page. Voyez le code source de la page, notamment au niveau des exemples de flux Atom pour comprendre les différences entre le document HTML classique et échappé ; ils n'ont pas du tout la même allure. :^)

Fermeture

Bien sûr, pensez à fermer la balise feed ouverte au-dessus de l'en-tête à la fin du fichier:

</feed>
Si on colle toutes ces commandes ensemble, et qu'on peut transformer un article en HTML en entrée dans le flux atom.xml, alors qu'est ce qu'on retrouve ? L'hypothétique commande html2rss mentionnée hier. :^)
[ICO]NameLast modifiedSize
[PARENTDIR]Parent Directory  -

  —