From 801be153986290e0730897ea05f3f89074ea1e0c Mon Sep 17 00:00:00 2001
From: Fil <fil@rezo.net>
Date: Sun, 16 Oct 2005 22:19:37 +0000
Subject: [PATCH] - meilleure gestion des caracteres dans les backend RSS -
 gestion des <enclosure> sans squatter la table spip_documents (cela reste
 possible si on veut en activant une globale) - fonctions variees d'affichage
 des tags

---
 dist/backend.html       |  8 ++---
 dist/site.html          |  5 ++-
 ecrire/inc_filtres.php3 | 45 ++++++++++++++++++++++----
 ecrire/inc_sites.php3   | 71 ++++++++++++++++++++++++++++-------------
 ecrire/inc_version.php3 |  6 ++++
 ecrire/sites.php3       |  1 +
 6 files changed, 103 insertions(+), 33 deletions(-)

diff --git a/dist/backend.html b/dist/backend.html
index 4f30e4ddc0..3f90901998 100644
--- a/dist/backend.html
+++ b/dist/backend.html
@@ -51,11 +51,11 @@
 	syndication plus riche.
 
 ][(#ENV{full}|?{' ',''})
-		<content:encoded>[(#LOGO_ARTICLE|right||html_backend)
-		][&lt;div class='rss_chapo'&gt;(#CHAPO|html_backend)&lt;/div&gt;
-		][&lt;div class='rss_texte'&gt;(#TEXTE|html_backend)&lt;/div&gt;
+		<content:encoded>[(#LOGO_ARTICLE|right||texte_backend)
+		][&lt;div class='rss_chapo'&gt;(#CHAPO|texte_backend)&lt;/div&gt;
+		][&lt;div class='rss_texte'&gt;(#TEXTE|texte_backend)&lt;/div&gt;
 		][&lt;hr /&gt;
-		&lt;div class='rss_notes'&gt;(#NOTES|html_backend)&lt;/div&gt;
+		&lt;div class='rss_notes'&gt;(#NOTES|texte_backend)&lt;/div&gt;
 		]</content:encoded>
 ]
 
diff --git a/dist/site.html b/dist/site.html
index 7b4077df03..440c3fe0ee 100644
--- a/dist/site.html
+++ b/dist/site.html
@@ -72,8 +72,11 @@
 <BOUCLE_articles(SYNDIC_ARTICLES) {id_syndic} {par date}{inverse}{0,10}>
 	<h2><a href="#URL_ARTICLE">#TITRE</a></h2>
 	<div class="detail">
+	[<div style='float:#LANG_RIGHT;'>(#TAGS|afficher_enclosures)</div>]
 	[(#DATE|nom_jour)] [(#DATE|affdate)]
-	[: (#DESCRIPTIF)] [&mdash; <em>(#TAGS)</em>]
+	[: (#DESCRIPTIF)]
+	[&mdash; <em>(#TAGS|afficher_tags{'category'})</em>]
+	[&mdash; <em>(#TAGS|afficher_tags{'tag'})</em>]
 
 	</div>
 	<br />
diff --git a/ecrire/inc_filtres.php3 b/ecrire/inc_filtres.php3
index dc79218ed9..bae957dcc7 100644
--- a/ecrire/inc_filtres.php3
+++ b/ecrire/inc_filtres.php3
@@ -98,9 +98,15 @@ function corriger_caracteres ($texte) {
 }
 
 
-// Nettoyer les backend
+// Encode du HTML pour transmission XML
 function texte_backend($texte) {
 
+	// si on a des liens ou des images, les passer en absolu
+	$texte = liens_absolus($texte);
+
+	// echapper les tags &gt; &lt; et &amp;
+	$texte = preg_replace(',&(gt|lt|amp);,', '&amp;\1;', $texte);
+
 	// importer les &eacute;
 	$texte = filtrer_entites($texte);
 
@@ -127,11 +133,6 @@ function texte_backend($texte) {
 	return $texte;
 }
 
-// Encode du HTML pour transmission XML
-function html_backend($texte) {
-	return texte_backend(str_replace('&', '&amp;', liens_absolus($texte)));
-}
-
 // Enleve le numero des titres numerotes ("1. Titre" -> "Titre")
 function supprimer_numero($texte) {
 	$texte = preg_replace(",^[[:space:]]*[0-9]+[.)".chr(176)."][[:space:]]+,", "", $texte);
@@ -1443,4 +1444,36 @@ function email_valide($adresses) {
 	return $adresse;
 }
 
+// Pour un champ de microformats :
+// afficher les tags
+// ou afficher les enclosures
+function extraire_tags($tags) {
+	if (preg_match_all(',<a([[:space:]][^>]*)?[[:space:]][^>]*>.*</a>,Uims',
+	$tags, $regs, PREG_PATTERN_ORDER))
+		return $regs[0];
+	else
+		return array();
+}
+function afficher_enclosures($tags) {
+	$s = array();
+	foreach (extraire_tags($tags) as $tag) {
+		if (extraire_attribut($tag, 'rel') == 'enclosure'
+		AND $t = urldecode(extraire_attribut($tag, 'href'))) {
+			$s[] = http_href_img($t,
+				'attachment.gif',
+				'height="15" width="15" border="0"',
+				entites_html($t));
+		}
+	}
+	return join('&nbsp;', $s);
+}
+function afficher_tags($tags, $rels='tag,category') {
+	$s = array();
+	foreach (extraire_tags($tags) as $tag) {
+		$rel = extraire_attribut($tag, 'rel');
+		if (strstr(",$rels,", ",$rel,"))
+			$s[] = $tag;
+	}
+	return join(', ', $s);
+}
 ?>
diff --git a/ecrire/inc_sites.php3 b/ecrire/inc_sites.php3
index 45e8523a42..f6ab932da6 100644
--- a/ecrire/inc_sites.php3
+++ b/ecrire/inc_sites.php3
@@ -291,7 +291,15 @@ function analyser_site($url) {
 }
 
 // Inserer les references aux fichiers joints
+// presentes sous la forme microformat <a rel="enclosure">
 function traiter_les_enclosures_rss($enclosures,$id_syndic,$le_lien) {
+	if (!preg_match_all(
+	',<a([[:space:]][^>]*)?[[:space:]]rel=[\'"]enclosure[^>]*>,',
+	$enclosures, $regs, PREG_PATTERN_ORDER))
+		return false;
+	$enclosures = $regs[0];
+
+	include_ecrire('inc_filtres.php3'); # pour extraire_attribut
 
 	list($id_syndic_article) = spip_fetch_array(spip_query(
 	"SELECT id_syndic_article FROM spip_syndic_articles
@@ -303,15 +311,13 @@ function traiter_les_enclosures_rss($enclosures,$id_syndic,$le_lien) {
 
 	// Integrer les enclosures
 	foreach ($enclosures as $enclosure) {
-		// url et type sont obligatoires
-		if (preg_match(',[[:space:]]url=[\'"]?([^\'">]*),i',
-		$enclosure, $enc_regs_url)
-		AND preg_match(',[[:space:]]type=[\'"]?([^\'">]*),i',
-		$enclosure, $enc_regs_type)) {
+		// href et type sont obligatoires
+		if ($enc_regs_url = extraire_attribut($enclosure,'href')
+		AND $enc_regs_type = extraire_attribut($enclosure,'type')) {
 
-			$url = substr(urldecode($enc_regs_url[1]), 0,255);
+			$url = substr(urldecode($enc_regs_url), 0,255);
 			$url = addslashes(abs_url($url, $le_lien));
-			$type = $enc_regs_type[1];
+			$type = $enc_regs_type;
 
 			// Verifier que le content-type nous convient
 			list($id_type) = spip_fetch_array(spip_query("SELECT id_type
@@ -325,12 +331,7 @@ function traiter_les_enclosures_rss($enclosures,$id_syndic,$le_lien) {
 			}
 
 			// length : optionnel (non bloquant)
-			if (preg_match(',[[:space:]]length=[\'"]?([^\'"]*),i',
-			$enclosure, $enc_regs_length)) {
-				$taille = intval($enc_regs_length[1]);
-			} else {
-				$taille = 0;
-			}
+			$taille = intval(extraire_attribut($enclosure, 'length'));
 
 			// Inserer l'enclosure dans la table spip_documents
 			if ($t = spip_fetch_array(spip_query("SELECT id_document FROM
@@ -568,7 +569,8 @@ function analyser_backend($rss) {
 		// Trouver les pieces jointes <enclosure> (RSS)
 		if (preg_match_all(',<enclosure[[:space:]][^<>]+>,i',
 		$item, $matches, PREG_PATTERN_ORDER))
-			$data['enclosures'] = $matches[0];
+			$data['enclosures'] = join(', ',
+				array_map('enclosure2microformat', $matches[0]));
 
 		$articles[] = $data;
 	}
@@ -576,10 +578,24 @@ function analyser_backend($rss) {
 	return $articles;
 }
 
+// Passe un <enclosure url="fichier" length="5588242" type="audio/mpeg"/>
+// au format microformat <a rel="enclosure" href="fichier" ...>fichier</a>
+function enclosure2microformat($e) {
+	include_ecrire('inc_filtres.php3');
+	$url = extraire_attribut($e, 'url');
+	$fichier = basename($url) OR $fichier;
+	$e = preg_replace(',<enclosure[[:space:]],i','<a rel="enclosure" ', $e)
+		. $fichier.'</a>';
+	$e = inserer_attribut($e, 'url', '');
+	$e = inserer_attribut($e, 'href', filtrer_entites($url));
+	$e = str_replace('/>', '>', $e);
+	return $e;
+}
+
 //
 // Insere un article syndique (renvoie true si l'article est nouveau)
 //
-function inserer_article_syndique ($data, $now_id_syndic, $statut, $url_site, $url_syndic, $resume) {
+function inserer_article_syndique ($data, $now_id_syndic, $statut, $url_site, $url_syndic, $resume, $documents) {
 
 	// Creer le lien s'il est nouveau - cle=(id_syndic,url)
 	$le_lien = substr($data['url'], 0,255);
@@ -616,6 +632,12 @@ function inserer_article_syndique ($data, $now_id_syndic, $statut, $url_site, $u
 	$update_date = $data['lastbuilddate'] ?
 		"date = FROM_UNIXTIME(".$data['lastbuilddate'].")," : '';
 
+	// tags & enclosures
+	if ($data['tags'] AND $data['enclosures'])
+		$tags = $data['tags'].', '.$data['enclosures'];
+	else
+		$tags = $data['tags'].$data['enclosures'];
+
 	// Mise a jour du contenu (titre,auteurs,description,date?,source...)
 	spip_query ("UPDATE spip_syndic_articles SET
 	titre='".addslashes($data['titre'])."',
@@ -625,11 +647,12 @@ function inserer_article_syndique ($data, $now_id_syndic, $statut, $url_site, $u
 	lang='".addslashes(substr($data['lang'],0,10))."',
 	source='".addslashes(substr($data['source'],0,255))."',
 	url_source='".addslashes(substr($data['url_source'],0,255))."',
-	tags='".addslashes($data['tags'])."'
+	tags='".addslashes($tags)."'
 	WHERE id_syndic='$now_id_syndic' AND url='".addslashes($le_lien)."'");
 
 	// Inserer les enclosures
-	if ($data['enclosures']) {
+	if ($GLOBALS['integrer_enclosures']
+	AND $data['enclosures']) {
 		traiter_les_enclosures_rss($data['enclosures'],
 			$now_id_syndic, $le_lien);
 	}
@@ -678,7 +701,7 @@ function syndic_a_jour($now_id_syndic, $statut = 'off') {
 		$urls = array();
 		foreach ($articles as $data) {
 			if ($data['url']) {
-				inserer_article_syndique ($data, $now_id_syndic, $moderation, $url_site, $url_syndic, $row['resume']);
+				inserer_article_syndique ($data, $now_id_syndic, $moderation, $url_site, $url_syndic, $row['resume'], $row['documents']);
 				$urls[] = $data['url'];
 			}
 		}
@@ -904,7 +927,7 @@ function afficher_syndic_articles($titre_table, $requete, $afficher_site = false
 
 			$id_syndic_article=$row["id_syndic_article"];
 			$id_syndic=$row["id_syndic"];
-			$titre=typo($row["titre"]);
+			$titre=safehtml($row["titre"]);
 			$url=$row["url"];
 			$date=$row["date"];
 			$lesauteurs=typo($row["lesauteurs"]);
@@ -940,7 +963,7 @@ function afficher_syndic_articles($titre_table, $requete, $afficher_site = false
 			$s.= " ($date)";
 
 			// S'il y a des fichiers joints (enclosures), on les affiche ici
-			if (spip_num_rows($q = spip_query("SELECT docs.* FROM spip_documents AS docs, spip_documents_syndic AS lien WHERE lien.id_syndic_article = $id_syndic_article AND lien.id_document = docs.id_document"))) {
+/*			if (spip_num_rows($q = spip_query("SELECT docs.* FROM spip_documents AS docs, spip_documents_syndic AS lien WHERE lien.id_syndic_article = $id_syndic_article AND lien.id_document = docs.id_document"))) {
 				include_ecrire('inc_documents.php3');
 				while ($t = spip_fetch_array($q)) {
 					$t = $t['fichier'];
@@ -951,15 +974,19 @@ function afficher_syndic_articles($titre_table, $requete, $afficher_site = false
 							entites_html($t));
 				}
 			}
+*/
+			// Tags : d'un cote les enclosures, de l'autre les liens
+			if($e = afficher_enclosures($row['tags']))
+				$s .= ' '.$e;
 
 			// descriptif
 			if (strlen($descriptif) > 0)
 				$s .= "<div class='arial1'>".safehtml($descriptif)."</div>";
 
 			// tags
-			if (strlen($row['tags']))
+			if ($tags = afficher_tags($row['tags']))
 				$s .= "<div style='float:$spip_lang_right;'><em>"
-					. $row['tags'] . '</em></div>';
+					. $tags . '</em></div>';
 
 			// source
 			if (strlen($row['url_source']))
diff --git a/ecrire/inc_version.php3 b/ecrire/inc_version.php3
index e936d8f375..b3ad7b7a65 100644
--- a/ecrire/inc_version.php3
+++ b/ecrire/inc_version.php3
@@ -240,6 +240,12 @@ $test_i18n = false;
 // faut-il souligner en gris, dans articles.php3, les espaces insecables ?
 $activer_revision_nbsp = false;
 
+// Syndication : faut-il integrer les <enclosure> des flux RSS sous
+// forme de documents distants dans la table spip_documents ?
+// (par defaut, on se contente de conserver une trace de ces documents
+// dans le champ #TAGS de l'article syndique).
+$integrer_enclosures = false;
+
 // gestion des extras (voir inc_extra.php3 pour plus d'informations)
 $champs_extra = false;
 $champs_extra_proposes = false;
diff --git a/ecrire/sites.php3 b/ecrire/sites.php3
index bf8d61e0d3..eb43403880 100644
--- a/ecrire/sites.php3
+++ b/ecrire/sites.php3
@@ -429,6 +429,7 @@ if ($syndication == "oui" OR $syndication == "off" OR $syndication == "sus") {
 			));
 
 		// Oublier les vieux liens ?
+		// Depublier les liens qui ne figurent plus ?
 		# appliquer les choix
 		if ($miroir == 'oui' OR $miroir == 'non')
 			spip_query("UPDATE spip_syndic SET miroir='$miroir'
-- 
GitLab