From 1e3e18f5eb75cb2aa1a760f7e6dfacf59b5ca2f3 Mon Sep 17 00:00:00 2001
From: Fil <fil@rezo.net>
Date: Sun, 26 Feb 2006 12:09:40 +0000
Subject: [PATCH] corrections RSS, passage RSS 2.0 et Atom dans spip_rss
 (Nicolas Krebs)

---
 dist/backend-breves.html    | 16 ++++++------
 dist/backend.html           | 21 ++++++++--------
 ecrire/action/rss.php       | 50 ++++++++++++++++++++++++++++++++-----
 ecrire/inc_filtres.php      |  5 ++--
 ecrire/inc_presentation.php |  3 +++
 5 files changed, 69 insertions(+), 26 deletions(-)

diff --git a/dist/backend-breves.html b/dist/backend-breves.html
index c3a34df5bf..df81c2541d 100644
--- a/dist/backend-breves.html
+++ b/dist/backend-breves.html
@@ -23,18 +23,18 @@
 	</image>
 ]
 
-<BOUCLE_breves(BREVES){id_rubrique ?}{lang ?}{par date}{inverse}{0,10}>
+<BOUCLE_breves(BREVES){id_rubrique ?}{lang ?}{par date}{inverse}{0,20}>
 	<item>
 		<title>[(#TITRE|supprimer_numero|texte_backend)]</title>
 		<link>[(#URL_BREVE|url_absolue)]</link>
-		<dc:date>[(#DATE|date_iso)]</dc:date>
+		[<dc:date>(#DATE|date_iso)</dc:date>]
 		<dc:format>text/html</dc:format>
 		<dc:language>#LANG</dc:language>
 		[(#REM)
-			On diffuse la rubrique et les mots-cles a la mode RSS
-		]<BOUCLE_rubrique_rss(RUBRIQUES){id_rubrique}><category[ domain="(#URL_RUBRIQUE|url_absolue)"]>[(#TITRE|supprimer_numero|texte_backend)]</category></BOUCLE_rubrique_rss>
+			Le bloc qui suit diffuse diffuse la rubrique et les mots-cles a la mode RSS
+		]<BOUCLE_rubrique_rss(RUBRIQUES){id_rubrique}>[<category[ domain="(#URL_RUBRIQUE|url_absolue)"]>(#TITRE|supprimer_numero|texte_backend)</category>]</BOUCLE_rubrique_rss>
 <BOUCLE_mots_rss(MOTS){id_breve}>
-		<dc:subject>[(#TITRE|texte_backend)]</dc:subject></BOUCLE_mots_rss>
+		[<dc:subject>(#TITRE|texte_backend)</dc:subject>]</BOUCLE_mots_rss>
 
 		<description>[(#INTRODUCTION|texte_backend)]
 
@@ -43,17 +43,17 @@
 	sous forme de "microformats"
 
 ]<BOUCLE_rubrique_mf(RUBRIQUES){id_rubrique}>-
-&lt;a href="[(#URL_RUBRIQUE|url_absolue)]" rel="category"&gt;[(#TITRE|texte_backend)]&lt;/a&gt;
+[&lt;a href="[(#URL_RUBRIQUE|url_absolue)]" rel="category"&gt;(#TITRE|supprimer_numero|texte_backend)&lt;/a&gt;]
 </BOUCLE_rubrique_mf><B_mots_mf>
 / <BOUCLE_mots_mf(MOTS){id_breve}{", "}>
-&lt;a href="[(#URL_MOT|url_absolue)]" rel="tag"&gt;[(#TITRE|texte_backend)]&lt;/a&gt;</BOUCLE_mots_mf>
+[&lt;a href="[(#URL_MOT|url_absolue)]" rel="tag"&gt;(#TITRE|texte_backend)&lt;/a&gt;]</BOUCLE_mots_mf>
 
 		</description>
 
 [(#REM)
 	Le bloc qui suit diffuse aussi le texte integral de la breve,
 	ce qui permet une syndication plus riche (mais plus "lourde").
-	Fonction desactivable depuis les reglages du site
+	Fonction desactivable depuis les reglages du site.
 ][
 (#CONFIG{syndication_integrale}|=={oui}|?{' ',''})<content:encoded>[(#LOGO_BREVE|right||texte_backend)
 		][&lt;div class='rss_texte'&gt;(#TEXTE|texte_backend)&lt;/div&gt;
diff --git a/dist/backend.html b/dist/backend.html
index b5c89c2538..9e5b8383ca 100644
--- a/dist/backend.html
+++ b/dist/backend.html
@@ -26,16 +26,17 @@
 	<item>
 		<title>[(#TITRE|supprimer_numero|texte_backend)]</title>
 		<link>[(#URL_ARTICLE|url_absolue)]</link>
-		<dc:date>[(#DATE|date_iso)]</dc:date>
+		[<dc:date>(#DATE|date_iso)</dc:date>]
 		<dc:format>text/html</dc:format>
 		<dc:language>#LANG</dc:language>
 		[<dc:creator>(#LESAUTEURS|supprimer_tags|texte_backend)</dc:creator>]
 
-		[(#REM)
-			On diffuse la rubrique et les mots-cles a la mode RSS
-		]<BOUCLE_rubrique_rss(RUBRIQUES){id_rubrique}><category[ domain="(#URL_RUBRIQUE|url_absolue)"]>[(#TITRE|supprimer_numero|texte_backend)]</category></BOUCLE_rubrique_rss>
+[(#REM)
+	Le bloc qui suit diffuse diffuse la rubrique et les mots-cles a la mode RSS
+
+]<BOUCLE_rubrique_rss(RUBRIQUES){id_rubrique}>[<category[ domain="(#URL_RUBRIQUE|url_absolue)"]>(#TITRE|supprimer_numero|texte_backend)</category>]</BOUCLE_rubrique_rss>
 <BOUCLE_mots_rss(MOTS){id_article}>
-		<dc:subject>[(#TITRE|texte_backend)]</dc:subject></BOUCLE_mots_rss>
+		[<dc:subject>(#TITRE|texte_backend)</dc:subject>]</BOUCLE_mots_rss>
 
 		<description>[(#INTRODUCTION|texte_backend)]
 
@@ -44,17 +45,17 @@
 	sous forme de "microformats"
 
 ]<BOUCLE_rubrique_mf(RUBRIQUES){id_rubrique}>-
-&lt;a href="[(#URL_RUBRIQUE|url_absolue)]" rel="category"&gt;[(#TITRE|texte_backend)]&lt;/a&gt;
+[&lt;a href="[(#URL_RUBRIQUE|url_absolue)]" rel="category"&gt;(#TITRE|supprimer_numero|texte_backend)&lt;/a&gt;]
 </BOUCLE_rubrique_mf><B_mots_mf>
 / <BOUCLE_mots_mf(MOTS){id_article}{", "}>
-&lt;a href="[(#URL_MOT|url_absolue)]" rel="tag"&gt;[(#TITRE|texte_backend)]&lt;/a&gt;</BOUCLE_mots_mf>
+[&lt;a href="[(#URL_MOT|url_absolue)]" rel="tag"&gt;(#TITRE|texte_backend)&lt;/a&gt;]</BOUCLE_mots_mf>
 
 		</description>
 
 [(#REM)
 	Le bloc qui suit diffuse aussi le texte integral de l'article,
 	ce qui permet une syndication plus riche (mais plus "lourde").
-	Fonction desactivable depuis les reglages du site
+	Fonction desactivable depuis les reglages du site.
 ][
 (#CONFIG{syndication_integrale}|=={oui}|?{' ',''})<content:encoded>[(#LOGO_ARTICLE|right||texte_backend)
 		][&lt;div class='rss_chapo'&gt;(#CHAPO|texte_backend)&lt;/div&gt;
@@ -68,9 +69,9 @@
 [(#REM)
 	Le bloc qui suit diffuse l'adresse des documents associes aux articles ;
 	ajouter par ex. {extension=mp3} pour limiter a un certain type de document.
-]		<BOUCLE_podcast(DOCUMENTS){id_article}{mode=document}{doublons}>[
+]		<BOUCLE_documents(DOCUMENTS){id_article}{mode=document}{doublons}>[
 		<enclosure url="(#URL_DOCUMENT|url_absolue|unique)"[ length="(#TAILLE)"][ type="(#MIME_TYPE)"] />]
-		</BOUCLE_podcast>
+		</BOUCLE_documents>
 
 	</item>
 </BOUCLE_un_article>
diff --git a/ecrire/action/rss.php b/ecrire/action/rss.php
index 9a2c6dfecd..d2d23acfff 100644
--- a/ecrire/action/rss.php
+++ b/ecrire/action/rss.php
@@ -43,7 +43,7 @@ function affiche_rss_rss($rss, $intro = '') {
 	$u = '<'.'?xml version="1.0" encoding="'.$GLOBALS['meta']['charset'].'"?'.">\n";
 
 	$u .= '
-<rss version="0.91" xmlns:dc="http://purl.org/dc/elements/1.1/">
+<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
 <channel>
 	<title>'.texte_backend($intro['title']).'</title>
 	<link>'.texte_backend(url_absolue($intro['url'])).'</link>
@@ -61,15 +61,11 @@ function affiche_rss_rss($rss, $intro = '') {
 	<item>
 		<title>'.texte_backend($article['title']).'</title>
 		<link>'.texte_backend(url_absolue($article['url'])).'</link>
-		<date>'.texte_backend($article['date']).'</date>
-		<description>'.
-			texte_backend(liens_absolus($article['description']))
-		.'</description>
-		<author>'.texte_backend($article['author']).'</author>
 		<dc:date>'.date_iso($article['date']).'</dc:date>
 		<dc:format>text/html</dc:format>
 		<dc:language>'.texte_backend($article['lang']).'</dc:language>
 		<dc:creator>'.texte_backend($article['author']).'</dc:creator>
+		<description>'.texte_backend(liens_absolus($article['description'])).'</description>
 	</item>
 ';
 		}
@@ -84,6 +80,48 @@ function affiche_rss_rss($rss, $intro = '') {
 	return array($u, 'Content-Type: text/xml; charset='.$GLOBALS['meta']['charset']);
 }
 
+function affiche_rss_atom($rss, $intro = '') {
+	// entetes
+	$u = '<'.'?xml version="1.0" encoding="'.$GLOBALS['meta']['charset'].'"?'.">\n";
+
+	$u .= '
+<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="'.$intro['language'].'">
+	<title>'.texte_backend($intro['title']).'</title>
+	<id>'.texte_backend(url_absolue($intro['url'])).'</id>
+	<link href="'.texte_backend(url_absolue($intro['url'])).'"/>';
+	if ($intro['description']) $u .= '<subtitle>'.texte_backend($intro['description']).'</subtitle>';
+	$u .= '<link rel="self" type="application/atom+xml" href="'.texte_backend(url_absolue($_SERVER['REQUEST_URI'])).'"/>
+	<updated>'.gmdate("Y-m-d\TH:i:s\Z").'<updated>'; // probleme, <updated> pourrait etre plus precis
+
+	// elements
+	if (is_array($rss)) {
+		usort($rss, 'trier_par_date');
+		foreach ($rss as $article) {
+			$u .= '
+	<entry xml:lang="'.texte_backend($article['lang']).'">
+		<title>'.texte_backend($article['title']).'</title>
+		<id>'.texte_backend(url_absolue($article['url'])).'</id>
+		<link rel="alternate" type="text/html" href="'.texte_backend(url_absolue($article['url'])).'"/>
+		<published>'.date_iso($article['date']).'</published>
+		<updated>'.date_iso($article['date']).'</updated>
+		<author><name>'.texte_backend($article['author']).'</name>';
+			if ($article['email'])
+				$u .= '<email>'.texte_backend($article['email']).'</email>';
+			$u .= '</author>
+		<summary type="html">'.texte_backend(liens_absolus($article['description'])).'</summary>
+	</entry>
+';
+		}
+	}
+
+	// pied
+	$u .= '
+</feed>
+ ';
+
+	return array($u, 'Content-Type: text/xml; charset='.$GLOBALS['meta']['charset']);
+}
+
 function affiche_rss_ical($rss, $intro = '') {
 
 	// entetes
diff --git a/ecrire/inc_filtres.php b/ecrire/inc_filtres.php
index ae373a45b3..776acfc9f3 100644
--- a/ecrire/inc_filtres.php
+++ b/ecrire/inc_filtres.php
@@ -664,14 +664,15 @@ function date_ical($date, $addminutes = 0) {
 		    mktime($heures, $minutes+$addminutes,$secondes,$mois,$jour,$annee));
 }
 
+// date_iso retourne la date au format "RFC 3339" / "ISO 8601"
+// voir http://www.php.net/manual/fr/ref.datetime.php#datetime.constants
 function date_iso($date_heure) {
 	list($annee, $mois, $jour) = recup_date($date_heure);
 	list($heures, $minutes, $secondes) = recup_heure($date_heure);
 	$time = mktime($heures, $minutes, $secondes, $mois, $jour, $annee);
-	return gmdate("Y-m-d\TH:i:s\Z", $time);
+	return gmdate('Y-m-d\TH:i:s\Z', $time);
 }
 
-
 function date_anneemoisjour($d)  {
 	if (!$d) $d = date("Y-m-d");
 	return  substr($d, 0, 4) . substr($d, 5, 2) .substr($d, 8, 2);
diff --git a/ecrire/inc_presentation.php b/ecrire/inc_presentation.php
index e1fcd46665..6babd8f9a0 100644
--- a/ecrire/inc_presentation.php
+++ b/ecrire/inc_presentation.php
@@ -3183,6 +3183,9 @@ function bouton_spip_rss($op, $args, $fmt='rss') {
 			  . "&amp;fmt=ical";
 			$button = 'iCal';
 			break;
+		case 'atom':
+			$button = 'atom';
+			break;
 		case 'rss':
 		default:
 		  
-- 
GitLab